Machine learning 培训数据准备
我试图通过创建一个字符文本的热编码来准备数据文件,以后可以使用它来训练分类模型。我有一个训练数据文件,它由几行字符组成,我首先对它们进行整数编码,然后是一个热编码 e、 g.以下是数据文件的外观:Machine learning 培训数据准备,machine-learning,scikit-learn,text-classification,data-processing,one-hot-encoding,Machine Learning,Scikit Learn,Text Classification,Data Processing,One Hot Encoding,我试图通过创建一个字符文本的热编码来准备数据文件,以后可以使用它来训练分类模型。我有一个训练数据文件,它由几行字符组成,我首先对它们进行整数编码,然后是一个热编码 e、 g.以下是数据文件的外观: AFAFALKJFALKFALJALFJALFJALFJAFAJFAJFLAJFLAJFAJFLAJFAJFLAJFJALFJALJFAJ FGTFafadargggagagagagagagagagagavcacarewtgwgjfjqiufqfjfqnmfhbqvqvqffaf FQIUHQQHFQ
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
0 0
1 1
2 2
根据您的描述,听起来好像您希望每一行都有自己的独立热编码。让我们先看看第1行
afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj
获取上面包含的数据帧I的原因是,此行被读入数据帧,然后作为单个值传递给labelEncoder
和oneHotEncoder
,而不是63个值(字符串长度)的数组
您真正想要做的是将大小为63的数组传递给labelEncoder
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,...
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,...
如果希望根据在所有行中找到的值对行进行热编码,则只需首先将labelEncoder
匹配到所有唯一字母,然后对每行进行转换。像这样:
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,...
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,...
这将返回一个数据帧,其中每一行包含一个基于所有行的字母的热编码字母数组。那么您希望每一行都是一个独立于所有其他行的热编码吗?“从您的描述中,听起来好像您希望每一行都有自己独立的一个热编码”。如果一行对应于一个标签,我将根据准备好的数据(按照我的方法)对测试数据进行分类,然后将这些数据提供给模型进行培训,那么这种方法是否正确?或者我是以错误的方式接近它吗?one_hot_encoded=cat_dat.apply(lambda x:onehotcoder.transform(labelEncoder.transform(x[0]).reformate(-1,1)).toarray()],axis=1)给出一个值错误:('x与拟合期间的形状不同。预期为26,得到1',u'出现在索引0')。另外,这一行中还有一个额外的方括号。如果没有更多关于你正在做什么的上下文,我将无法说。通常,如果所有行都要用作训练数据,则它们都应该以相同的方式进行转换,而不是针对每个观察值进行唯一转换。根据您的第二条评论,列表理解的开始括号缺失,并且oneHotEncoder应该适合于唯一的数值整形(-1,1)。我更新了代码块以反映这一点。我同意您的评论,即“所有行都将用作训练数据,它们都应以相同的方式进行转换”。这就是为什么我要在所有行中唯一字母的基础上进行整数(标签)编码,然后进行一个热编码。另一种选择是,我定义一个字母表,其中可能包含所有小写字符,然后相应地进行整数编码。