我一直在尝试解决多个一热编码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)显然知道如何应对这种情况。