首页 > 编程知识 正文

xgboost特征选择,xgboost特征选择原理

时间:2023-05-05 07:29:10 阅读:275167 作者:4004

使用像梯度增强这样的决策树方法的集合的一个好处是,它们可以从经过训练的预测模型中自动提供特征重要性的估计。

在这篇文章中,您将发现如何使用Python中的XGBoost库估计特性对于预测建模问题的重要性。

读完这篇文章你就会知道:

如何使用梯度增强算法计算特征的重要性。
如何在Python中绘制由XGBoost模型计算的特性重要性。
如何使用XGBoost计算的特性重要性来执行特性选择。

让我们开始吧。

特征在梯度增强中的重要性

使用梯度增强的一个好处是,在构造了增强的树之后,检索每个属性的重要性得分相对简单。

一般来说,重要性提供了一个评分,它表明每个特性在模型中增强决策树的构建中有多有用或多有价值。属性用于使用决策树做出关键决策的次数越多,其相对重要性就越高。

这个重要性是为数据集中的每个属性显式计算的,允许属性之间进行排序和比较。

对于单个决策树,重要性是通过每个属性分割点改进性能度量的数量来计算的,权重是通过节点负责观察的数量来计算的。性能指标可以是纯度(基尼指数),用来选择分割点或其他更具体的误差函数。

然后,对模型中所有决策树的特征重要性进行平均。

手动绘制特性重要性

一个经过训练的XGBoost模型会自动计算出预测建模问题中特性的重要性。

这些重要性评分可以在训练模型的feature_importances_成员变量中获得。例如,它们可以直接打印如下:

print(model.feature_importances_)

我们可以在柱状图上直接绘制这些分数,以直观地显示数据集中每个特性的相对重要性。例如:

# plotpyplot.bar(range(len(model.feature_importances_)), model.feature_importances_)pyplot.show()

我们可以通过在Pima indian onset of diabetes数据集上训练一个XGBoost模型,并根据计算出的特征重要性创建一个条形图(更新:从这里下载)来演示这一点。

# plot feature importance manuallyfrom numpy import loadtxtfrom xgboost import XGBClassifierfrom matplotlib import pyplot# load datadataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")# split data into X and yX = dataset[:,0:8]y = dataset[:,8]# fit model no training datamodel = XGBClassifier()model.fit(X, y)# feature importanceprint(model.feature_importances_)# plotpyplot.bar(range(len(model.feature_importances_)), model.feature_importances_)pyplot.show()

运行这个例子首先输出重要性得分:

[ 0.089701 0.17109634 0.08139535 0.04651163 0.10465116 0.2026578 0.1627907 0.14119601]

我们还得到了相对重要性的条形图。

这个图的一个缺点是,这些特性是根据它们的输入索引而不是它们的重要性排序的。我们可以在绘图之前对特性进行排序。

值得庆幸的是,plot中内置了一个函数来帮助我们。

使用内置的XGBoost功能的重要性图

XGBoost库提供了一个内置函数来绘制按重要性排序的特性。

该函数称为plot_importance(),可以使用如下:

# plot feature importanceplot_importance(model)pyplot.show()

例如,下面是一个完整的代码清单,它使用内置的plot_importance()函数绘制Pima Indians数据集的特性重要性。

# plot feature importance using built-in functionfrom numpy import loadtxtfrom xgboost import XGBClassifierfrom xgboost import plot_importancefrom matplotlib import pyplot# load datadataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")# split data into X and yX = dataset[:,0:8]y = dataset[:,8]# fit model no training datamodel = XGBClassifier()model.fit(X, y)# plot feature importanceplot_importance(model)pyplot.show()

运行这个例子可以得到一个更有用的柱状图。

您可以看到,特性是根据输入数组(X)中从F0到F7的索引自动命名的。

手动将这些指标映射到问题描述中的名称,我们可以看到图中显示F5(身体质量指数)的重要性最高,F3(皮肤褶皱厚度)的重要性最低。

使用XGBoost特性重要性评分选择特性

特征重要性评分可用于科学技术学习中的特征选择。

这是使用SelectFromModel类完成的,该类接受一个模型,可以将数据集转换为具有所选特性的子集。

这个类可以使用一个预训练的模型,例如一个在整个训练数据集上训练的模型。然后,它可以使用阈值来决定选择哪些特性。当您在SelectFromModel实例上调用transform()方法以一致地在训练数据集和测试数据集上选择相同的特性时,将使用此阈值。

在下面的示例中,我们首先对整个训练数据集和测试数据集分别训练和评估XGBoost模型。

然后,使用从训练数据集中计算的特性重要性,将模型封装在SelectFromModel实例中。我们使用它来选择训练数据集中的特性,从所选的特性子集中训练一个模型,然后根据相同的特性选择方案在测试集中评估模型。

例如:

# select features using thresholdselection = SelectFromModel(model, threshold=thresh, prefit=True)select_X_train = selection.transform(X_train)# train modelselection_model = XGBClassifier()selection_model.fit(select_X_train, y_train)# eval modelselect_X_test = selection.transform(X_test)y_pred = selection_model.predict(select_X_test)

出于兴趣,我们可以测试多个阈值来根据特性的重要性选择特性。具体来说,每个输入变量的特性重要性,本质上允许我们按重要性测试每个特性子集,从所有特性开始,以最重要特性的子集结束。

下面提供了完整的代码清单。

# use feature importance for feature selectionfrom numpy import loadtxtfrom numpy import sortfrom xgboost import XGBClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scorefrom sklearn.feature_selection import SelectFromModel# load datadataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")# split data into X and yX = dataset[:,0:8]Y = dataset[:,8]# split data into train and test setsX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)# fit model on all training datamodel = XGBClassifier()model.fit(X_train, y_train)# make predictions for test data and evaluatey_pred = model.predict(X_test)predictions = [round(value) for value in y_pred]accuracy = accuracy_score(y_test, predictions)print("Accuracy: %.2f%%" % (accuracy * 100.0))# Fit model using each importance as a thresholdthresholds = sort(model.feature_importances_)for thresh in thresholds:# select features using thresholdselection = SelectFromModel(model, threshold=thresh, prefit=True)select_X_train = selection.transform(X_train)# train modelselection_model = XGBClassifier()selection_model.fit(select_X_train, y_train)# eval modelselect_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))

运行此示例将输出以下输出:

Accuracy: 77.95%Thresh=0.071, n=8, Accuracy: 77.95%Thresh=0.073, n=7, Accuracy: 76.38%Thresh=0.084, n=6, Accuracy: 77.56%Thresh=0.090, n=5, Accuracy: 76.38%Thresh=0.128, n=4, Accuracy: 76.38%Thresh=0.160, n=3, Accuracy: 74.80%Thresh=0.186, n=2, Accuracy: 71.65%Thresh=0.208, n=1, Accuracy: 63.78%

我们可以看到,模型的性能通常随着所选特征的数量而下降。

在这个问题上,为了测试集的精度,需要权衡一些特性,我们可以选择一个不那么复杂的模型(更少的属性,比如n=4),并接受将估计精度从77.95%适度降低到76.38%。

总结

在这篇文章中,您发现了如何在一个经过训练的XGBoost梯度增强模型中选择特性和使用重要性。

具体来说,你学会了:

特性的重要性是什么,以及在XGBoost中如何计算特性的重要性。
如何从XGBoost模型访问和绘制功能的重要性评分。
如何使用XGBoost模型中的特性重要性进行特性选择。对于这样一个小的数据集,这可能是一种冲击,但是对于更大的数据集,使用交叉验证作为模型评估方案可能是一种更有用的策略。

原文出处

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。