1

我正在尝试通过创建一个字符文本的热编码来准备数据文件,我可以稍后使用这些编码来训练我的模型进行分类。我有一个由字符行组成的训练数据文件,我最初正在做它们的整数编码,然后是一个热门编码。培训数据准备

例如这是数据文件的外观:

  1. afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj
  2. fgtfafadargggagagagagagavcacacacarewrtgwgjfjqiufqfjfqnmfhbqvcqvfqfqafaf
  3. fqiuhqqhfqfqfihhhhqeqrqtqpocckfmafaflkkljlfabadakdpodqpqrqjdmcoqeijfqfjqfjoqfjoqgtggsgsgqr

这是怎么了接近它:

import pandas as pd 
from sklearn import preprocessing 

categorical_data = pd.read_csv('abc.txt', sep="\n", header=None) 
labelEncoder = preprocessing.LabelEncoder() 
X = categorical_data.apply(labelEncoder.fit_transform) 
print("Afer label encoder") 
print(X.head()) 

oneHotEncoder = preprocessing.OneHotEncoder() 
oneHotEncoder.fit(X) 

onehotlabels = oneHotEncoder.transform(X).toarray() 
print("Shape after one hot encoding:", onehotlabels.shape) 

print(onehotlabels) 

我得到每行的整数编码(在我的情况下是0,1,2),然后是后续的一个热编码向量。

我的问题是,对于预测,我如何针对每行中的每个字符执行此操作,模型应该从一行(对应于某个标签)中的字符中学习。有人能给我一些关于如何从那里出发的见解吗?

+0

所以你想要每一行都是一个独立于其他所有编码的热门编码? – Grr

回答

1

鉴于您的例子我结束了,像这样一个数据帧:

0 
0 0 
1 1 
2 2 

从你的描述听起来像你想的每一行都有自己的独立的热码。所以,让我们在第一线的外观1.

afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj 

你得到我上面包括数据帧的原因是该行正变得读入数据帧,然后传递给labelEncoderoneHotEncoder作为一个单一的价值,而不是63个值的数组(字符串的长度)。

你真正想要做的是通过labelEncoder大小63

data = np.array([let for let in categorical_data[0][0]]) 
X = labelEncoder.fit_transform(data) 
oneHotEncoder.fit(X.reshape(-1,1)) 
row_1_labels = oneHotEncoder.transform(X.reshape(-1,1)).toarray() 
row_1_labels 

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

的数组你可以重复这一过程,每一行,以获得独立的一个热编码。像这样:

one_hot_encodings = categorical_data.apply(lambda x: [oneHotEncoder.fit_transform(labelEncoder.fit_transform(np.array([let for let in x[0]])).reshape(-1,1)).toarray()], axis=1) 
one_hot_encodings 

                0 
0 [[1.0, 0.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.... 
1 [[0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,... 
2 [[0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,... 

如果你想基于所有行你只需先适应labelEncoder到所有不同的字母,然后做转换的每一行中的值的行是一个炎热的编码。像这样:

unique_letters = np.unique(np.array([let for row in categorical_data.values for let in row[0]])) 
labelEncoder.fit(unique_letters) 
unique_nums = labelEncoder.transform(unique_letters) 
oneHotEncoder.fit(unique_nums.reshape(-1,1)) 
cat_dat = categorical_data.apply(lambda x: [np.array([let for let in x[0]])], axis=1) 
one_hot_encoded = cat_dat.apply(lambda x: [oneHotEncoder.transform(labelEncoder.transform(x[0]).reshape(-1,1)).toarray()], axis=1) 
one_hot_encoded 

                0 
0 [[1.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, 1.0, 0.0, 0.0, 0.0,... 
2 [[0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,... 

这将返回一个DataFrame,每行包含一个基于所有行的字母的热编码字母数组。

+0

“从你的描述来看,你听起来像是你想要每一行都有自己独立的一个热门编码”。这种方法是不是正确,只要1条线对应于一个标签,我将根据准备好的数据(按照我的方法)对测试数据进行分类,以便将其提供给模型进行培训?或者我以错误的方式接近它? – NOOB

+0

one_hot_encoded = cat_dat.apply(lambda x:oneHotEncoder。transform(labelEncoder.transform(x [0])。reshape(-1,1))。toarray()],axis = 1)给出一个ValueError:('X的形状与拟合时不同,预期26,得到1。 ',发生在索引0')。另外,这一行还有一个额外的方括号。 – NOOB

+0

如果没有更多关于你在做什么的背景,我将无法说出。一般来说,如果所有的线都被用作训练数据,那么它们都应该以相同的方式进行转换,而不是对每个观察进行唯一的转换。 – Grr