如何为机器学习方法编码数据?

时间:2018-05-20 02:32:54

标签: python python-3.x machine-learning scikit-learn one-hot-encoding

我想用机器学习方法编码输入字符串。让我们假设我的列车数据以这种方式显示:

  score     text
    1   show photos
    1   show my photos
    2   who are you?

此刻我做了类似的事情:

for index, row in train_set.iterrows():

    list2 = []

    list2 = list(row.text.lower())

    for n, key in enumerate(list2):

        if key in dictionary:

            list2[n] = dictionary[key]

        else:

            dictionary[key] = i
            list2[n] = i
            i += 1

    train_set.set_value(index,'text', list2)

作为这个示例数据的结果我得到:

  score                 text
    1    [0, 1, 2, 3, 4, 5, 1, 2, 6, 2, 0]
    1    [0, 1, 2, 3, 4, 7, 8, 4, 5, 1, 2, 6, 2, 0]
    2    [3, 1, 2, 4, 10, 13, 9, 4, 8, 2, 19, 21]

正如您所知,例如对于神经网络而言,使用此值并不是一种正确的方法,因此在我看来,在这种情况下,一个热编码将是最佳解决方案。我想知道在text数据框的test_set列以及text数据框中的train_set列中转换这些值的最有效方法是什么,看起来像test_set但显然没有预期值的第一列。我认为在这两种情况下,在使用一个热编码之后我应该具有相同的列大小,并且相同的索引和行应该对应于test_settrain_set数据帧中的相同字符。我希望你明白我的意思。如果没有,请告诉我。我将尝试以更清晰的方式解释它。任何想法我该怎么做?

1 个答案:

答案 0 :(得分:1)

解决方案是使用自定义Prepper类对您的训练集进行编码。随着训练集的编码,Prepper类对象记录(单词,单热索引)对应。

然后,您将使用相同的Prepper对象对您的测试集进行编码。

Prepper类的粗略骷髅将是:

from collections import defaultdict

class Prepper(object):

   def __init__(self):
      self.vocab = defaultdict(lambda : len(self.vocab))

   def encode_train_word(self, train_word):
      return self.vocab[train_word]

   def encode_test_word(self, test_word):
      if test_word in self.vocab:
         return self.vocab[test_words]
      else:
         return -1 # index for unknown token

如果我必须重新获取您的代码段,它将如下所示:

prepper = Prepper()

for index, row in train_set.iterrows():
   list2 = list(row.text.lower())
   encoded_list_2 = [prepper.encode_train_word(word) for word in list2]

   train_set.set_value(index, 'text', encoded_list_2)

## and for the test set

for index, row in test_set.iterrows():
   list2 = list(row.text.lower())
   encoded_list_2 = [prepper.encode_test_word(word) for word in list2]

   test_set.set_value(index, 'text', encoded_list_2)