Machine learning 培训数据准备

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

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

e、 g.以下是数据文件的外观:

  • AFAFALKJFALKFALJALFJALFJALFJAFAJFAJFLAJFLAJFAJFLAJFAJFLAJFJALFJALJFAJ
  • FGTFafadargggagagagagagagagagagavcacarewtgwgjfjqiufqfjfqnmfhbqvqvqffaf
  • FQIUHQQHFQFQFIHHHQEQQQQPOCKLJLFABADAKDPODQPQRQJDMCOQEJFQFJQFJOQFJOQFQGTGGSGQR
  • 这就是我的做法:

    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)。我更新了代码块以反映这一点。我同意您的评论,即“所有行都将用作训练数据,它们都应以相同的方式进行转换”。这就是为什么我要在所有行中唯一字母的基础上进行整数(标签)编码,然后进行一个热编码。另一种选择是,我定义一个字母表,其中可能包含所有小写字符,然后相应地进行整数编码。