热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XGBOOST从原理到实战:二分类、多分类

注:转载请注明出处,https:blog.csdn.netHHTNAN1.XGBoost2.XGBoost的优点2.1正则化2.2并行处理2.3灵活性2

注:转载请注明出处,https://blog.csdn.net/HHTNAN/

1.XGBoost
2. XGBoost的优点
2.1 正则化
2.2 并行处理
2.3 灵活性
2.4 缺失值处理
2.5 剪枝
2.6 内置交叉验证
3. XGBoost详解
3.1 数据格式
3.2 参数设置
4.模型的训练、预测、保存
4.1 训练模型
4.2模型预测
4.3 保存与加载模型
4.4导出模型和特征映射(Map)
5. XGBoost参数说明
5.1 General Parameters
5.2 Parameters for Tree Booster
5.3 Parameter for Linear Booster
5.4 Task Parameters
6. XGBoost实战
二分类
所属的叶子节点
特征重要性
多分类
两大类接口
基于XGBoost原生接口的分类
基于XGBoost原生接口的回归
基于Scikit-learn接口的分类
基于Scikit-learn接口的回归

1.XGBoost

xgboost是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包,比常见的工具包快10倍以上。在数据科学方面,有大量kaggle选手选用它进行数据挖掘比赛,其中包括两个以上kaggle比赛的夺冠方案。在工业界规模方面,xgboost的分布式版本有广泛的可移植性,支持在YARN, MPI, Sungrid Engine等各个平台上面运行,并且保留了单机并行版本的各种优化,使得它可以很好地解决于工业界规模的问题。 
下载地址:直通车

  1. XGBoost的优点

2.1 正则化

XGBoost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。

2.2 并行处理

XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。

我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

2.3 灵活性

XGBoost支持用户自定义目标函数和评估函数,只要目标函数二阶可导就行。

2.4 缺失值处理

对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向

2.5 剪枝

XGBoost 先从顶到底建立所有可以建立的子树,再从底到顶反向进行剪枝。比起GBM,这样不容易陷入局部最优解。

2.6 内置交叉验证

XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。而GBM使用网格搜索,只能检测有限个值。

  1. XGBoost详解

3.1 数据格式

XGBoost可以加载多种数据格式的训练数据:

libsvm 格式的文本数据;

Numpy 的二维数组;

XGBoost 的二进制的缓存文件。加载的数据存储在对象 DMatrix 中

下面一一列举:

加载libsvm格式的数据

dtrain1 = xgb.DMatrix(‘train.svm.txt’)
1
加载numpy的数组

data = np.random.rand(5,10) # 5 entities, each contains 10 features
label = np.random.randint(2, size=5) # binary target
dtrain = xgb.DMatrix( data, label=label)
1
2
3
将scipy.sparse格式的数据转化为 DMatrix 格式

csr = scipy.sparse.csr_matrix( (dat, (row,col)) )
dtrain = xgb.DMatrix( csr )
1
2
将 DMatrix 格式的数据保存成XGBoost的二进制格式,在下次加载时可以提高加载速度,使用方式如下

dtrain = xgb.DMatrix(‘train.svm.txt’)
dtrain.save_binary(“train.buffer”)
1
2
可以用如下方式处理 DMatrix中的缺失值:

dtrain = xgb.DMatrix( data, label=label, missing = -999.0)
1
当需要给样本设置权重时,可以用如下方式

w = np.random.rand(5,1)
dtrain = xgb.DMatrix( data, label=label, missing = -999.0, weight=w)
1
2
3.2 参数设置

XGBoost使用key-value字典的方式存储参数:

params = {
‘booster’: ‘gbtree’,
‘objective’: ‘multi:softmax’, # 多分类的问题
‘num_class’: 10, # 类别数,与 multisoftmax 并用
‘gamma’: 0.1, # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
‘max_depth’: 12, # 构建树的深度,越大越容易过拟合
‘lambda’: 2, # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
‘subsample’: 0.7, # 随机采样训练样本
‘colsample_bytree’: 0.7, # 生成树时进行的列采样
‘min_child_weight’: 3,
‘silent’: 1, # 设置成1则没有运行信息输出,最好是设置为0.
‘eta’: 0.007, # 如同学习率
‘seed’: 1000,
‘nthread’: 4, # cpu 线程数
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4.模型的训练、预测、保存

4.1 训练模型

有了参数列表和数据就可以训练模型了

num_round = 10
bst = xgb.train( plst, dtrain, num_round, evallist )
1
2
4.2模型预测

X_test类型可以是二维List,也可以是numpy的数组

dtest = DMatrix(X_test)
ans = model.predict(dtest)
1
2
3
4.3 保存与加载模型

在训练完成之后可以将模型保存下来,也可以查看模型内部的结构

bst.save_model('test.model')

1
加载模型 
通过如下方式可以加载模型:

bst = xgb.Booster({‘nthread’:4}) # init model
bst.load_model(“model.bin”) # load data
1
2
4.4导出模型和特征映射(Map)

你可以导出模型到txt文件并浏览模型的含义:

dump model

bst.dump_model(‘dump.raw.txt’)

dump model with feature map

bst.dump_model(‘dump.raw.txt’,‘featmap.txt’)
1
2
3
4
5. XGBoost参数说明

在运行XGboost之前,必须设置三种类型成熟:general parameters,booster parameters和task parameters:

General parameters
1
该参数参数控制在提升(boosting)过程中使用哪种booster,常用的booster有树模型(tree)和线性模型(linear model)。

Booster parameters
1
这取决于使用哪种booster。

Task parameters
1
控制学习的场景,例如在回归问题中会使用不同的参数控制排序。

5.1 General Parameters

booster [default=gbtree]
1
有两中模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。缺省值为gbtree

silent [default=0]

取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时信息。缺省值为0

nthread
1
XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数

num_pbuffer
1
预测缓冲区大小,通常设置为训练实例的数目。缓冲用于保存最后一步提升的预测结果,无需人为设置。

num_feature
1
Boosting过程中用到的特征维数,设置为特征个数。XGBoost会自动设置,无需人为设置。

5.2 Parameters for Tree Booster

eta [default=0.3]
1
为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3 
取值范围为:[0,1]

gamma [default=0]
1
minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be. 
取值范围为:[0,∞]

max_depth [default=6]
1
数的最大深度。缺省值为6 
取值范围为:[1,∞]

min_child_weight [default=1]
1
子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该成熟越大算法越conservative 
取值范围为:[0,∞]

max_delta_step [default=0]
1
我们允许每个树的权重被估计的值。如果它的值被设置为0,意味着没有约束;如果它被设置为一个正值,它能够使得更新的步骤更加保守。通常这个参数是没有必要的,但是如果在逻辑回归中类极其不平衡这时候他有可能会起到帮助作用。把它范围设置为1-10之间也许能控制更新。 
取值范围为:[0,∞]

subsample [default=1]
1
用于训练模型的子样本占整个样本集合的比例。如果设置为0.5则意味着XGBoost将随机的从整个样本集合中随机的抽取出50%的子样本建立树模型,这能够防止过拟合。 
取值范围为:(0,1]

colsample_bytree [default=1]
1
在建立树时对特征采样的比例。缺省值为1 
取值范围为:(0,1]

5.3 Parameter for Linear Booster

lambda [default=0]
1
L2 正则的惩罚系数

alpha [default=0]
1
L1 正则的惩罚系数

lambda_bias
1
在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)

5.4 Task Parameters

objective [ default=reg:linear ]
1
定义学习任务及相应的学习目标,可选的目标函数如下:

“reg:linear” —— 线性回归。
“reg:logistic”—— 逻辑回归。
“binary:logistic”—— 二分类的逻辑回归问题,输出为概率。
“binary:logitraw”—— 二分类的逻辑回归问题,输出的结果为wTx。
“count:poisson”—— 计数问题的poisson回归,输出结果为poisson分布。在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)
“multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)
“multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。没行数据表示样本所属于每个类别的概率。
“rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss
1
2
3
4
5
6
7
8
base_score [ default=0.5 ]
1
所有实例的初始化预测分数,全局偏置; 
为了足够的迭代次数,改变这个值将不会有太大的影响。

eval_metric [ default according to objective ]
1
校验数据所需要的评价指标,不同的目标函数将会有缺省的评价指标(rmse for regression, and error for classification, mean average precision for ranking)

用户可以添加多种评价指标,对于Python用户要以list传递参数对给程序,而不是map参数list参数不会覆盖’eval_metric’

可供的选择如下:

“rmse”: root mean square error
“logloss”: negative log-likelihood
“error”: Binary classification error rate. It is calculated as #(wrong cases)/#(all cases). For the predictions, the evaluation will regard the instances with prediction value larger than 0.5 as positive instances, and the others as negative instances.
“merror”: Multiclass classification error rate. It is calculated as #(wrongcases)#(allcases).
“mlogloss”: Multiclass logloss
“auc”: Area under the curve for ranking evaluation.
“ndcg”:Normalized Discounted Cumulative Gain
“map”:Mean average precision
“ndcg@n”,”map@n”: n can be assigned as an integer to cut off the top positions in the lists for evaluation.
“ndcg-“,”map-“,”ndcg@n-“,”map@n-“: In XGBoost, NDCG and MAP will evaluate the score of a list without any positive samples as 1. By adding “-” in the evaluation metric XGBoost will evaluate these score as 0 to be consistent under some conditions. training repeatively
seed [ default=0 ]
1
2
3
4
5
6
7
8
9
10
11
随机数的种子。缺省值为0

  1. XGBoost实战

XGBoost有两大类接口:XGBoost原生接口 和 scikit-learn接口 ,并且XGBoost能够实现 分类 和 回归 两种任务。对于分类任务,XGBOOST可以实现二分类和多分类,本文从这两个方向入手:

二分类

“”"
使用鸢尾花的数据来说明二分类的问题
“”"
from sklearn import datasets

iris = datasets.load_iris()
data = iris.data[:100]
print (data.shape)

#一共有100个样本数据, 维度为4维
label = iris.target[:100]
print (label)
1
2
3
4
5
6
7
8
9
10
11
12
(100, 4) 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] 
上面分类为0-1二分类,接下来进行模型的预测与评估

from sklearn.cross_validation import train_test_split

train_x, test_x, train_y, test_y = train_test_split(data, label, random_state=0)
import xgboost as xgb
dtrain=xgb.DMatrix(train_x,label=train_y)
dtest=xgb.DMatrix(test_x)

params={‘booster’:‘gbtree’,
‘objective’: ‘binary:logistic’,
‘eval_metric’: ‘auc’,
‘max_depth’:4,
‘lambda’:10,
‘subsample’:0.75,
‘colsample_bytree’:0.75,
‘min_child_weight’:2,
‘eta’: 0.025,
‘seed’:0,
‘nthread’:8,
‘silent’:1}

watchlist = [(dtrain,‘train’)]
bst=xgb.train(params,dtrain,num_boost_round=5,evals=watchlist)
#输出概率
ypred=bst.predict(dtest)

设置阈值, 输出一些评价指标,选择概率大于0.5的为1,其他为0类

y_pred = (ypred >= 0.5)*1

from sklearn import metrics
print (‘AUC: %.4f’ % metrics.roc_auc_score(test_y,ypred))
print (‘ACC: %.4f’ % metrics.accuracy_score(test_y,y_pred))
print (‘Recall: %.4f’ % metrics.recall_score(test_y,y_pred))
print (‘F1-score: %.4f’ %metrics.f1_score(test_y,y_pred))
print (‘Precesion: %.4f’ %metrics.precision_score(test_y,y_pred))
print(metrics.confusion_matrix(test_y,y_pred))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[0] train-auc:1 
[1] train-auc:1 
[2] train-auc:1 
[3] train-auc:1 
[4] train-auc:1 
AUC: 1.0000 
ACC: 1.0000 
Recall: 1.0000 
F1-score: 1.0000 
Precesion: 1.0000 
[[13 0] 
[ 0 12]]

所属的叶子节点

当设置pred_leaf=True的时候, 这时就会输出每个样本在所有树中的叶子节点

ypred_leaf = bst.predict(dtest, pred_leaf=True)
1
[[1 1 1 1 1] 
[2 2 2 2 2] 
[1 1 1 1 1] 
… 
[2 2 2 2 2] 
[1 1 1 1 1]]

输出的维度为[样本数, 树的数量], 树的数量默认是100, 所以ypred_leaf的维度为[100*100].对于第一行数据的解释就是, 在xgboost所有的100棵树里, 预测的叶子节点都是1(相对于每颗树).那怎么看每颗树以及相应的叶子节点的分值呢?这里有两种方法, 可视化树或者直接输出模型.

xgb.to_graphviz(bst, num_trees=0)
#可视化第一棵树的生成情况)

#直接输出模型的迭代工程
bst.dump_model(“model.txt”)
1
2
3
4
5
 
booster[0]: 
0:[f2<2.45] yes&#61;1,no&#61;2,missing&#61;1 
1:leaf&#61;-0.019697 
2:leaf&#61;0.0214286 
booster[1]: 
0:[f2<2.35] yes&#61;1,no&#61;2,missing&#61;1 
1:leaf&#61;-0.0212184 
2:leaf&#61;0.0212 
booster[2]: 
0:[f2<2.35] yes&#61;1,no&#61;2,missing&#61;1 
1:leaf&#61;-0.0197404 
2:leaf&#61;0.0197235 
booster[3]: 
0:[f2<2.6] yes&#61;1,no&#61;2,missing&#61;1 
1:leaf&#61;-0.0161663 
2:leaf&#61;0.0219079 
booster[4]: 
0:[f2<2.45] yes&#61;1,no&#61;2,missing&#61;1 
1:leaf&#61;-0.0185029 
2:leaf&#61;0.0213033

通过上述命令就可以输出模型的迭代过程, 可以看到每颗树都有两个叶子节点(树比较简单). 然后我们对每颗树中的叶子节点1的value进行累加求和, 同时进行相应的函数转换, 就是第一个样本的预测值. 
在这里, 以第一个样本为例, 可以看到, 该样本在所有树中都属于第一个叶子, 所以累加值, 得到以下值.

同样, 以第二个样本为例, 可以看到, 该样本在所有树中都属于第二个叶子, 所以累加值, 得到以下值.

leaf1 -1.381214 
leaf2 1.410950 
在使用xgboost模型最开始, 模型初始化的时候, 我们就设置了’objective’: ‘binary:logistic’, 因此使用函数将累加的值转换为实际的打分: 
f(x)&#61;1/(1&#43;exp(−x))f(x)&#61;1/(1&#43;exp(−x))

1/float(1&#43;np.exp(1.38121416))
1/float(1&#43;np.exp(-1.410950))
1
2
0.20081407112186503 
0.8039157403338895 
这就与ypred &#61; bst.predict(dtest) 的分值相对应上了.

特征重要性

接着, 我们看另一种输出方式, 输出的是特征相对于得分的重要性.

ypred_contribs &#61; bst.predict(dtest, pred_contribs&#61;True)
ypred_contribs
1
2
[[ 0. 0. -0.10902276 0. 0.01369767] 
[ 0. 0. 0.09186566 0. 0.01369767] 
[ 0. 0. -0.10902276 0. 0.01369767] 
[ 0. 0. 0.09186566 0. 0.01369767] 
… 
[ 0. 0. 0.09186566 0. 0.01369767] 
[ 0. 0. -0.10902276 0. 0.01369767] 
[ 0. 0. 0.09186566 0. 0.01369767] 
[ 0. 0. -0.10902276 0. 0.01369767]] 
输出的ypred_contribs的维度为[100,4], 前面的四列分别是每个特征对最后打分的影响因子, 可以看出, 前面两个特征是不起作用的.

多分类

多分类皮肤病预测

import numpy as np
from sklearn.model_selection import train_test_split
import xgboost as xgb
from sklearn.metrics import mean_squared_error
#33: lambda x:int(x &#61;&#61; ‘?’) 将第33列?转化为0 &#xff0c;对应第34列数值-1
data &#61; np.loadtxt(‘dermatology.data.txt’, delimiter&#61;’,’,converters&#61;{33: lambda x:int(x &#61;&#61; ‘?’), 34: lambda x:int(x)-1} )
sz&#61;data.shape
X,Y&#61;data[:,0:33],data[:,34]
X_train, X_test, y_train, y_test &#61; train_test_split(X, Y, test_size&#61;0.3, random_state&#61;0)
#加载numpy的数组到DMatrix对象
xg_train &#61; xgb.DMatrix(X_train, label&#61;y_train)
xg_test &#61; xgb.DMatrix( X_test, label&#61;y_test)
#1.训练模型

setup parameters for xgboost

param &#61; {}

use softmax multi-class classification

param[‘objective’] &#61; ‘multi:softmax’

scale weight of positive examples

param[‘eta’] &#61; 0.1
param[‘max_depth’] &#61; 6
param[‘silent’] &#61; 1
param[‘nthread’] &#61; 4
param[‘num_class’] &#61; 6

watchlist &#61; [ (xg_train,‘train’), (xg_test, ‘test’) ]
num_round &#61; 6
bst &#61; xgb.train(param, xg_train, num_round, watchlist );

pred &#61; bst.predict( xg_test );
print (‘predicting, classification error&#61;%f’ % (sum( int(pred[i]) !&#61; y_test[i] for i in range(len(y_test))) / float(len(y_test)) ))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[0] train-merror:0.023438 test-merror:0.063636 
[1] train-merror:0.015625 test-merror:0.045455 
[2] train-merror:0.015625 test-merror:0.036364 
[3] train-merror:0.007813 test-merror:0.036364 
[4] train-merror:0.007813 test-merror:0.036364 
[5] train-merror:0.007813 test-merror:0.018182 
predicting, classification error&#61;0.018182

#2.probabilities

do the same thing again, but output probabilities

param[‘objective’] &#61; ‘multi:softprob’
bst &#61; xgb.train(param, xg_train, num_round, watchlist );

Note: this convention has been changed since xgboost-unity
get prediction, this is in 1D array, need reshape to (ndata, nclass)

yprob &#61; bst.predict( xg_test ).reshape( y_test.shape[0], 6 )
#从预测的6组中选择最大的概率进行输出
ylabel &#61; np.argmax(yprob, axis&#61;1) # return the index of the biggest pro

print (‘predicting, classification error&#61;%f’ % (sum( int(ylabel[i]) !&#61; y_test[i] for i in range(len(y_test))) / float(len(y_test)) ))
#最小二乘方差
mse2 &#61; mean_squared_error(y_test,ylabel)

print(mse2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[0] train-merror:0.023438 test-merror:0.063636 
[1] train-merror:0.015625 test-merror:0.045455 
[2] train-merror:0.015625 test-merror:0.036364 
[3] train-merror:0.007813 test-merror:0.036364 
[4] train-merror:0.007813 test-merror:0.036364 
[5] train-merror:0.007813 test-merror:0.018182 
predicting, classification error&#61;0.018182 
0.07272727272727272

from sklearn import metrics
print (‘ACC: %.4f’ % metrics.accuracy_score(y_test,ylabel))
print(metrics.confusion_matrix(y_test,ylabel))
1
2
3
ACC: 0.9818 
[[27 0 0 0 0 0] 
[ 0 19 0 1 0 0] 
[ 0 0 21 0 0 0] 
[ 0 1 0 17 0 0] 
[ 0 0 0 0 16 0] 
[ 0 0 0 0 0 8]]

显示重要特征

plot_importance(bst)
plt.show()
1
2
3

两大类接口

基于XGBoost原生接口的分类

from sklearn.datasets import load_iris
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split

read in the iris data

iris &#61; load_iris()

X &#61; iris.data
y &#61; iris.target

X_train, X_test, y_train, y_test &#61; train_test_split(X, y, test_size&#61;0.2, random_state&#61;1234565)

params &#61; {
‘booster’: ‘gbtree’,
‘objective’: ‘multi:softmax’,
‘num_class’: 3,
‘gamma’: 0.1,
‘max_depth’: 6,
‘lambda’: 2,
‘subsample’: 0.7,
‘colsample_bytree’: 0.7,
‘min_child_weight’: 3,
‘silent’: 1,
‘eta’: 0.1,
‘seed’: 1000,
‘nthread’: 4,
}

plst &#61; params.items()

dtrain &#61; xgb.DMatrix(X_train, y_train)
num_rounds &#61; 500
model &#61; xgb.train(plst, dtrain, num_rounds)

对测试集进行预测

dtest &#61; xgb.DMatrix(X_test)
ans &#61; model.predict(dtest)

计算准确率

cnt1 &#61; 0
cnt2 &#61; 0
for i in range(len(y_test)):
if ans[i] &#61;&#61; y_test[i]:
cnt1 &#43;&#61; 1
else:
cnt2 &#43;&#61; 1

print("Accuracy: %.2f %% " % (100 * cnt1 / (cnt1 &#43; cnt2)))

显示重要特征

plot_importance(model)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
基于XGBoost原生接口的回归

import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split

读取文件原始数据

data &#61; []
labels &#61; []
labels2 &#61; []
with open(“lppz5.csv”, encoding&#61;‘UTF-8’) as fileObject:
for line in fileObject:
line_split &#61; line.split(’,’)
data.append(line_split[10:])
labels.append(line_split[8])

X &#61; []
for row in data:
row &#61; [float(x) for x in row]
X.append(row)

y &#61; [float(x) for x in labels]

XGBoost训练过程

X_train, X_test, y_train, y_test &#61; train_test_split(X, y, test_size&#61;0.2, random_state&#61;0)

params &#61; {
‘booster’: ‘gbtree’,
‘objective’: ‘reg:gamma’,
‘gamma’: 0.1,
‘max_depth’: 5,
‘lambda’: 3,
‘subsample’: 0.7,
‘colsample_bytree’: 0.7,
‘min_child_weight’: 3,
‘silent’: 1,
‘eta’: 0.1,
‘seed’: 1000,
‘nthread’: 4,
}

dtrain &#61; xgb.DMatrix(X_train, y_train)
num_rounds &#61; 300
plst &#61; params.items()
model &#61; xgb.train(plst, dtrain, num_rounds)

对测试集进行预测

dtest &#61; xgb.DMatrix(X_test)
ans &#61; model.predict(dtest)

显示重要特征

plot_importance(model)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
基于Scikit-learn接口的分类

from sklearn.datasets import load_iris
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split

read in the iris data

iris &#61; load_iris()

X &#61; iris.data
y &#61; iris.target

X_train, X_test, y_train, y_test &#61; train_test_split(X, y, test_size&#61;0.2, random_state&#61;0)

训练模型

model &#61; xgb.XGBClassifier(max_depth&#61;5, learning_rate&#61;0.1, n_estimators&#61;160, silent&#61;True, objective&#61;‘multi:softmax’)
model.fit(X_train, y_train)

对测试集进行预测

ans &#61; model.predict(X_test)

计算准确率

cnt1 &#61; 0
cnt2 &#61; 0
for i in range(len(y_test)):
if ans[i] &#61;&#61; y_test[i]:
cnt1 &#43;&#61; 1
else:
cnt2 &#43;&#61; 1

print("Accuracy: %.2f %% " % (100 * cnt1 / (cnt1 &#43; cnt2)))

显示重要特征

plot_importance(model)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
基于Scikit-learn接口的回归

import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split

读取文件原始数据

data &#61; []
labels &#61; []
labels2 &#61; []
with open(“lppz5.csv”, encoding&#61;‘UTF-8’) as fileObject:
for line in fileObject:
line_split &#61; line.split(’,’)
data.append(line_split[10:])
labels.append(line_split[8])

X &#61; []
for row in data:
row &#61; [float(x) for x in row]
X.append(row)

y &#61; [float(x) for x in labels]

XGBoost训练过程

X_train, X_test, y_train, y_test &#61; train_test_split(X, y, test_size&#61;0.2, random_state&#61;0)

model &#61; xgb.XGBRegressor(max_depth&#61;5, learning_rate&#61;0.1, n_estimators&#61;160, silent&#61;True, objective&#61;‘reg:gamma’)
model.fit(X_train, y_train)

对测试集进行预测

ans &#61; model.predict(X_test)

显示重要特征

plot_importance(model)
plt.show()
————————————————
版权声明&#xff1a;本文为CSDN博主「DemonHunter211」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。
原文链接&#xff1a;https://blog.csdn.net/kwame211/article/details/81098025


推荐阅读
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 深度学习与神经网络——邱锡鹏
    深度学习与神经网络——邱锡鹏-一、绪论人工智能的一个子领域神经网络:一种以(人工))神经元为基本单元的模型深度学习:一类机器学习问题,主要解决贡献度分配问题知识结构:路线图:顶 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文介绍了Python字典视图对象的示例和用法。通过对示例代码的解释,展示了字典视图对象的基本操作和特点。字典视图对象可以通过迭代或转换为列表来获取字典的键或值。同时,字典视图对象也是动态的,可以反映字典的变化。通过学习字典视图对象的用法,可以更好地理解和处理字典数据。 ... [详细]
  • 湍流|低频_youcans 的 OpenCV 例程 200 篇106. 退化图像的逆滤波
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了youcans的OpenCV例程200篇106.退化图像的逆滤波相关的知识,希望对你有一定的参考价值。 ... [详细]
  •   数据挖掘作为近年来新兴的一门计算机边缘学科,其在国内外引起了越来越多的关注。并且随着数据挖掘技术的不断改进和数据挖掘工具的不断完善,数据挖掘必将在各行各业中得到广泛的应用。   ... [详细]
  • 产教融合,共塑未来”,CIE 2018 中国 IT 教育博鳌论坛盛大落幕
    2018年11月10-11日,为期两天的“2018中国IT教育博鳌论坛”落下帷幕。2018年11月10-11日,为推动中国IT人才引进与培养࿰ ... [详细]
  • 知识点1.Relu(RectifiedLinerUints整流线性单元)激活函数:max(0,z)神经网络中常用ReLU激活函数,与机器学习课程里面提到的sigmoid激活函数 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 分享篇:第十届“泰迪杯”数据挖掘挑战赛农田害虫图像识别(特等奖)一
    1.1赛题背景昆虫的种类浩如烟海,农田常见的昆虫是人工生态系统的重要组成部分。分辨益虫和害虫,保留益虫,消灭害虫,对于减轻害 ... [详细]
  • bat大牛带你深度剖析android 十大开源框架_请收好!5大领域,21个必知的机器学习开源工具...
    全文共3744字,预计学习时长7分钟本文将介绍21个你可能没使用过的机器学习开源工具。每个开源工具都为数据科学家处理数据库提供了不同角度。本文将重点介绍五种机器学习的 ... [详细]
  • 必备核心算法神经网络通俗讲解
    深度学习传统算法VS人工智能算法传统算法:都是人为去计算人工智能算法:部分人为需要做的事情交由机器去做【把更多的问题简单化】IT的发展比较高端的就是A ... [详细]
  • 搞定问题描述的5W2H法是什么
    作者:拿破仑的DO君来源:数据氧气数据氧气的第27篇原创,预计阅读6min作为职场人士,我们在做分析以及工作时,常常在想如何快速解决问题。可能会忽略一点,解决问题中基础很重要,是对 ... [详细]
author-avatar
KellylikePchy_224
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有