Как работать с массивом строковых функций в традиционном машинном обучении? - PullRequest
1 голос
/ 16 июня 2020

Проблема

Допустим, у нас есть фрейм данных, который выглядит следующим образом:

age  job         friends                                    label
23   'engineer'  ['World of Warcraft', 'Netflix', '9gag']   1
35   'manager'   NULL                                       0
...

Если мы заинтересованы в обучении классификатора, который предсказывает метку , используя age , job и friends в качестве функций, как бы мы go преобразовали функции в числовой массив, который можно было бы ввести в модель?

  • Возраст довольно прост, поскольку он уже числовой.
  • Задание может быть хешировано / проиндексировано, поскольку это категориальная переменная.
  • Друзья - это список категориальных переменных. Как бы мне go представить эту функцию?

Подходит:

Ха sh каждый элемент списка. Используя пример фрейма данных, предположим, что наша функция хеширования имеет следующее отображение:

NULL                -> 0
engineer            -> 42069
World of Warcraft   -> 9001
Netflix             -> 14
9gag                -> 9
manager             -> 250
 

Предположим далее, что максимальная длина друзей равна 5. Все, что короче, заполняется нулями с правой стороны. Если размер друзей больше 5, то выбираются первые 5 элементов.

Подход 1: Ha sh и стек

фрейм данных после преобразования функций будет выглядеть следующим образом:

feature                             label
[23, 42069, 9001, 14, 9, 0, 0]      1
[35, 250,   0,    0,  0, 0, 0]      0

Ограничения

Учтите следующее:

age  job           friends                                        label
23   'engineer'    ['World of Warcraft', 'Netflix', '9gag']       1
35   'manager'      NULL                                          0
26   'engineer'    ['Netflix', '9gag', 'World of Warcraft']       1
...

Сравните характеристики первой и третьей записи:

feature                             label
[23, 42069, 9001, 14, 9, 0, 0]      1
[35, 250,   0,    0,  0, 0, 0]      0
[26, 42069, 14,    9, 9001, 0]      1

Обе записи имеют одинаковый набор друзей, но они упорядочены по-разному, что приводит к другому хешированию функций, хотя они должны быть одинаковыми.

Подход 2: Ha sh, Порядок и стек

Для устранения ограничения Подход 1, просто закажите хэши из функции друзей . Это приведет к следующему преобразованию функции (в порядке убывания):

feature                             label
[23, 42069, 9001, 14, 9, 0, 0]      1
[35, 250,   0,    0,  0, 0, 0]      0
[26, 42069, 9001, 14, 9, 0, 0]      1

Этот подход также имеет ограничение. Рассмотрим следующее:

age  job           friends                                        label
23   'engineer'    ['World of Warcraft', 'Netflix', '9gag']       1
35   'manager'      NULL                                          0
26   'engineer'    ['Netflix', '9gag', 'World of Warcraft']       1
42   'manager'     ['Netflix', '9gag']                            1
...

Применяя преобразование функций с упорядочиванием, мы получаем:

row  feature                             label
1    [23, 42069, 9001, 14, 9, 0, 0]      1
2    [35, 250,   0,    0,  0, 0, 0]      0
3    [26, 42069, 9001, 14, 9, 0, 0]      1
4    [44, 250, 14, 9, 0, 0, 0]           1

В чем проблема с вышеуказанными функциями? Что ж, хэши для Netflix и 9gag в строках 1 и 3 имеют одинаковый индекс в массиве, но не в строке 4. Это испортит обучение.

Подход 3: преобразование массива в столбцы

Что, если мы преобразуем друзей в набор из 5 столбцов и обработаем каждый из полученных столбцов так же, как мы имеем дело с любой категориальной переменной?

Что ж, давайте предположим, что друзья словарный запас большой (> 100к). Тогда было бы безумием go и создание> 100 тыс. Столбцов, где каждый столбец отвечает за sh соответствующего элемента словаря.

Подход 4: One-Hot-Encoding, а затем Sum

Как насчет этого? Преобразуйте каждый ha sh в один горячий вектор и сложите все эти векторы.

В этом случае объект в первой строке, например, будет выглядеть так:

[23, 42069, 0<sup>1x8</sup>, 1, 0<sup>1x4</sup>, 1, 0<sup>1x8986</sup>, 1, 0<sup>1x(max_hash_size-8987)</sup>]

Где 0 1x8 обозначает строку из 8 нулей.

Проблема с этим подходом в том, что эти векторы будут очень большими и разреженными.

Подход 5: Используйте встраивание Layer and 1D-Conv

При таком подходе мы передаем каждое слово в массиве friends слою внедрения, а затем сворачиваем. Аналогично примеру Keras IMDB: https://keras.io/examples/imdb_cnn/

Ограничение: требуется использование фреймворков глубокого обучения. Я хочу что-то, что работает с традиционным машинным обучением. Я хочу сделать logisti c регрессию или дерево решений.

Что вы думаете по этому поводу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...