XGboost--特征选择

为了使XGBoost能够使用我们的数据,我们需要将其转换为XGBoost能够处理的特定格式。这种格式称为DMatrix。这是一个非常简单的线性数字数组的数据转换为DMatrix格式:

1D_train = xgb.DMatrix(X_train, label=Y_train)
2D_test = xgb.DMatrix(X_test, label=Y_test)

定义XGBoost模型

既然我们的数据都加载了,我们就可以定义梯度升级集成的参数。我们在下面设置了一些最重要的项目,以帮助我们开始工作。对于更复杂的任务和模型,可以在XGBoost官方网站上获得完整的可能参数列表。

1param = {
2    'eta': 0.3, 
3    'max_depth': 3,  
4    'objective': 'multi:softprob',  
5    'num_class': 3} 
6
7steps = 20  # The number of training iterations

最简单的参数是max_depth(正在训练的决策树的最大深度)、objective(正在使用的损失函数)和num_class(数据集中类的数量)。eta算法需要特别注意。

根据我们的理论,梯度提升涉及到创建决策树并将其依次添加到一个集合模型中。创建新的树来纠正现有集合预测中的残余误差。

由于合奏的本质,即将多个模型组合在一起,形成一个本质上非常大、复杂的合奏,使得这种技术容易过度拟合。ETA参数使我们有机会防止这种过度拟合。

可以更直观地将eta视为学习率。eta不是简单地将新树的预测添加到整个权重中,而是将其与正在添加的残差相乘,以减少它们的权重。这有效地降低了整个模型的复杂性。

通常在0.1到0.3范围内具有较小的值。这些残差的较小权重仍将有助于我们培养一个强大的模型,但不会让该模型陷入更可能发生过度拟合的深层复杂性。
培训和测试
我们最终可以训练我们的模型,就像我们用Scikit Learn做的那样:`

1model = xgb.train(param, D_train, steps)
现在让我们运行一个评测。同样,这个过程与Scikit学习中的培训模型非常相似:
1import numpy as np
2from sklearn.metrics import precision_score, recall_score, accuracy_score
3
4preds = model.predict(D_test)
5best_preds = np.asarray([np.argmax(line) for line in preds])
6
7print("Precision = {}".format(precision_score(Y_test, best_preds, average='macro')))
8print("Recall = {}".format(recall_score(Y_test, best_preds, average='macro')))
9print("Accuracy = {}".format(accuracy_score(Y_test, best_preds)))

XGBoost的进一步探索
以上只是对XGBoost的基础知识的总结。但是还有一些更酷的功能可以帮助你充分利用你的模型。

Gamma参数也有助于控制过拟合。它指定了在树的叶节点上进行进一步分区所需的最小损失减少量。也就是说,如果创建一个新节点不能减少一定数量的损失,那么我们就根本不会创建它。
Booster参数允许您设置构建集成时将使用的模型类型。默认值是gbtree,它构建一组决策树。如果您的数据不太复杂,您可以使用更快更简单的gblinear选项来构建一组线性模型。
设置任何ML模型的最优超参数都是一个挑战。那么为什么不让Scikit为你学习呢?我们可以很容易地将Scikit Learn的网格搜索与XGBoost分类器结合起来

 1from sklearn.model_selection import GridSearchCV
 2
 3clf = xgb.XGBClassifier()
 4parameters = {
 5     "eta"    : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30 ] ,
 6     "max_depth"        : [ 3, 4, 5, 6, 8, 10, 12, 15],
 7     "min_child_weight" : [ 1, 3, 5, 7 ],
 8     "gamma"            : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ],
 9     "colsample_bytree" : [ 0.3, 0.4, 0.5 , 0.7 ]
10     }
11
12grid = GridSearchCV(clf,
13                    parameters, n_jobs=4,
14                    scoring="neg_log_loss",
15                    cv=3)
16
17grid.fit(X_train, Y_train)

只有在你有时间的时候才在大数据集上做这个——做一个网格搜索实际上是多次训练一个决策树的集合!

一旦你的XGBoost模型被训练好,你可以将人类可读的描述转储到文本文件中:

1model.dump_model('dump.raw.txt')

xgboost get_fscore 判断特征重要程度的三种指标
get_fscore 有三种种评判特征重要程度的方法:

‘weight’ - the number of times a feature is used to split the data across all trees.
‘gain’ - the average gain of the feature when it is used in trees.
‘cover’ - the average coverage of the feature when it is used in trees.


weight - 该特征在所有树中被用作分割样本的特征的次数。
gain - 在所有树中的平均增益。
cover - 在树中使用该特征时的平均覆盖范围。(还不是特别明白)
xgboost如何用于特征选择?
相信很多做过数据挖掘比赛的人都利用xgboost来做特征选择。
一般我们调用xgb库的get_fscore()。但其实xgboost里面有三个指标用于对特征进行评价,而get_fscore()只是其中一个指标weight。
这个指标大部分人都很熟悉,其代表着某个特征被选作分裂的次数。
比如在前面举的例子里,我们得到这两颗树:
https://www.jianshu.com/p/ac1c12f3fba1
可以看到特征x1被选作分裂点的次数为6 (在同一棵树中可以反复选择一个特征),x2被选做分裂点的次数为2。
get_fscore()就是返回这个指标。

而xgboost还提供了另外两个指标,一个叫gain,一个叫cover。可以利用get_score()来选择。
https://blog.csdn.net/qq_22238533/article/details/79477547

你可能感兴趣的:(XGboost--特征选择)