在大多数学术示例中,我们都使用get_dummies()
或OneHotEncoding()
来转换分类特征。假设我要使用“国家/地区”作为功能,并且在数据集中我们有100个唯一的国家/地区。当我们在国家/地区应用get_dummies()
或OneHotEncoding()
时,我们将获得100列,并且模型将使用100个国家/地区列和其他功能进行训练。
让我们说,我们已经将此模型部署到生产中,并且我们仅接收了10个国家/地区。当我们使用get_dummies()
或OneHotEncoding()
预处理数据时,模型将无法预测,因为“我们训练了10个国家/地区列和其他国家/地区时,“经过训练的要素模型与传递的要素不匹配”功能。
请帮助我了解如何处理此类情况。如何在模型构建中预处理如何处理多列中的大量分类变量。
答案 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可以处理测试集中的另一组标签。