You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XGBoost.save_model保存模型丢失feature_names,如何恢复?

解决XGBoost模型保存后feature_names丢失的问题

XGBoost的Booster.save_model()默认仅存储模型的结构与权重参数,不会保存feature_names这类元数据,因此加载后会出现feature_names为None的情况。以下两种方法可以解决这个问题:

方法一:保存完整的XGBClassifier对象

直接用pickle或joblib保存整个分类器实例,这样会保留所有训练相关的元数据(包括feature_names):

import pickle
import xgboost as xgb
import pandas as pd

# 数据准备
data = {'col_1': [3, 2, 1, 0], 'col_2': [1, 2, 3, 4], 'label': [1, 1, 0, 0]}
df = pd.DataFrame.from_dict(data)
y_train = df.pop('label')
x_train = df

# 训练模型
classifier = xgb.XGBClassifier(max_depth=3, learning_rate=0.1, n_estimators=3)
classifier.fit(x_train, y_train)
print(f'训练后特征名: {classifier.get_booster().feature_names}')

# 保存完整模型
filename = 'test_model.pkl'
with open(filename, 'wb') as f:
    pickle.dump(classifier, f)

# 加载模型
with open(filename, 'rb') as f:
    loaded_classifier = pickle.load(f)
print(f'加载后特征名: {loaded_classifier.get_booster().feature_names}')

方法二:手动存储并恢复feature_names

如果必须使用Booster.save_model(),可以在保存前将feature_names存入模型的自定义属性,加载后再读取恢复:

import xgboost as xgb
import pandas as pd

# 数据准备
data = {'col_1': [3, 2, 1, 0], 'col_2': [1, 2, 3, 4], 'label': [1, 1, 0, 0]}
df = pd.DataFrame.from_dict(data)
y_train = df.pop('label')
x_train = df

# 训练模型
classifier = xgb.XGBClassifier(max_depth=3, learning_rate=0.1, n_estimators=3)
classifier.fit(x_train, y_train)
booster = classifier.get_booster()
print(f'训练后特征名: {booster.feature_names}')

# 将feature_names存入模型属性
booster.set_attr(feature_names=','.join(booster.feature_names))
filename = 'test_model.bst'
booster.save_model(filename)

# 加载模型并恢复feature_names
bst_model = xgb.Booster()
bst_model.load_model(filename)
# 读取属性并拆分还原
feature_names = bst_model.attr('feature_names').split(',')
bst_model.feature_names = feature_names
print(f'加载后特征名: {bst_model.feature_names}')

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:27:22