Одно горячее кодирование в валидации поезда и тестовом наборе (производственные данные)

#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
 

У меня есть несколько вопросов, основанных на вышеуказанных ситуациях :

  1. Как справиться с новой записью уровня или значения категориальной переменной в производственных тестовых данных?
  2. Как сохранить размер входных объектов для модели (для приведенного выше примера это было 6 в обучении и 5 в тестовых данных)?
  3. Также 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, потому что я думаю, что это совсем не ясно:

  1. Для OneHotEncoding сначала вам нужно fit получить один набор данных (почти всегда обучающие данные). Что вы делаете на этом этапе? По сути, вы указываете, сколько, какой и порядок класса (в вашем случае: у вас есть 6 классов, с порядком: Тони, Смит, ..)
  2. Затем вы можете преобразовать любые данные, используя этот предыдущий OneHotEncoder, установленный с помощью transform . Например, результаты вашего теста будут следующими:

Шейн, когда-либо думал, что это первый класс, который появляется в ваших тестовых данных, он останется функцией 3 (поэтому в функции 3 появится 1, а в других функциях будут нули), поскольку он был определен в fit части с обучающими данными.

Дэнни, не будет иметь ни одного 1 в функциях, поскольку эти имена не появлялись в обучающих данных. Как мы уже говорили в вопросе 1, если вы установите для гиперпараметра handle_unknow значение error , вы получите ошибку, если вы установите для ignore него значение, вы продолжите работу со всеми функциями с 0.

Итак, в основном, как вы можете видеть, вы сначала подгоняете к одним данным, а затем применяете то, что вы узнали, для преобразования других данных. Вы должны соответствовать только один раз OneHotEncoder .

Примечание: вы можете подгонять и преобразовывать обучающие данные за один шаг: fit_transform

Комментарии:

1. что, если мой производственный код и код обучающей модели находятся в разных сценариях? В основном я сохраняю модели из обучающего сценария и загружаю в производственный сценарий. Тогда как сохранить подходящую утилиту от обучения и использования в производственном скрипте? Это правильный путь?

2. Да, это правильно. Я сделал и отредактировал свой ответ. В принципе, используйте joblib библиотеку. При необходимости вы можете найти дополнительную документацию о том, как ее использовать. Кстати, если вы считаете, что ответ был дан правильно, примите его.