#python #machine-learning #scikit-learn #one-hot-encoding #data-preprocessing
#python #машинное обучение #scikit-учиться #одно-горячее кодирование #предварительная обработка данных
Вопрос:
Например, у меня есть ниже набор поездов.
name values
0 Tony 100
1 Smith 110
2 Sam 120
3 Shane 130
4 Sam 140
5 Ram 160
После одного горячего кодирования становится
values 0 1 2 3 4
0 100 1 0 0 0 0
1 110 0 1 0 0 0
2 120 0 0 1 0 0
3 130 0 0 0 1 0
4 140 0 0 1 0 0
5 160 0 0 0 0 1
Теперь предположим, что у меня есть тестовые данные в производстве с Danny
новым уровнем в name
:
name values
0 Shane 200
1 Danny 210
2 Sam 220
3 Tony 180
4 Danny 150
После одного горячего кодирования этого
values 0 1 2 3
0 200 1 0 0 0
1 210 0 1 0 0
2 220 0 0 1 0
3 180 0 0 0 1
4 150 0 1 0 0
У меня есть несколько вопросов, основанных на вышеуказанных ситуациях :
- Как справиться с новой записью уровня или значения категориальной переменной в производственных тестовых данных?
- Как сохранить размер входных объектов для модели (для приведенного выше примера это было 6 в обучении и 5 в тестовых данных)?
- Также
Tony
была функция 0 в наборе поездов, однако в тесте это функция 3; влияет ли это на прогноз тестового ввода из обученной модели?
Ответ №1:
Как бороться с новым вводом уровня в производственные тестовые данные?
OneHotEncoder
имеет гиперпараметр для этой проблемы: handle_unknown
handle_unknown{‘error’, ‘ignore’}, default=’error’ Следует ли вызывать ошибку или игнорировать, если во время преобразования присутствует неизвестная категориальная функция (по умолчанию используется raise). Если для этого параметра установлено значение «игнорировать» и во время преобразования встречается неизвестная категория, результирующие столбцы с кодировкой «один горячий» для этой функции будут состоять из нулей. При обратном преобразовании неизвестная категория будет обозначаться как None.
Как вы можете видеть, у вас есть два разных значения для этого гиперпараметра. Если в вашем тесте может появиться новый класс (как в вашем примере с Дэнни), я рекомендую использовать значение ignore
:
enc = OneHotEncoder(handle_unknown='ignore')
Как поддерживать размер входных объектов для модели? Порядок классов?
Модель всегда будет сохранять размер входных объектов для установленных данных. Например, используя предоставленные вами данные, если вы установили свои OneHotEncoder
обучающие данные, у вас всегда будет 6 входных данных.
И, кроме того, всегда эти входные данные будут иметь одинаковые категории обучающих данных. Я имею в виду, что в ваших данных функция 0 всегда будет относиться к Тони, функция 1 к Смиту, ..
Если вы хотите перенести OneHotEncoder, установленный в другой скрипт, вы можете сделать это с помощью joblib
library . Например:
import joblib
enc = OneHotEncoder(handle_unknown='error')
enc.fit(data)
joblib.dump(enc, 'encoder.joblib')
А затем загрузите из другого скрипта:
enc = joblib.load('encoder.joblib')
Пояснения
Наконец, я хотел бы уточнить процесс и то, как вы OneHotEncode, потому что я думаю, что это совсем не ясно:
- Для OneHotEncoding сначала вам нужно
fit
получить один набор данных (почти всегда обучающие данные). Что вы делаете на этом этапе? По сути, вы указываете, сколько, какой и порядок класса (в вашем случае: у вас есть 6 классов, с порядком: Тони, Смит, ..) - Затем вы можете преобразовать любые данные, используя этот предыдущий OneHotEncoder, установленный с помощью
transform
. Например, результаты вашего теста будут следующими:
Шейн, когда-либо думал, что это первый класс, который появляется в ваших тестовых данных, он останется функцией 3 (поэтому в функции 3 появится 1, а в других функциях будут нули), поскольку он был определен в fit
части с обучающими данными.
Дэнни, не будет иметь ни одного 1 в функциях, поскольку эти имена не появлялись в обучающих данных. Как мы уже говорили в вопросе 1, если вы установите для гиперпараметра handle_unknow
значение error
, вы получите ошибку, если вы установите для ignore
него значение, вы продолжите работу со всеми функциями с 0.
Итак, в основном, как вы можете видеть, вы сначала подгоняете к одним данным, а затем применяете то, что вы узнали, для преобразования других данных. Вы должны соответствовать только один раз OneHotEncoder
.
Примечание: вы можете подгонять и преобразовывать обучающие данные за один шаг: fit_transform
Комментарии:
1. что, если мой производственный код и код обучающей модели находятся в разных сценариях? В основном я сохраняю модели из обучающего сценария и загружаю в производственный сценарий. Тогда как сохранить подходящую утилиту от обучения и использования в производственном скрипте? Это правильный путь?
2. Да, это правильно. Я сделал и отредактировал свой ответ. В принципе, используйте
joblib
библиотеку. При необходимости вы можете найти дополнительную документацию о том, как ее использовать. Кстати, если вы считаете, что ответ был дан правильно, примите его.