熊猫的get_dummies与Sklearn的OneHotEncoder()::优缺点是什么?
machine-learning
pandas
python
scikit-learn
5
0

我正在学习将机器学习分类器将分类变量转换为数字的不同方法。我遇到了pd.get_dummies方法和sklearn.preprocessing.OneHotEncoder() ,我想看看它们在性能和用法上有何不同。

我在https://xgdgsc.wordpress.com/2015/03/20/note-on-using-onehotencoder-in-scikit-learn-to-work-on-categorical-上找到了有关如何使用OneHotEncoder()的教程功能/,因为sklearn文档对该功能的帮助不是sklearn 。我有一种感觉,我做得不正确...但是

有人可以解释在sklearn.preprocessing.OneHotEncoder()上使用pd.dummies利弊吗,反之亦然?我知道OneHotEncoder()为您提供了一个稀疏矩阵,但OneHotEncoder() ,我不确定它是如何使用的以及与pandas方法相比有什么好处。我使用效率低下吗?

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
sns.set()

%matplotlib inline

#Iris Plot
iris = load_iris()
n_samples, m_features = iris.data.shape

#Load Data
X, y = iris.data, iris.target
D_target_dummy = dict(zip(np.arange(iris.target_names.shape[0]), iris.target_names))

DF_data = pd.DataFrame(X,columns=iris.feature_names)
DF_data["target"] = pd.Series(y).map(D_target_dummy)
#sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \
#0                  5.1               3.5                1.4               0.2   
#1                  4.9               3.0                1.4               0.2   
#2                  4.7               3.2                1.3               0.2   
#3                  4.6               3.1                1.5               0.2   
#4                  5.0               3.6                1.4               0.2   
#5                  5.4               3.9                1.7               0.4   

DF_dummies = pd.get_dummies(DF_data["target"])
#setosa  versicolor  virginica
#0         1           0          0
#1         1           0          0
#2         1           0          0
#3         1           0          0
#4         1           0          0
#5         1           0          0

from sklearn.preprocessing import OneHotEncoder, LabelEncoder
def f1(DF_data):
    Enc_ohe, Enc_label = OneHotEncoder(), LabelEncoder()
    DF_data["Dummies"] = Enc_label.fit_transform(DF_data["target"])
    DF_dummies2 = pd.DataFrame(Enc_ohe.fit_transform(DF_data[["Dummies"]]).todense(), columns = Enc_label.classes_)
    return(DF_dummies2)

%timeit pd.get_dummies(DF_data["target"])
#1000 loops, best of 3: 777 µs per loop

%timeit f1(DF_data)
#100 loops, best of 3: 2.91 ms per loop
参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

为什么不只是缓存或将列从结果get_dummies中保存为变量col_list,然后使用pd.reindex来对齐火车与测试数据集...。例如:

df = pd.get_dummies(data)
col_list = df.columns.tolist()

new_df = pd.get_dummies(new_data)
new_df = new_df.reindex(columns=col_list).fillna(0.00) 
收藏
评论

OneHotEncoder无法直接处理字符串值。如果名义特征是字符串,则需要首先将它们映射为整数。

pandas.get_dummies则相反。默认情况下,除非指定了列,否则它仅将字符串列转换为一键表示。

收藏
评论

对于机器学习,您几乎肯定要使用sklearn.OneHotEncoder对于其他任务(例如简单分析),您可以使用pd.get_dummies ,这更加方便。

请注意, sklearn.OneHotEncoder已更新为最新版本,因此它确实接受分类变量的字符串以及整数。

关键是sklearn编码器创建了一个持久的函数,然后可以将其应用于使用相同类别变量且结果一致的新数据集

from sklearn.preprocessing import OneHotEncoder

# Create the encoder.
encoder = OneHotEncoder(handle_unknown="ignore")
encoder.fit(X_train)    # Assume for simplicity all features are categorical.

# Apply the encoder.
X_train = encoder.transform(X_train)
X_test = encoder.transform(X_test)

请注意,我们如何将通过X_train创建的相同编码器应用于新数据集X_test

试想,如果发生了什么X_test包含不同水平比X_train它的变量之一。例如,假设X_train["color"]仅包含"red""green" ,但是除了这些之外, X_test["color"]有时还包含"blue"

如果我们使用pd.get_dummies ,则X_test将以X_train没有的另外一个"color_blue"X_train ,并且不一致之处可能会在以后破坏我们的代码,特别是如果我们将X_test馈送到我们训练的sklearn模型上时X_train

而且,如果我们要在生产中处理这样的数据,而我们一次只收到一个示例,则不会使用pd.get_dummies

另一方面,使用sklearn.OneHotEncoder ,一旦创建了编码器,我们就可以重复使用它来每次产生相同的输出,并且只针对"red""green" 。并且我们可以显式控制遇到新级别"blue"时发生的情况:如果我们认为这是不可能的,则可以使用handle_unknown="error"告诉它引发handle_unknown="error" ;否则,我们可以告诉它继续,只需使用handle_unknown="ignore"将红色和绿色列设置为0。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号