【问题标题】:Encoding categorical data issue编码分类数据问题
【发布时间】:2022-01-16 12:47:28
【问题描述】:

我正在做一个房价回归模型,我从 Kaggle 获得了 data,当我尝试将分类变量转换为虚拟变量时,我得到了一些不寻常的训练数据,我得到了 (1460, 270) 的形状

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [1,4,5,6,7,8,9,10,11,12,13,14,
19,20,21,22,23,25,26,27,28,29,30,31,
33,37,38,39,40,51,53,55,57,60,61,62,72,73
])], remainder='passthrough',sparse_threshold=0)
X = np.array(ct.fit_transform(X))

X.shape
(1460, 270)

当我对测试数据做同样的事情时,我得到了(1459, 254)的形状

ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [1,4,5,6,7,8,9,10,11,12,13,14,
19,20,21,22,23,25,26,27,28,29,30,31,
33,37,38,39,40,51,53,55,57,60,61,62,72,73
])], remainder='passthrough',sparse_threshold=0)
X_actual = np.array(ct.fit_transform(X_actual))

X_actual.shape
(1459, 254)

为什么在为训练数据和测试数据转换相同的分类变量后形状不同。

请注意,在转换分类变量之前,两个数据具有相同的形状是没有问题的;这个问题只发生在我为两个数据集转换相同的分类变量时,我得到了不同的形状。

我做了一个解决方案,但我不太喜欢它,我将X_actual.shape调整为(1459,270),算法运行良好,但我认为它对算法质量的影响太大。而且,如果在转换两个不同数据集的分类变量时是正常的,我怎样才能使两个数据集具有相同的维度?

【问题讨论】:

  • 您能否正确格式化代码,以便我们可以使用更多信息?
  • 欢迎来到 SO;请相应地format*你的代码sn-ps

标签: python machine-learning scikit-learn encoding


【解决方案1】:

您再次使用fit_transformOneHotEncoder 重新拟合到测试数据X_actual,因此X_actual 的类别似乎更少(可能还有新类别)。尝试使用ct.transform(X_actual) 来保留在训练数据X 中找到的所有类别,从而保留特征形状。


请注意,从当前版本的 scikit-learn 1.0.2 开始,OneHotEncoder 使用默认参数 handle_unknown='error' 在测试数据中遇到新类别时会引发错误。设置handle_unknown='ignore' 忽略错误。

【讨论】:

  • 非常感谢,ct。 transform(X_actual) 工作正常,现在 X_test 和 X_actual 的形状相同,算法结果有了很大的改进。
最近更新 更多