python - XGBoost:特征名称不匹配

标签 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)

但得到了同样的错误。

知道如何解决吗?

谢谢!

最佳答案

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

  1. 使用

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

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

    use test_df.values
    

    代替

    test_df
    

关于python - XGBoost:特征名称不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45425934/

相关文章:

tree - 在应用 varImp 函数时使用带插入符号的 xgbTree 方法和目标变量的权重时出现非树模型错误

python - 如何通过 python 在线连接到 quickbooks?

python - 为什么我的 Django 工厂函数在本地数据库中创建模型,而不是测试数据库?

Python Pandas为选定列的逐行最大值添加列

python - 如何向 django admin 添加非 CRUD 操作

python - 仅在 Pandas 中将不规则日期格式转换为年份

python - 如何将绝对值合并到 Pandas 数据框中?

python - Pandas groupby 添加带有交叉引用的行

xgboost - 如何在 Vertex AI 中通过 XGBoost 模型的批量预测保留实体标识符

scala - Spark 中的 XGBoost 模型 --> 缺失值处理