正如已经声明的那样,通常您应该在分割之前进行一次热编码。
但还有另一个问题。有一天,您肯定希望将经过训练的 ML 模型应用于野外数据。我指的是您以前从未见过的数据,您需要对假人进行完全相同的转换,就像您训练模型时一样。
那么你可能不得不处理两种情况。
- 也就是说,新数据包含您的训练数据中没有的类别,并且
- 反之亦然,某个类别不再出现在您的数据集中,但您的模型已经用它进行了训练。
在情况 1 中,您应该忽略该值,因为您的模型很可能无法在没有对其进行训练的情况下处理它。在情况 2 中,您仍然应该生成这些空类别,以便在您想要预测的数据中具有与训练集中相同的结构。请注意,pandas 方法不会为这些类别生成虚拟数据,因此无法保证您从预测数据中获得与训练数据中相同的结构,因此您的模型很可能不适用于这些数据。
您可以通过使用与 get_dummies 等效的 sklearn 来解决这个问题(只需多做一点工作),如下所示:
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')
用sklearnOneHotEncoder
您可以将类别的标识与实际的 one-hot 编码(虚拟对象的创建)分开。您还可以保存安装的一个热编码器,以便稍后在模型应用过程中应用它。注意handle_unknown选项,它告诉一个热编码器,如果它稍后遇到未知的东西,它应该忽略它,而不是引发错误。