在大量分类变量上使用get_dummies()和OneHotEncoding

时间:2019-03-13 06:23:22

标签: python machine-learning

在大多数学术示例中,我们都使用get_dummies()OneHotEncoding()来转换分类特征。假设我要使用“国家/地区”作为功能,并且在数据集中我们有100个唯一的国家/地区。当我们在国家/地区应用get_dummies()OneHotEncoding()时,我们将获得100列,并且模型将使用100个国家/地区列和其他功能进行训练。

让我们说,我们已经将此模型部署到生产中,并且我们仅接收了10个国家/地区。当我们使用get_dummies()OneHotEncoding()预处理数据时,模型将无法预测,因为“我们训练了10个国家/地区列和其他国家/地区时,“经过训练的要素模型与传递的要素不匹配”功能。

请帮助我了解如何处理此类情况。如何在模型构建中预处理如何处理多列中的大量分类变量。

1 个答案:

答案 0 :(得分:1)

pandas.get_dummies()函数实际上不应在部署中使用,因为您所描述的原因。 scikit-learn的OneHotEncoder可以很好地处理这种情况:

from sklearn import preprocessing
import pandas as pd

ohe = preprocessing.OneHotEncoder(handle_unknown='ignore')
X_train = pd.DataFrame({'country':['USA', 'Russia', 'China', 'Spain']})
X_test = pd.DataFrame({'country':['Russia', 'Ukraine', 'China', 'Russia']})
ohe.fit(X_train) 
ohe.transform(X_test).toarray()

array([[0., 1., 0., 0.],
       [0., 0., 0., 0.],
       [1., 0., 0., 0.],
       [0., 1., 0., 0.]])

(在这里,我设置了handle_unknown='ignore',以便新标签('Ukraine')被编码为全零。如果设置了handle_unknown='error'(默认值),则新标签将引发错误。 )因此,OneHotEncoder可以处理测试集中的另一组标签。