将sklearn与多个one-hot编码列一起使用



我一直在尝试解决多个一热编码nparray的问题。

我使用的是一个数据帧,其中每个字符都是用np_array表示的onehot编码。

例如,X特性应该包含字符的所有编码,y是单个标签。

当我只对每个样本的第一个字符进行OHE编码,转换为列表而不是nparray时,我的sklearn-fit函数就可以工作了。这是我用来实现这一点的代码的一个例子:

X = df[['char_0']]
X_testing = X.values
empty_list = list()
for entry in X_testing:
empty_list.append(entry[0].tolist())

现在,这将为所有示例返回char_0的OHE np数组的单个列表:

[ [example0_char0] , [example1_char0] , ... , [examplen_char0] ]

这就是X应该是什么样子:

index, char_0, char_1, ... , char_n
0, [encoding_char0], [encoding_char1], ... , [encoding_charn]
1, [encoding_char0], [encoding_char1], ... , [encoding_charn]
etc.

其中,每个encoding_char保存一个长度为38OHE的numpy数组。

这就是y应该是什么样子:

index, label
0, 1
1, 1
etc.

我的y还好,但这就是我的X的样子:

array([[ array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]),
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]),
...,

我很困惑,不知道该怎么办:

  • 我应该将每个功能编码转换为列表吗(或者它们应该保留为np数组)
  • 我可以同时对多个编码进行算法训练吗?或者只能放在一个OHE上,而不能同时放在所有字符上

我想说,你可以给出Feature1、Feature2、Feature3,其中每个功能都是一个完整的OHE阵列。然而,每次我尝试它时,我都会得到一个类似的错误:

  • ValueError:使用序列设置数组元素
  • ValueError:找到dim为3的数组。预计估算器<=2

我终于找到了自己问题的解决方案。我通过以下操作修复了它。

X = df.loc[:, 'char_0':'char_n']
X = X.values
X = np.array(X)
print(X.shape)
It turned out it was an array of dimensions:
(nsamples * ncolumns * OHElength)
nsamples, nx, ny = X.shape
X = X.reshape((nsamples,nx*ny))

因此,这只需返回一个维度为(nsamples*ncols列表乘以一个热编码中的字符数)的df。

Sklearn(和Tensorflow)显然知道如何应对这种情况。

最新更新