培训数据准备

时间:2017-10-17 15:32:57

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

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

e.g。这就是数据文件的外观:

  1. afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj
  2. fgtfafadargggagagagagagavcacacacarewrtgwgjfjqiufqfjfqnmfhbqvcqvfqfqafaf
  3. fqiuhqqhfqfqfihhhhqeqrqtqpocckfmafaflkkljlfabadakdpodqpqrqjdmcoqeijfqfjqfjoqfjoqgtggsgsgqr
  4. 这就是我接近它的方式:

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

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

1 个答案:

答案 0 :(得分:1)

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

    0
0   0
1   1
2   2

根据您的描述,您似乎希望每一行都有自己独立的热编码。所以我们先来看看第1行。

afafalkjfalkfalfjalfjalfjafajfaflajflajflajfajflajflajfjaljfafj

您获得我上面包含的数据帧的原因是此行已被读入DataFrame,然后作为单个值传递给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,每行包含一个基于所有行的字母的热编码字母数组。