对于机器学习,你几乎肯定想使用sklearn.OneHotEncoder
.对于简单分析等其他任务,您也许可以使用pd.get_dummies
,这样比较方便一点。
注意sklearn.OneHotEncoder
已更新到最新版本,以便接受字符串对于分类变量以及整数。
其关键在于sklearn
编码器创建一个函数persists并且可以然后应用于使用相同分类变量的新数据集,并获得一致的结果.
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"
and "green"
,但除了这些之外,X_test["color"]
有时包含"blue"
.
如果我们使用pd.get_dummies
, X_test
最终会得到一个额外的"color_blue"
列哪个X_train
没有,并且不一致可能会在以后破坏我们的代码,特别是当我们正在喂食时X_test
to an sklearn
我们训练的模型X_train
.
如果我们想在生产中处理这样的数据,我们一次接收一个示例,pd.get_dummies
不会有什么用。
With sklearn.OneHotEncoder
另一方面,一旦我们创建了编码器,我们就可以重用它以每次产生相同的输出,其中列仅用于"red"
and "green"
。我们可以明确地控制它遇到新关卡时会发生什么"blue"
:如果我们认为这是不可能的,那么我们可以告诉它抛出一个错误handle_unknown="error"
;否则我们可以告诉它继续并简单地将红色和绿色列设置为 0,handle_unknown="ignore"
.