由于看不见的特征,随机森林预测失败

数据挖掘 scikit-学习 随机森林
2022-02-28 19:42:32

我已经在一些数据集上训练了一个随机森林模型,并且喜欢预测训练中没有看到的其他数据的结果。这样做时,我得到

ValueError: Number of features of the model must match the input. Model n_features is 12 and input n_features is 13 

问题是训练数据中有一些变量在我的预测集中不存在。D_0例如,我通过虚拟变量, D_1,捕获某些特征的计数D_2D_3表示D. D_2我的训练数据中可能没有,但D_2在我的预测数据集中。

在这种情况下,最佳做法是什么?我计划在未来的数据上重复使用这个估计器,我不知道哪些特征会存在。我是否应该检查两个功能列表之间的不一致并手动更正那些不重叠的?在上面的示例中,我将编码所有出现的D_2toD_3以对齐功能列表。

1个回答

问题是你是onehot编码的方式。

任何类型编码的最佳实践:

您应该仅在训练数据上训练 Onehot 编码的估计器,并且在对测试数据进行编码时,您应该使用与训练数据相同的估计器。

例如:sklearn.preprocessing.OneHotEncoder执行此操作,它有一个名为:handle_unknown的参数。

handle_unknown{'error', 'ignore'}, default='error' 如果在转换期间存在未知的分类特征,是否引发错误或忽略(默认为引发)。当此参数设置为 'ignore' 并且在转换过程中遇到未知类别时,此功能的生成的 one-hot 编码列将全为零。在逆变换中,未知类别将表示为无。

最佳选项是:您可以使用此参数并将其设置为忽略,以忽略未知特征值并避免错误,直到您最终重新训练模型并将新特征值添加到模型中。

from sklearn.preprocessing import OneHotEncoder
ohe=OneHotEncoder(handle_unknown='ignore')
train=ohe.fit_transform(train)
test=ohe.transform(test)

或者,正如您所说,您可以手动更正特征空间中的差异,但在每次更新模型时都会很耗时,而且如果您在手动更正中马虎,则不排除代码引发错误的可能性。