为了使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