Min*_*Mai 12 python scikit-learn xgboost
希望我读错了,但是在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管道.有关功能提取的任何想法?还有其他人遇到过这种情况吗?
Dav*_*vid 17
正如评论所示,我怀疑你的问题是版本问题.但是,如果您不想/不能更新,那么以下功能应该适合您.
def get_xgb_imp(xgb, feat_names):
from numpy import array
imp_vals = xgb.booster().get_fscore()
imp_dict = {feat_names[i]:float(imp_vals.get('f'+str(i),0.)) for i in range(len(feat_names))}
total = array(imp_dict.values()).sum()
return {k:v/total for k,v in imp_dict.items()}
>>> import numpy as np
>>> from xgboost import XGBClassifier
>>>
>>> feat_names = ['var1','var2','var3','var4','var5']
>>> np.random.seed(1)
>>> X = np.random.rand(100,5)
>>> y = np.random.rand(100).round()
>>> xgb = XGBClassifier(n_estimators=10)
>>> xgb = xgb.fit(X,y)
>>>
>>> get_xgb_imp(xgb,feat_names)
{'var5': 0.0, 'var4': 0.20408163265306123, 'var1': 0.34693877551020408, 'var3': 0.22448979591836735, 'var2': 0.22448979591836735}
Run Code Online (Sandbox Code Playgroud)
对于xgboost,如果使用xgb.fit(),则可以使用以下方法获取特征重要性。
import pandas as pd
xgb_model=xgb.fit(x,y)
xgb_fea_imp=pd.DataFrame(list(xgb_model.get_booster().get_fscore().items()),
columns=['feature','importance']).sort_values('importance', ascending=False)
print('',xgb_fea_imp)
xgb_fea_imp.to_csv('xgb_fea_imp.csv')
from xgboost import plot_importance
plot_importance(xgb_model, )
Run Code Online (Sandbox Code Playgroud)
我找到了答案.看来版本0.4a30没有feature_importance_属性.因此,如果您使用xgboost软件包进行安装,pip install xgboost则无法从XGBClassifier对象中进行特征提取,如果需要解决方法,可以参考@ David的答案.
不过,我所做的是通过克隆回购和运行从源头上构建它. ./build.sh,这将安装版本0.4,其中feature_importance_属性的作品.
希望这有助于他人!
获取特征重要性作为排序数据框
import pandas as pd
import numpy as np
def get_xgb_imp(xgb, feat_names):
imp_vals = xgb.booster().get_fscore()
feats_imp = pd.DataFrame(imp_vals,index=np.arange(2)).T
feats_imp.iloc[:,0]= feats_imp.index
feats_imp.columns=['feature','importance']
feats_imp.sort_values('importance',inplace=True,ascending=False)
feats_imp.reset_index(drop=True,inplace=True)
return feats_imp
feature_importance_df = get_xgb_imp(xgb, feat_names)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21967 次 |
| 最近记录: |