在 numpy 数组上应用 onehotencoder

Posted

技术标签:

【中文标题】在 numpy 数组上应用 onehotencoder【英文标题】:applying onehotencoder on numpy array 【发布时间】:2018-10-31 19:45:51 【问题描述】:

我在 numpy 数组上应用 OneHotEncoder。

这是代码

print X.shape, test_data.shape #gives 4100, 15) (410, 15)
onehotencoder_1 = OneHotEncoder(categorical_features = [0, 3, 4, 5, 6, 8, 9, 11, 12])
X = onehotencoder_1.fit_transform(X).toarray()
onehotencoder_2 = OneHotEncoder(categorical_features = [0, 3, 4, 5, 6, 8, 9, 11, 12])
test_data = onehotencoder_2.fit_transform(test_data).toarray()

print X.shape, test_data.shape #gives (4100, 46) (410, 43)

Xtest_data 都是 <type 'numpy.ndarray'>

X 是我的训练集,test_data 是我的测试集。

为什么没有。 Xtest_data 的列数不同。在应用 onehotencoder 后,它们应该是 4643

我正在对特定属性应用 OnehotEncoder,因为它们在 Xtest_data 中都是分类的

有人能指出这里有什么问题吗?

【问题讨论】:

【参考方案1】:

不要在 test_data 上使用新的 OneHotEncoder,使用第一个,并且只在其上使用 transform()。这样做:

test_data = onehotencoder_1.transform(test_data).toarray()

切勿在测试数据上使用fit()(或fit_transform())。

不同的列数是完全可能的,因为测试数据可能不包含训练数据中存在的某些类别。因此,当您使用新的 OneHotEncoder 并在其上调用fit()(或fit_transform())时,它只会了解test_data 中存在的类别。所以列之间会有差异。

【讨论】:

我想你的意思是说这样做test_data = onehotencoder_1.transform(test_data).toarray().....对吗?而你不小心写了这个test_data = onehotencoder_1.fit_transform(test_data).toarray() @Guru 是的。对不起,这是一个复制粘贴错字。现已更正。 谢谢@Vivek。您是否还可以阐明如何在使用 OnehotEncoder 时摆脱虚拟变量陷阱。我在很多地方都读过它,人们建议放在专栏上。我如何在此处删除列以及要删除哪一列? @Guru 在 OneHotEncoder 中做起来并不简单。您必须为此编写一个自定义类。对于categorical_features 中定义的每个类别,都会有一列要删除。您可以使用pandas.get_dummies(),但这不适用于训练和测试拆分。 感谢您的意见。正如你提到的For each category defined in categorical_features, there will be a column to remove 哪一栏?如何决定?我可以编写一个自定义类。任何解释相同的资源都会非常有帮助。谢谢

以上是关于在 numpy 数组上应用 onehotencoder的主要内容,如果未能解决你的问题,请参考以下文章

sklearn.preprocessing.OneHotEncoder

python编写自定义lambda函数使用numpy中的np.vectorize函数在numpy数组中的每个元素上施加应用自定义lambda函数生成新的numpy数组

Numpy isnan() 在浮点数组上失败(来自 pandas 数据框应用)

使用 OneHotEncoder 出现错误“预期的二维数组,而是得到一维数组”

如何使用 OneHotEncoder 和 Pipeline 进行新的预测?

如何在 numpy 数组上定义一个使用数组索引查找字典的函数?