使用sk-learn进行分类:如何处理预测中缺失的分类特征

3
在我的项目中,我正在训练一个BaggingClassifier。由于使用的数据包含分类特征,因此我使用pandas框架(get_dummies)来对它们进行编码。完成后,我训练了分类器。
现在,我想要进行预测。但是返回了以下错误:
ValueError: Number of features of the model must match the input. Model n_features is 12 and input n_features is 6.

我理解为什么会出现这个错误。

模型所需的特征:12个

预测数据集中包含的特征:6个

由于编码的原因,训练数据集在这种情况下扩展到了12个特征。而我用于预测的编码数据只有6个特征,因为它只是一行数据,不会在编码过程中扩展到更多的特征。

以下是一个示例,说明了这个问题:

原始训练数据集

Age| Color  
35 |'Orange'
55 |'Black' 
75 |'Red' 

在使用 pandas get_dummies 后:

X                              
Age| Orange | Black| Red       
35 | 1      | 0    | 0         
55 | 0      | 1    | 0         
75 | 0      | 0    | 1         

预测数据集

X
Age| Orange|       
35 | 1     |

预测的特征集与模型所需的集合不匹配,因为它缺少“黑色”和“红色”这些特征。我无法想到一个好的解决方法。

这是错误的方法吗?

1个回答

0
对于这个应用程序,您应该尝试使用sklearn.preprocessing.OneHotEncoder。它基本上与pandas中的虚拟变量相同,但在对训练数据调用fit时,它将记住哪些值以及它们对应的列。然后,如果您对测试数据进行transform,它将为训练数据创建具有相同特征数量的数组。

抱歉回复晚了。 问题是,我使用pickle对训练好的模型进行了保存以备后用。如果使用OneHotEncode,我需要pickle另一个对象来保留信息。这意味着在进行预测时,我需要从文件系统中读取两个数据,而这是在非常时间关键的情况下进行的,可能会与其他高达1000个预测同时运行。真正希望的是,如果您可以直接从模型中获取特征列表,因为这些信息必须以某种方式保存在其中。但似乎没有办法实现这一点。 - Herr Derb
不,特征列表并没有保存在模型中。模型怎么知道您输入了哪些特征呢?OneHotEncoder应该是很小的,您可以将其放在同一个pickle文件中。这真的不会产生任何额外开销。 - Andreas Mueller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接