机器学习 基础教程

机器学习 集成学习

机器学习 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/ml-xgboost-feature-names-mismatch.html

python xgboost 关于 ValueError: feature_names mismatch 及 training data did not have the following fields 错误的解决方法

机器学习 笔记 机器学习 笔记


在使用 xgboost 训练数据和检验模型时,如果测试集的特征最大编号数大于训练集的特征最大编号数,在测试时,会报 ValueError: feature_names mismatch 和 training data did not have the following fields 错误。

具体报错信息

Traceback (most recent call last):
  File "/xxx/xxx/.../xxx.py", line 65, in <module>
    y_pred = model.predict(dtest, ntree_limit=model.best_ntree_limit)
  File "/xxx/xxx/.../venv/lib/python3.8/site-packages/xgboost/core.py", line 1055, in predict
    self._validate_features(data)
  File "/xxx/xxx/.../venv/lib/python3.8/site-packages/xgboost/core.py", line 1312, in _validate_features
    raise ValueError(msg.format(self.feature_names,
ValueError: feature_names mismatch: ['f0', 'f1', 'f2', 'f3', 'f4', ..., ...]
training data did not have the following fields: f10122, f10630, ..., ...

解决问题方法

解决问题的核心思路是,XGBoost 的训练数据和测试数据,要保证两者的特征数一样,即特征编号的最大值一致。

具体解决方法笔者梳理了一种方法。

libsvm 样本都追加最大特征编号

假设通过训练大概知道特征的个数量级,那边在 libsvm 样本最后添加最大特征编号对应的特征值,如下:

0	1258:1 5856:1 2:1 5857:1 4:0 5:2 6:5 7:1 8:1 9:0.18935823583683 10:5.752572638825633 20000:0
0	107:1 5858:1 43:1 5859:1 4:0 5:22 6:1 7:1 8:1 9:0.16732928491179 10:5.476463551931511 20000:0
0	41:1 5860:1 13:1 4859:1 4:0 5:17 6:3 7:1 8:1 9:0.21670740100451 10:6.955592608396297 20000:0
1	11:1 5861:1 13:1 751:1 4:0 5:15 6:0 7:1 8:1 9:0.33720442665852 10:8.996280439395015 20000:0
...

假设最大特征编号不会超过 20000,那在样本末尾追加 20000:0,包括训练集和测试集。