Как уже говорилось, обычно вы должны сделать одну горячую кодировку перед разделением.
Но есть и другая проблема. Однажды вы наверняка захотите применить свою обученную модель ML к данным в дикой природе. Я имею в виду данные, которых вы раньше не видели, и вам нужно выполнить те же преобразования для манекенов, что и при обучении модели.
Тогда вам придется иметь дело с двумя случаями.
- означает, что новые данные содержат категории, которых у вас не было в данных об обучении, и
- наоборот, категория больше не появляется в вашем наборе данных, но ваша модель была обучена этому.
В случае 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, который сообщает одному горячему кодировщику, что в случае, если он обнаружит что-то неизвестное позже, он должен просто игнорировать это, вместо того, чтобы выдавать ошибку.