【问题标题】:Data Preparation for training训练数据准备
【发布时间】:2018-03-29 08:47:52
【问题描述】:

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

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

  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),然后是随后的一个热编码向量。

我的问题是,我如何对单独一行中的每个字符进行预测,模型应该从一行中的字符中学习(对应于某个标签)。有人可以告诉我如何从那里开始吗?

【问题讨论】:

  • 所以你希望每一行都是一个独立于所有其他行的热编码?

标签: machine-learning scikit-learn text-classification data-processing one-hot-encoding


【解决方案1】:

鉴于你的例子,我最终得到了一个像这样的 DataFrame:

    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,其中每一行都包含一个基于所有行的字母的热编码字母数组。

【讨论】:

  • “从您的描述看来,您希望每一行都有自己独立的热编码”。这种方法不正确吗,只要 1 行对应一个标签,我将根据准备好的数据(根据我的方法)对测试数据进行分类,我将提供给模型进行训练?还是我以错误的方式接近它?
  • one_hot_encoded = cat_dat.apply(lambda x: oneHotEncoder.transform(labelEncoder.transform(x[0]).reshape(-1,1)).toarray()], axis=1) 给出一个 ValueError:('X 与拟合期间的形状不同。预期为 26,得到 1。',u'发生在索引 0')。此外,这一行还有一个额外的方括号。
  • 如果没有更多关于你在做什么的背景,我无法说出来。一般来说,如果所有的行都被用作训练数据,它们都应该以相同的方式进行转换,而不是对每个观察都进行唯一的转换。
  • 根据您的第二条评论,列表理解的开始括号丢失了,并且 oneHotEncoder 应该适合 unique_num.reshape(-1,1)。我更新了代码块以反映这一点。
  • 我同意您的评论,即“所有行都将用作训练数据,它们都应该以相同的方式进行转换”。这就是为什么我在所有行中的唯一字母的基础上进行整数(标签)编码,然后进行一次热编码。另一种选择是我定义一个可能是所有小写字符的字母,然后相应地进行整数编码。
猜你喜欢
  • 2019-09-30
  • 2015-12-16
  • 2021-12-26
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 2020-04-05
  • 2011-01-05
相关资源
最近更新 更多