Проблема
Допустим, у нас есть фрейм данных, который выглядит следующим образом:
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 регрессию или дерево решений.
Что вы думаете по этому поводу?