XGBoost:功能名称不匹配

时间:2017-07-31 21:58:33

标签: python pandas xgboost

我正在努力让我的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)

但是得到了同样的错误。

知道如何解决?

谢谢!

2 个答案:

答案 0 :(得分:3)

由于DMatrix..num_col()仅返回稀疏矩阵中非零列的数量,因此出现问题。因此,如果火车和测试数据具有相同数量的非零列,一切正常。否则,您最终会得到不同的功能名称列表。目前有三种解决方案可以解决这个问题:

  1. 使用

    重新对齐列车数据帧和测试数据帧的列名称
    test_df = test_df[train_df.columns]
    
  2. 首先保存模型,然后加载模型

  3. 在输入模型之前将测试数据更改为数组:

    use test_df.values
    

    而不是

    test_df
    

答案 1 :(得分:1)

您的想法是,用于拟合模型的数据包含的功能与用于训练模型的数据完全相同。

  

最后,我删除了从本文中提取的未删除的功能      存在于训练数据中:   ....   所以现在article_features具有正确数量的功能。 ....

您用于拟合模型的数据中存在哪些功能,而不是用于培训的数据?