machine-learning - 训练数据准备

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

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

例如数据文件如下所示:

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

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

最佳答案

鉴于你的示例,我最终得到一个像这样的 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,其中每一行都包含基于所有行字母的一个热编码字母数组。

关于machine-learning - 训练数据准备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46793895/

相关文章:

amazon-web-services - 适用于tensorflow和pymysql的Sagemaker内核

javascript - 是否可以在 ml5.js 中隐藏视频但保留手部姿势点?

python - 从 keras 生成器获取真实标签

r - 使用朴素贝叶斯和 R 进行多类分类

python - 如何在管道中重新采样文本(不平衡组)?

machine-learning - WEKA:属性尺度问题

machine-learning - 小模型来自Google新闻Word2Vec模型

python - 内部错误 : GPU sync failed in Google Colab

python - python中的SVM(支持向量机)总是给出相同的预测

machine-learning - 朴素贝叶斯有偏见吗?