相关疑难解决方法(0)

如何在不重新训练模型的情况下在 XGBoost 特征重要性图中获取实际特征名称?

我在 Stackoverflow 上遇到了几个问题,其中大众面临的问题是他们在使用例如拟合/训练 XGBoost 模型之前对训练数据进行预处理,例如使用中心和比例等

`

scaler = MinMaxScaler(feature_range=(0, 1))
X = scaler.fit_transform(X)
my_model_name = XGBClassifier()
my_model_name.fit(X,Y)` 
Run Code Online (Sandbox Code Playgroud)

其中 X 和 Y 分别是训练数据和标签,缩放返回 2D NumPy 数组,从而丢失特征名称。

我已经训练了我的 XGBoost 模型,但使用了预处理数据(使用 MinMaxScaler 进行中心和缩放)。因此,我处于类似的情况,其中列名/功能名称丢失。因此,当我尝试使用 时plot_importance(my_model_name),它会导致特征重要性的图,但只有特征名称为 f0、f1、f2 等,而不是数据集中的实际特征名称,这一定是显而易见的。

SO 上的大多数答案都与以不丢失特征名称的方式训练模型有关(例如在数据框列上使用 pd.get_dummies。我有一个查询,即如何在使用时获取实际特征名称plot_importance(my_model_name),而无需重新训练模型?有没有办法将特征名称 f0、f1、f2 等从原始训练数据(未预处理,带有列名称)映射到生成的特征重要性图,以便将实际特征名称绘制在图表?在这方面的任何帮助都非常感谢。

python dataframe xgboost

15
推荐指数
2
解决办法
1万
查看次数

使用XGBClassifier进行功能重要性

希望我读错了,但是在XGBoost库文档中,有一些提示使用feature_importances_很多像sklearn的随机森林来提取特征重要性属性.

但是,出于某种原因,我不断收到此错误: AttributeError: 'XGBClassifier' object has no attribute 'feature_importances_'

我的代码段如下:

from sklearn import datasets
import xgboost as xg
iris = datasets.load_iris()
X = iris.data
Y = iris.target
Y = iris.target[ Y < 2] # arbitrarily removing class 2 so it can be 0 and 1
X = X[range(1,len(Y)+1)] # cutting the dataframe to match the rows in Y
xgb = xg.XGBClassifier()
fit = xgb.fit(X, Y)
fit.feature_importances_
Run Code Online (Sandbox Code Playgroud)

您似乎可以Booster通过调用get_fscore属性来使用对象计算要素重要性.我使用的唯一理由XGBClassifierBooster,是因为它能够被包裹在一个sklearn管道.有关功能提取的任何想法?还有其他人遇到过这种情况吗?

python scikit-learn xgboost

12
推荐指数
4
解决办法
2万
查看次数

如何在 XGBOOST 中获得正确的特征重要性图?

在 XGBOOST 特征重要性中使用两种不同的方法,给了我两个不同的最重要的特征,应该相信哪一个?

什么时候应该使用哪种方法?我很困惑。

设置

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline

import seaborn as sns
import xgboost as xgb

df = sns.load_dataset('mpg')
df = df.drop(['name','origin'],axis=1)

X = df.iloc[:,1:]
y = df.iloc[:,0]
Run Code Online (Sandbox Code Playgroud)

Numpy 数组

# fit the model
model_xgb_numpy = xgb.XGBRegressor(n_jobs=-1,objective='reg:squarederror')
model_xgb_numpy.fit(X.to_numpy(), y.to_numpy())

plt.bar(range(len(model_xgb_numpy.feature_importances_)), model_xgb_numpy.feature_importances_)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

熊猫数据框

# fit the model
model_xgb_pandas = xgb.XGBRegressor(n_jobs=-1,objective='reg:squarederror')
model_xgb_pandas.fit(X, y)
axsub = xgb.plot_importance(model_xgb_pandas)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

问题

Numpy 方法显示第 0 个特征柱面是最重要的。Pandas 方法显示型号年份最重要。哪一项是正确的最重要的特征?

参考

python xgboost

8
推荐指数
2
解决办法
7228
查看次数

标签 统计

python ×3

xgboost ×3

dataframe ×1

scikit-learn ×1