Как я могу кодировать свои данные для методов машинного обучения? - PullRequest
0 голосов
/ 20 мая 2018

Я хотел бы закодировать мои входные буквы строк для методов машинного обучения.Давайте предположим, что мои данные поезда выглядят так:

  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 dataframe, а также в столбец text в train_set dataframe, который выглядит как test_set, но, очевидно, не имеет первого столбца с ожидаемымценности.Я думаю, что в обоих случаях у меня должен быть одинаковый размер столбцов после использования одного горячего кодирования, и один и тот же индекс и строка должны соответствовать одному и тому же символу в обоих test_set и train_set данных.Я надеюсь, что вы понимаете, о чем я.Если нет, пожалуйста, дайте мне знать.Я постараюсь объяснить это более четко.Есть идеи, как мне это сделать?

1 Ответ

0 голосов
/ 20 мая 2018

Решением было бы иметь пользовательский класс 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)
...