首页 > 解决方案 > 在大量分类变量上使用 get_dummies() 和 OneHotEncoding

问题描述

在大多数学术示例中,我们曾经使用get_dummies()or来转换分类特征OneHotEncoding()。假设我想使用 Country 作为特征,并且在数据集中我们有 100 个独特的国家。当我们申请get_dummies()OneHotEncoding()在国家/地区时,我们将获得 100 个列,模型将使用 100 个国家/地区列 + 其他特征进行训练。

可以说,我们已经将该模型部署到生产中,并且我们只收到了 10 个国家/地区。get_dummies()当我们使用or对数据进行预处理时OneHotEncoding(),模型将无法进行预测,因为“训练的特征模型数量与传递的特征不匹配”,因为我们正在传递 10 个国家/地区列 + 其他特征。

你能帮我理解如何处理这种情况吗?如何处理多列中的大量分类变量可以在模型构建中进行预处理。

标签: pythonmachine-learning

解决方案


由于您描述的原因,该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 可以处理不同的标签集测试集。


推荐阅读