在 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)
X
和 test_data
都是 <type 'numpy.ndarray'>
X
是我的训练集,test_data
是我的测试集。
为什么没有。 X
和 test_data
的列数不同。在应用 onehotencoder 后,它们应该是 46 或 43。
我正在对特定属性应用 OnehotEncoder,因为它们在 X
和 test_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 出现错误“预期的二维数组,而是得到一维数组”