用xgboost模型对特征重要性进行排序及画图--Selectfrommodel模块选取特征的原理解析

http://blog.itpub.net/31542119/viewspace-2199549/
什么是Xgboost:boosting算法的思想是将许多弱分类器集成在一起形成强分类器,xgboost是一种提升树模型,许多树模型集成在一起,形成一个很强的分类器,树模型是CART回归树模型:
CART回归树模型:假设树是二叉树,通过不断将特征进行分裂
二、XGBoost算法思想
就是不断的添加树,不断的进行特征分裂来生长一棵树,每次添加一个数,其实就是学习一个新函数,去拟合上次预测的残差,当我们训练完成得到K颗数,我们要预测一个样本的分行诉,
https://blog.csdn.net/waitingzby/article/details/81610495

from numpy import sort
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.feature_selection import SelectFromModel
dataset=loadtxt("diabets.txt",delimiter=',')
X=dataset[:,0:8]
y=dataset[:,8]
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.33,random_state=7)
model=XGBClassifier()#先实例化一个算法模型,接着去拟合
model.fit(X_train,y_train)
y_pred=model.predict(X_test)
predictions=[round(value) for  value in y_pred]#返回浮点数x的四舍五入值
accuracy=accuracy_score(y_test,predictions)
print("Accuracy:%.2f%%"%(accuracy *100.0))
thresholds=sort(model.feature_importances_)
for thresh in thresholds:
    selection=SelectFromModel(model,threshold=thresh,prefit=True)#threshold_ :采用的阈值
    #prefit :布尔,默认为False,是否为训练完的模型,如果是False的话则先fit,再transform
    select_X_train=selection.transform(X_train)
    selection_model=XGBClassifier()
    selection_model.fit(select_X_train,y_train)
    ## fit_transform()先拟合数据,再标准化  
    #X_train = ss.fit_transform(X_train)  
    # transform()数据标准化  
    #X_test = ss.transform(X_test) 
    select_X_test=selection.transform(X_test)
    y_pred=selection_model.predict(select_X_test)
    predictions=[round(value) for value in y_pred]
    accuracy=accuracy_score(y_test,predictions)
    print("Thresh=%.3f,n=%d,Accuracy:%.2f%%"%(thresh,select_X_train.shape[1],accuracy*100.0))

在这里插入图片描述

# select features using threshold
selection = SelectFromModel(model, threshold=thresh, prefit=True)
select_X_train = selection.transform(X_train)#将训练集转换为为具有选定特征的子集
# train model
selection_model = XGBClassifier()
selection_model.fit(select_X_train, y_train)
# eval model
select_X_test = selection.transform(X_test)
y_pred = selection_model.predict(select_X_test)

特征重要性得分,可以用于在scikit-learn中进行特征选择。通过SelectFromModel类实现,该类采用模型并将数据集转换为具有选定特征的子集。这个类可以采取预先训练的模型,例如在整个数据集上训练的模型。然后,它可以阈值来决定选择哪些特征。当在SelectFromModel实例上调用transform()方法时,该阈值被用于在训练集和测试集上一致性选择相同特征。

在下面的示例中,我们首先在训练集上训练xgboost模型,然后在测试上评估。使用从训练数据集计算的特征重要性,然后,将模型封装在一个SelectFromModel实例中。我们使用这个来选择训练集上的特征,用所选择的特征子集训练模型,然后在相同的特征方案下对测试集进行评估。


版权声明:本文为weixin_45271076原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。