【问题标题】:XGBoost: Feature Names MismatchXGBoost:功能名称不匹配
【发布时间】:2018-01-07 14:51:11
【问题描述】:

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

但是遇到了同样的错误。

知道如何解决吗?

谢谢!

【问题讨论】:

  • 你是如何训练model的?我的意思是其中使用了哪些功能?正是这些特征应该在预测过程中出现,否则就没有任何意义。

标签: python pandas xgboost


【解决方案1】:

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

  1. 使用

    重新对齐训练数据框和测试数据框的列名
    test_df = test_df[train_df.columns]
    
  2. 先保存模型再加载模型

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

    use test_df.values
    

    而不是

    test_df
    

【讨论】:

    【解决方案2】:

    我们的想法是,用于拟合模型的数据包含与用于训练模型的数据完全相同的特征。

    最后,我删除了从这篇文章中提取的不属于 存在于训练数据中: …… 所以现在 article_features 具有正确数量的特征。 ....

    您用于拟合模型的数据中存在哪些特征,但您用于训练的数据中没有这些特征?

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 2020-10-09
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      相关资源
      最近更新 更多