使用scikit的onehotencoder对向量进行虚拟变量编码

假设我有一个整数向量,每个整数对应一个类别:

A = [1, 2, 2, 3, 3, 1, 2, 4, 4, 1]

我知道有多少个类别。这个向量是我X数据集中的一列,最终将用于逻辑回归模型中。

是否可以使用scikit-learn的onehotencoder函数来得到类似于下面的结果:

0 0 0 1(当为1时)
0 0 1 0(当为2时)
0 1 0 0(当为3时)
1 0 0 0(当为其他时)

或者更好的结果:

0 0 0
0 0 1
0 1 0
1 0 0

当我尝试将这样的向量传递给onehotencoder时,我得到了这个错误:need more than 1 value to unpack

此外:我猜如果我有’NULL’记录,我应该首先将它们转换成一个数字:有没有一种快速的方法来做到这一点,比如A(find(A=='NULL'))=123

感谢您的帮助。@人名


回答:

OneHotEncoder的输入需要是二维的,而不是一维的(它期望是一组样本)。

>>> X = [[1, 2, 2, 3, 3, 1, 2, 4, 4, 1]]

假设你的分类特征都可以取四个值:

>>> n_values = np.repeat(4, len(X[0]))>>> n_valuesarray([4, 4, 4, 4, 4, 4, 4, 4, 4, 4])

然后OneHotEncoder就可以正常工作了:

>>> oh = OneHotEncoder(n_values=n_values)>>> Xt = oh.fit_transform(X)>>> Xt.toarray()array([[ 0.,  1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  0.,         0.,  0.,  1.,  0.,  0.,  0.,  1.,  0.,  1.,  0.,  0.,  0.,  0.,         1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.,  1.,  0.,         0.]])>>> Xt.shape(1, 40)

它为每个输入变量产生了一个多余的虚拟变量,这有点浪费。我不知道你说的NULL是什么意思,因为我不知道你的数据是什么样的。你可能需要为此打开一个单独的问题。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注