Все мы полагаемся на особенности или переменные, чтобы построить нашу идеальную модель машинного обучения. Мы часами занимаемся разработкой функций и контролируем, какие функции будут соответствовать модели, а какие нет. Однако одна вещь, которую мы не можем контролировать, - это то, какие ценности эта функция имеет или может иметь в будущем. С количественными переменными легко поиграть, но как насчет категориальных? «Ага! что насчет этого? А ?! »

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

Что такое One Hot Encoding?

Одно горячее кодирование - это один алгоритм, который количественно определяет ваши категориальные данные для использования в моделях машинного обучения. Scikit-learn определяет процесс как «Вход в этот преобразователь должен быть массивом целых чисел или строк, обозначающих значения, принимаемые категориальными (дискретными) функциями. Функции кодируются с использованием горячей схемы кодирования (также известной как «один из K» или «фиктивная»). Это создает двоичный столбец для каждой категории и возвращает разреженную матрицу или плотный массив ». Например, один объект в вашем наборе данных может иметь цвет, например красный, синий или зеленый. Один «горячий» кодировщик создает фиктивные столбцы и присваивает «1» столбцу, которому принадлежит функция. На изображении выше показаны результаты после преобразования.

Использование его в конвейере машинного обучения

Кодировщик сканирует объект на предмет различных категорий и создает такое же количество столбцов. В приведенном выше примере один столбец «CAR» преобразуется для создания двух столбцов из-за двух различных значений, а другой «COLOR» преобразуется для создания трех столбцов из-за трех различных значений. Вы также можете указать категории, и кодировщик создаст такое же количество столбцов. Например, если у цвета было только два значения (красный и зеленый), и мы указываем три категории (красный, зеленый или синий), кодировщик создаст три столбца. Соглашение об именах всегда похоже на «основная функция» + «_» + «уникальное значение».

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

Приступим к производству!

Что нужно сделать при построении модели.

Создайте словарь, в котором будут храниться функции, которые вы будете классифицировать, с указанием уникального значения каждой функции. Например, если у вас есть фрейм данных с именем df и в нем есть две функции, такие как «CAR» и «COLOR», которые вы хотите классифицировать, словарь будет выглядеть следующим образом:

dict = {'категории': ['АВТОМОБИЛЬ', 'ЦВЕТ'], 'АВТОМОБИЛЬ': список (df ['АВТОМОБИЛЬ']. unique ()), 'ЦВЕТ': список (df ['ЦВЕТ']. unique ( ))}

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

df [dict ["категории"]] = df [dict ["категории"]]. astype ("категория")

Вышеупомянутая функция преобразует две функции в тип категории, и теперь вы можете использовать get_dummies, «df = pd.get_dummies (df)».

Результат будет похож на тот, который отображается вверху. Добавьте в словарь список всех столбцов в новом df: dict [‘ columns ’] = list (df.columns) (Вы увидите, почему). Не забудьте экспортировать его как .joblib. Поскольку нам потребуется снова импортировать то же самое в наш код конвейера прогнозирования. Joblib поможет вам экспортировать вашу функцию, а затем повторно импортировать ее в другое место. Вы можете прочитать больше об этом здесь."

Конвейер прогнозирования - где творится чудо

Прежде всего, импортируйте словарь, который вы создали выше (dict). Теперь отфильтруйте записи или значения, которые вы никогда раньше не получали и, следовательно, никогда не учитывались при обучении модели. Команда будет такой:

df_new = df [~ df [‘CAR’]. isin (dict [‘CAR’]) | ~ df [‘COLOR’]. isin (dict [‘COLOR’])]

Что происходит, ключ «CAR» словаря «dict» хранит все уникальные значения, с которыми мы сталкивались до сих пор. «Df [‘ CAR ’]. Isin (dict [‘ CAR ’])» - это проверить все значения функции «CAR» фрейма данных «df» и посмотреть, есть ли они в словаре. «~» - это оператор НЕ, поэтому результирующая команда извлечет все значения, отсутствующие в словаре, и сохранит их в «df_new». Это будет дано в качестве обратной связи разработчикам моделей о том, как учитывать новые значения, а также о том, нужно ли пересматривать модель или нет. После этого следует сбросить эти записи:

df.drop (df_new.index, inplace = True)

Теперь преобразуйте категориальные столбцы df в тип категории. Список можно получить из «dict [‘ категорий ’]». Учтите, что вам нужно кодировать только те значения, с которыми вы уже сталкивались. Следовательно, при преобразовании функции в тип категории не забудьте передать все известные значения как отдельные категории. Они уже сохранены в словаре «dict».

df [i] = df [i] .astype ("категория", Categories = dict [i])

Выше «i» - это функция типа каждой категории, которую можно получить из dict [‘категории’]. Причина в том, что предположим, что мы получили новое значение в автомобиле, скажем «MERC». Теперь, если мы не предоставим дополнительный аргумент «категории», get_dummies создаст дополнительный столбец «CAR_MERC». Это не только изменит количество столбцов, на которых построена модель, и приведет к ее сбою, даже если количество столбцов каким-то образом останется прежним (новое значение появилось в наборе данных прогноза, а одно из старых значений нет), модель будет работать с неверным набором данных и даст неверные прогнозы. Кроме того, если мы не получили все уникальные значения, get_dummies создаст меньше столбцов. Например, если мы получим только два цвета «КРАСНЫЙ» и «СИНИЙ», get_dummies создаст только два столбца, а не три - проблема! проблема! проблема! Новый набор столбцов будет выглядеть следующим образом, если категории не указаны.

вместо этого:

Затем мы должны позаботиться о том, чтобы порядок столбцов остался прежним. Этого можно просто достичь, используя последнюю пару "ключ-значение", которую мы добавили в словарь, «dict [‘ columns ’]». А также не забудьте сначала выполнить get_dummies, а затем изменить порядок столбцов.

df = pd.get_dummies (df)

df = df [dict ["столбцы"]]

Обученные модели не принимают во внимание заголовки и следуют порядку обучения модели. Get_dummies не подчиняется определенному порядку. Иногда первым будет CAR_BMW, а иногда - CAR_AUDI. Поскольку заголовки не учитываются при прогнозировании, df с порядком столбцов «CAR_BMW», «CAR_AUDI» отличается от «CAR_AUDI», «CAR_BMW», и оба будут предсказывать разные результаты. Следовательно, мы должны учитывать порядок, который использовался для обучения модели. Это будет последний шаг, после которого вы можете передать фрейм данных для прогнозирования.

Заключение

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