史上最详细的xgboost实战

author author     2022-10-02     132

关键词:


接下来安装,并最终选择将Python加入环境变量中。
安装依赖包
去网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/中去下载你所需要的如下Python安装包:

numpy-1.13.1+mkl-cp36-cp36m-win_amd64.whl
scipy-0.19.1-cp36-cp36m-win_amd64.whl
xgboost-0.6-cp36-cp36m-win_amd64.whl
假设上述三个包所在的目录为D:Application,则运行Windows 命令行运行程序cmd,并将当前目录转到这两个文件所在的目录下。并依次执行如下操作安装这两个包:

>> pip install numpy-1.13.1+mkl-cp36-cp36m-win_amd64.whl
>> pip install scipy-0.19.1-cp36-cp36m-win_amd64.whl
>> pip install xgboost-0.6-cp36-cp36m-win_amd64.whl
安装Scikit-learn

众所周知,scikit-learn是Python机器学习最著名的开源库之一。因此,我们需要安装此库。执行如下命令安装scikit-learn机器学习库:

>> pip install -U scikit-learn
1
测试安装是否成功
>>> from sklearn import svm
>>> X = [[0, 0], [1, 1]]
>>> y = [0, 1]
>>> clf = svm.SVC()
>>> clf.fit(X, y)
>>> clf.predict([[2., 2.]])
array([1])
>>> import xgboost as xgb
注意:如果如上所述正确输出,则表示安装完成。否则就需要检查安装步骤是否出错,或者系统是否缺少必要的Windows依赖库。常用的一般情况会出现缺少VC++运行库,在Windows 7、8、10等版本中安装Visual C++ 2015基本上就能解决问题。

安装PyCharm

对于PyChram的下载,请点击PyCharm官网去下载,当然windows下软件的安装不用解释,傻瓜式的点击 下一步 就行了。

这里写图片描述
注意:PyCharm软件是基于Java开发的,所以安装该集成开发环境前请先安装JDK,建议安装JDK1.8。

经过上述步骤,基本上软件环境的问题全部解决了,接下来就是实际的XGBoost库实战了……

2. 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使用网格搜索,只能检测有限个值。

3. XGBoost详解

3.1 数据格式

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

libsvm 格式的文本数据;

Numpy 的二维数组;

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

下面一一列举:

加载libsvm格式的数据
>>> dtrain1 = xgb.DMatrix(‘train.svm.txt‘)
1
加载二进制的缓存文件
>>> dtrain2 = xgb.DMatrix(‘train.svm.buffer‘)
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( www.feityl.com (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, www.longboshyl.cn 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,
3.3 训练模型

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

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

# X_test类型可以是二维List,也可以是numpy的数组
dtest = DMatrix(X_test)
ans = model.predict(www.wandiansoft.com dtest)
1
2
3
3.5 保存模型

在训练完成之后可以将模型保存下来,也可以查看模型内部的结构
bst.save_model(‘test.model‘)
1
导出模型和特征映射(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
3.6 加载模型

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

bst = xgb.Booster({‘nthread‘:4}) # init model
bst.load_model("model.bin") # load data
1
2
4. XGBoost参数详解

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

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

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

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

4.1 General Parameters

booster [default=gbtree www.ylzx1980.com]

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

silent [default=0]

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

nthread

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

num_pbuffer

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

num_feature

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

4.2 Parameters for Tree Booster

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

gamma [default=0]
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]
数的最大深度。缺省值为6
取值范围为:[1,∞]

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

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

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

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

4.3 Parameter for Linear Booster

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

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

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

4.4 Task Parameters

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

“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
base_score [ default=0.5 ]

所有实例的初始化预测分数,全局偏置;
为了足够的迭代次数,改变这个值将不会有太大的影响。
eval_metric [ default according to objective ]

校验数据所需要的评价指标,不同的目标函数将会有缺省的评价指标(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
[email protected]”,”[email protected]”: n can be assigned as an integer to cut off the top positions in the lists for evaluation.
“ndcg-“,”map-“,”[email protected]“,”[email protected]“: 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 ]

随机数的种子。缺省值为0
5. XGBoost实战

  XGBoost有两大类接口:XGBoost原生接口 和 scikit-learn接口 ,并且XGBoost能够实现 分类 和 回归 两种任务。因此,本章节分四个小块来介绍!

5.1 基于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 = load_iris()

X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234565)

params = {
‘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 = params.items()


dtrain = xgb.DMatrix(X_train, y_train)
num_rounds = 500
model = xgb.train(plst, dtrain, num_rounds)

# 对测试集进行预测
dtest = xgb.DMatrix(X_test)
ans = model.predict(dtest)

# 计算准确率
cnt1 = 0
cnt2 = 0
for i in range(len(y_test)):
if ans[i] == y_test[i]:
cnt1 += 1
else:
cnt2 += 1

print("Accuracy: %.2f %% " % (100 * cnt1 / (cnt1 + cnt2)))

# 显示重要特征
plot_importance(model)
plt.show()
输出预测正确率以及特征重要性:

Accuracy: 96.67 %
1
这里写图片描述
5.2 基于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 = []
labels = []
labels2 = []
with open("lppz5.csv", encoding=‘UTF-8‘) as fileObject:
for line in fileObject:
line_split = line.split(‘,‘)
data.append(line_split[10:])
labels.append(line_split[8])

X = []
for row in data:
row = [float(x) for x in row]
X.append(row)

y = [float(x) for x in labels]

# XGBoost训练过程
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

params = {
‘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 = xgb.DMatrix(X_train, y_train)
num_rounds = 300
plst = params.items()
model = xgb.train(plst, dtrain, num_rounds)

# 对测试集进行预测
dtest = xgb.DMatrix(X_test)
ans = model.predict(dtest)

# 显示重要特征
plot_importance(model)
重要特征(值越大,说明该特征越重要)显示结果:

这里写图片描述
5.3 基于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 = load_iris()

X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练模型
model = xgb.XGBClassifier(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective=‘multi:softmax‘)
model.fit(X_train, y_train)

# 对测试集进行预测
ans = model.predict(X_test)

# 计算准确率
cnt1 = 0
cnt2 = 0
for i in range(len(y_test)):
if ans[i] == y_test[i]:
cnt1 += 1
else:
cnt2 += 1

print("Accuracy: %.2f %% " % (100 * cnt1 / (cnt1 + cnt2)))

# 显示重要特征
plot_importance(model)
plt.show()
输出预测正确率以及特征重要性:

Accuracy: 100.00 %
1
这里写图片描述
5.4 基于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 = []
labels = []
labels2 = []
with open("lppz5.csv", encoding=‘UTF-8‘) as fileObject:
for line in fileObject:
line_split = line.split(‘,‘)
data.append(line_split[10:])
labels.append(line_split[8])

X = []
for row in data:
row = [float(x) for x in row]
X.append(row)

y = [float(x) for x in labels]

# XGBoost训练过程
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

model = xgb.XGBRegressor(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective=‘reg:gamma‘)
model.fit(X_train, y_train)

# 对测试集进行预测
ans = model.predict(X_test)

# 显示重要特征
plot_importance(model)
plt.show()
重要特征(值越大,说明该特征越重要)显示结果:

python爬虫入门到实战-史上最详细的爬虫教程

马哥高薪实战学员【Python爬虫入门到实战-史上最详细的爬虫教程,限时免费领取】爬虫分类和ROBOTS协议爬虫URLLIB使用和进阶爬虫URL编码和GETPOST请求 查看详情

python爬虫入门到实战-史上最详细的爬虫教程

马哥高薪实战学员【Python爬虫入门到实战-史上最详细的爬虫教程,限时免费领取】爬虫分类和ROBOTS协议爬虫URLLIB使用和进阶爬虫URL编码和GETPOST请求 查看详情

kafka史上最详细原理总结

Kafka史上最详细原理总结一、概念理解(1)产生背景(2)Kafka的特性(3)Kafka场景应用(4)Kafka一些重要设计思想二、消息队列通信的模式(1)点对点模式(2)发布订阅模式三、Kafk... 查看详情

史上最详细的sqlmap使用教程(代码片段)

史上最详细的sqlmap使用教程1.sqlmap简介2.初级扫描方案探测是否存在sql注入漏洞查看数据库信息3.高级扫描方案绕过waf探测等级和危险等级(—level—risk)伪造HttpReferer头部执行指定的SQL语句(—sql-shell)执行操作系统命令(—os-shell)读... 查看详情

100天精通oracle-实战系列(第2天)史上最详细linux6安装单机oracle11gr2数据库

100天精通Oracle-实战系列(第2天)Linux6安装Oracle11GR2数据库一、Linux6系统安装二、Linux系统配置1、环境信息2、配置网络3、关闭防火墙4、关闭Selinux5、远程连接主机6、配置yum源7、安装依赖包8、配置hosts9、创建用户和组10、创建安... 查看详情

kafka史上最详细原理总结

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、... 查看详情

kafka史上最详细原理总结

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、... 查看详情

spark运行原理史上最详细

https://blog.csdn.net/lovechendongxing/article/details/81746988Spark应用程序以进程集合为单位在分布式集群上运行,通过driver程序的main方法创建的SparkContext对象与集群交互。1、Spark通过SparkContext向Clustermanager(资源管理器)申请所需执行的资源... 查看详情

史上最详细的接口测试

目录序什么是接口为什么做接口测试接口测试的模板接口的构成http常用的请求方式接口测试的重点接口测试的质量评估标准接口模拟测试http状态码列表序大多数人对于接口测试都觉得是一种高大上的测试,觉得学会接口测试就... 查看详情

gradle史上最详细解析

前言对于Android工程师来说编译/打包等问题立即就成痛点了。一个APP有多个版本,Release版、Debug版、Test版。甚至针对不同APPStore都有不同的版本。在以前ROM的环境下,虽然可以配置Android.mk,但是需要依赖整个Android源码,而且还... 查看详情

史上最详细ajax学习笔记(代码片段)

1、Ajax快速入门1.1、AJAX介绍AJAX(AsynchronousJavaScriptAndXML):异步的JavaScript和XML。本身不是一种新技术,而是多个技术综合。用于快速创建动态网页的技术。一般的网页如果需要更新内容,必需重新加载个页面。而AJAX通过浏览器与服... 查看详情

史上最详细windows下安装binwalk

1.https://github.com/ReFirmLabs/binwalk到这里下载binwalk,下载后解压。2.找到下载后的文件夹,在这里要进行安装步骤,一边按着shift,一边按着鼠标右键,点击在此处打开命令窗口。输入pythonsetup.pyinstall安装完成:3.去到你的python安转... 查看详情

史上最详细java内存区域讲解

常见面试题基本问题介绍下Java内存区域(运行时数据区)Java对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式(句柄和直接指针两种方式)拓展问题String类和常量池8种基本... 查看详情

pytest文档13-allure2生成html报告(史上最详细)

前言allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面。环境准备1.python3.62.windows环境3.pycharm4.pytest-allure-adaptor5.allure2.7.06.java1.8**作者:上海-悠悠QQ交流... 查看详情

史上最详细github使用教程(英文烂的血泪史)

前言: 最近在学习github,  英文不好的我看着头疼。网上的教程也不够详细。 仅以此文献给没过四级的丸子们。。。没有排版将就着看。。。 使用github 目的:托管项目代码 基本概念:仓库(Repository... 查看详情

史上最详细的docker学习手册,请收藏!

大家好,我是飘渺,今天我们来学习一下Docker!一、docker入门docker的安装及入门示例环境准备:docker需要安装在centos764位系统上;docker要求系统内核在3.10以上查看系统内核:uname -r安装命令:yum -y ins... 查看详情

史上最详细的ue4安装教程(没有之一,就是史上最详细,不服气你来打我呀)

知识兔这篇文章为大家带来了史上最详细的UE4安装教程(没有之一,就是史上最详细,不服气你来打我呀),主要包含下面几个部分。0-软硬件配置1-创建EpicGames账户2-下载和安装启动器3-登陆启动器(这块... 查看详情

黄聪:史上最详细的kali安装教程没有之一

首先在vm里面新建虚拟机,直接选择典型,然后下一步。 1   2然后到了这一步,选择中间的安装程序光盘镜像文件,然后去文件里面找你自己下载的镜像,这时候可能系统会出现无法检测此光盘镜像中的操作系统... 查看详情