我在 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 等从原始训练数据(未预处理,带有列名称)映射到生成的特征重要性图,以便将实际特征名称绘制在图表?在这方面的任何帮助都非常感谢。
希望我读错了,但是在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属性来使用对象计算要素重要性.我使用的唯一理由XGBClassifier了Booster,是因为它能够被包裹在一个sklearn管道.有关功能提取的任何想法?还有其他人遇到过这种情况吗?
在 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)
# 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 方法显示型号年份最重要。哪一项是正确的最重要的特征?