我封装的多标签(multi-label)XGBoost模型是像下面这样写的:
from xgboost import XGBRegressor
from sklearn.multioutput import MultiOutputRegressor
multi_xgb = MultiOutputRegressor(XGBRegressor(max_depth=10, learning_rate=0.1, n_estimators=500, silent=False))
multi_xgb.fit(train_x, train_y)
mse_train = mean_squared_error(train_y, multi_xgb.predict(train_x))
print('XGBoost Train MSE: %.7f' % mse_train)
我想要用multi_xgb.feature_importance_ 或plot_importance(multi_xgb) 的方式输出特征重要度,但是此时报错如下:
ValueError: tree must be Booster, XGBModel or dict instance
思考后发现问题出在MultiOutputRegressor 上,因为如果是单标签的常规写法不会出现任何问题。 解决这个方案的方法就是不直接使用multi_xgb这个封装模型,而是用multi_xgb.estimators_[0] 来作为其中标准的xgboost模型,从而正常输出importance统计。
from xgboost import XGBRegressor, plot_importance
plot_importance(multi_xgb.estimators_[0])
plot_importance(multi_xgb.estimators_[1])
plt.title('Xgboost Feature Importance')
plt.show()
问题迎刃而解~ 参考资料:
|