Вопрос

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

Как мне справиться с таким сценарием?

Я могу преобразовать строку в числа с помощью некоторых механизма, таких как хэшинг в Python. Но я хотел бы знать, какую практику о том, как строки обрабатываются в проблемах дерева решений.

Это было полезно?

Решение

В большинстве устоявшихся систем машинного обучения категориальные переменные обрабатываются естественным образом. Например, в R вы будете использовать факторы, в Weka вы будете использовать номинальные переменные. Это не тот случай в Scikit-learn. Деревья решений, реализованные в Scikit-Learn, используют только численные особенности, и эти функции всегда интерпретируются как Непрерывные числовые переменные.

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

Один из примеров заключается в том, чтобы кодировать [«красный», «зеленый», «синий»] с [1,2,3], будет создавать странные вещи, такие как «красный», ниже, чем «синий», и если вы средние «красный» И «синий» вы получите «зеленый». Еще один более тонкий пример может произойти, когда вы кодируете ['low', 'medium', 'High'] с [1,2,3]. В последнем случае, возможно, это может быть упорядочение, которое имеет смысл, однако, некоторые тонкие несоответствия могут произойти, когда «средние» не в середине «низкого» и «высокого».

Наконец, ответ на ваш вопрос заключается в кодировании категориальной функции в Несколько бинарных функций. Анкет Например, вы можете кодировать ['red', 'green', 'blue'] с 3 столбцами, по одному для каждой категории, имея 1, когда категория совпадает и 0 в противном случае. Это называется Одно горячее кодирование, бинарное кодирование, уникальное кодирование или что-то еще. Вы можете проверить документацию здесь на Кодирование категориальных особенностей а также Извлечение функций - хэширование и дадние. Анкет Очевидно, что одножелательное кодирование расширяет ваши требования к пространству, а иногда это наносит ущерб производительности.

Другие советы

Вам необходимо кодировать свои строки в виде числовых функций, которые Sci-KIT может использовать для алгоритмов ML. Эта функциональность обрабатывается в модуле предварительной обработки (например, см. sklearn.preprocessing.labelencoder для примера).

Вы обычно должны ОДИН-HOT ENCODE Категориальные переменные для моделей Scikit-Learn, включая случайный лес. Случайный лес часто будет работать ОК без одного высокого кодирования, но обычно работает лучше, если вы делаете однопользовательский кодирование. Однократные кодирующие и «заклеенные» переменные означают одно и то же в этом контексте. Scikit-learn имеет sklearn.preprocessing.onehotencoder и у Панды есть pandas.get_dummies Чтобы сделать это.

Однако есть альтернативы. Статья «За одну горячую» в Kdnuggets отлично справляется с объяснением того, почему вам нужно кодировать категориальные переменные и альтернативы однопольнуемому кодированию.

Существуют альтернативные реализации случайного леса, которые не требуют однопользового кодирования, таких как R или H2O. Реализация в r вычислительно дорого а также не будет работать, если ваши функции имеют много категорий. Анкет H2O будет работать с большим количеством категорий. Континуум сделал H2O доступен в Anaconda Python.

Есть Постоянные усилия, чтобы напрямую создать категориальные функции ручки Scikit-Learn.

эта статья имеет объяснение алгоритма, используемого в H2O. Он ссылается на академический документ Алгоритм потокового параллельного дерева решений и более длинная версия той же бумаги.

Обновление 2018 года!

Вы можете создать встраиваемое (плотное векторное) пространство для ваших категориальных переменных. Многие из вас знакомы с Word2VEC и Fastext, которые встраивают слова в значимое плотное векторное пространство. Та же идея здесь- ваши категориальные переменные будут сопоставлены с вектором с некоторым значением.

От Guo/Berkhahn Paper:

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

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

Лучшим примером может быть Применение техники Pinterest Групповой булавки:

enter image description here

Ребята из Fastai внедрили категориальные встроены и создали очень красивые Сообщение блога с компаньоном Демо -ноутбук.

Дополнительные данные и объяснение

Нейронная сеть используется для создания встраиваний, т.е. присвоение вектора каждому категориальному значению. После того, как у вас есть векторы, вы можете использовать их в любой модели, которая принимает численные значения. Каждый компонент вектора становится входной переменной. Например, если вы использовали трехмерные векторы для внедрения вашего категориального списка цветов, вы можете получить что -то вроде: red = (0, 1,5, -2,3), синий = (1, 1, 0) и т. Д. Вы бы использовали три Входные переменные в вашем случайном лесу, соответствующие трем компонентам. Для красных вещей C1 = 0, C2 = 1,5 и C3 = -2,3. Для синих вещей C1 = 1, C2 = 1 и C3 = 0.

Вы на самом деле этого не сделаете необходимость Использовать нейронную сеть для создания вторжений (хотя я не рекомендую уклоняться от техники). Вы можете создавать свои собственные вставки вручную или другие средства, когда это возможно. Некоторые примеры:

  1. Цвета карты для векторов RGB.
  2. Карта местоположения в векторах LAT/LONG.
  3. В политической модели США отображают города с некоторыми векторными компонентами, представляющими левое/правое выравнивание, налоговое бремя и т. Д.

Вы можете использовать фиктивные переменные в таких сценариях. С Пандой panda.get_dummies Вы можете создать фиктивные переменные для строк, которые вы хотите поместить в дерево решений или случайный лес.

Пример:

import pandas as pd
d = {'one' : pd.Series([1., 2., 3.,4.], index=['a', 'b', 'c','d']),'two' :pd.Series(['Paul', 'John', 'Micheal','George'], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

df_with_dummies= pd.get_dummies(df,columns=["two"],drop_first=False)
df_with_dummies

Поверните их в цифры, например, для каждой уникальной страны уникальное число (например, 1,2,3 и ...)

Вас также Не нужно использовать ОДНА-HOT CODING (Он же фиктивные переменные) При работе со случайным лесом, потому что деревья не работают, как другой алгоритм (такой как линейная/логистическая регрессия), и они не работают отдаленными (они работают с поиском хорошего раскола для ваших функций) НЕЗАЧЕМ для одного высокого кодирования

Лицензировано под: CC-BY-SA с атрибуция
Не связан с datascience.stackexchange
scroll top