Как уже говорилось, обычно вы должны сделать одно горячее кодирование перед разделением. Но есть еще одна проблема. Однажды вы наверняка захотите применить свою обученную модель машинного обучения к данным в дикой природе. Я имею в виду данные, которых вы раньше не видели и вам нужно сделать для муляжей точно такое же преобразование, как и при обучении модели. Тогда вам, возможно, придется иметь дело с двумя случаями.
- заключается в том, что новые данные содержат категории, которых у вас не было в данных обучения, и
- Наоборот, категория больше не отображается в вашем наборе данных, но ваша модель была обучена с ней. В случае 1. вы должны просто игнорировать значение, так как ваша модель, скорее всего, не может справиться с ним, не будучи обучена на нем. В случае 2 вы все равно должны создавать эти пустые категории, чтобы иметь ту же структуру данных, которые вы хотите предсказать, как и в вашем обучающем наборе. Обратите внимание, что метод pandas не будет генерировать фиктивные данные для этих категорий и, следовательно, не может гарантировать, что вы получите ту же структуру из ваших прогнозных данных, что и в ваших обучающих данных, и поэтому, скорее всего, ваша модель не будет применима к данным.
Вы можете решить эту проблему, используя sklearn, эквивалентный get_dummies (с немного большей работой), который выглядит следующим образом:
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
# create some example data
df= pd.DataFrame({'x': [1, 2, 3], 'y': [2, 4, 8]})
# create a one hot encoder to create the dummies and fit it to the data
ohe= OneHotEncoder(handle_unknown='ignore', sparse=False)
ohe.fit(df[['x']])
# now let's simulate the two situations A and B
df.loc[1, 'x']= 1
df= df.append(dict(x=5, y=5), ignore_index=True)
# the actual feature generation is done in a separate step
tr=ohe.transform(df[['x']])
# if you need the columns in your existing data frame, you can glue them together
df2=pd.DataFrame(tr, columns=['oh1', 'oh2', 'oh3'], index=df.index)
result= pd.concat([df, df2], axis='columns')
С помощью sklearn OneHotEncoder
вы можете отделить идентификацию категорий от фактического горячего кодирования (создание манекенов). И вы также можете сохранить установленный горячий энкодер, чтобы иметь возможность применить его позже во время применения вашей модели. Обратите внимание на опцию handle_unknown, которая сообщает одному горячему энкодеру, что в случае, если позже он обнаружит что-то неизвестное, он должен просто игнорировать это, а не выдавать ошибку.
person
jottbe
schedule
24.06.2019