在使用 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
,包括训练集和测试集。