我正在努力让我的XGBoost模型从文本中预测文章的参与时间。首先,我得到一个数据帧,表示我从文章中提取的功能,如下所示:
article_features = pd.concat([tfidf_df, numeric_df_normalized], axis=1)
然后我训练我的模型并获得相关的正确列(功能):
with open('correct_columns') as fp:
correct_columns = pickle.load(fp)
然后我会浏览所有必需的功能并将它们设置为0.0
,如果它们还没有在article_features
中:
for col in correct_columns:
if col not in article_features.columns:
article_features[col] = 0.0
最后,我删除了从本文中提取的培训数据中不存在的功能:
for col in article_features:
if col not in correct_columns:
del article_features[col]
所以现在article_features
具有正确数量的功能。我试着跑:
model.predict(article_features)
我得到:
ValueError: feature_names mismatch:...
所以我谷歌周围并尝试将我的数据帧转换为:
model.predict(article_features.as_matrix())
但我得到了同样的错误。
然后我担心article_features
中的列的顺序与correct_columns
不一样,所以我做了:
article_features.sort_index(axis=1, inplace=True)
但得到了同样的错误。
知道怎么解决?
谢谢!
由于DMatrix..num_col()
仅返回稀疏矩阵中非零列的数量,因此会出现此问题。因此,如果列车和测试数据都具有相同数量的非零列,则一切正常。否则,您最终会得到不同的功能名称列表。目前有三种解决方案可以解决这个问题:
test_df = test_df[train_df.columns]
代替
use test_df.values
我们的想法是,用于拟合模型的数据包含与用于训练模型的数据完全相同的特征。
最后,我删除了从本文中提取的训练数据中不存在的功能:....所以现在article_features具有正确数量的功能。 ....
您用于拟合模型的数据中存在的功能如何,而不是您用于培训的数据中的功能如何?