百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

人工智能实战演练:集成学习大杀器xgboost解决分类问题,附代码

bigegpt 2024-09-02 16:21 2 浏览

专栏推荐

安装

要想实现xgboost,首先我们要安装xgboost,

方法一:pip install xgboost

方法二:登录网址https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost,然后往下翻,我们可以找到我们想要的xgboost的whl文件

cp表示python的版本,而win32表示32位的,win64表示64位的,所以我们最好下载匹配我们版本的那个xgboost,我们原始ie浏览器才能下载,也不知道怎么回事。

whl文件之所以方便是因为它是编译好的,所以安装他比较方便,我把它放到了c盘下,这样安装命令如图所示

这样就表示安装成功了,注意这是在window下的安装环境,在linux下会很方便的。

安装好的之后,我们就通过一个案例来看一下究竟这个东西怎么使用?

我们现在有一个数据集,这个数据集中有两类:

分别是y=0和y=1,我们要使用这个xgboost来完成这个分类任务

我首先使用sklearn工具先将这个数据集分成两部分,一部分是训练集,一部分测试集

import xgboostfrom numpy import loadtxtfrom xgboost import XGBClassifierimport sklearnfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score# load datadataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")X= dataset[:,0:8]Y = dataset[:,8]seed = 7test_size = 0.33X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)

这里我们使用的numpy中的加载文件的工具loadtxt先来将文件加载,然后我们使用切片的方式来获取特征x和标注y,然后使用sklearn工具的train_test_split来讲我们的数据集分成两部分,一部分是训练集,一部分验证集,test_size指定训练集的比例。因为这个是随机分的,所以假如运行多次,那么每一次获得到的数据集和测试集是不一样的,所以我们可以通过random_state指定随机的方式,也就是指定之后,运行无数次,训练集和测试集也都是一样的。

输出X_train和X_test的结果位:

我在做这一步的时候出现了一个问题,这个问题就是报错 ImportError: No module named model_selection ,这个模块是sklearn中的,我检查发现原因就是原因,我的sklearn版本太低了,所以升级以下就ok了

我们可以使用conda list来看当前的我们安装库的版本,所以我们升级这个版本就好了conda update scikit-learn,但是直接这样升级,它会去找国外的镜像,所以非常慢,而且还不一定安装成功,为了解决这个问题,我们可以使用国内的镜像,比如清华大学的镜像。

cmd环境下或者Prompt,输入:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

conda config --set show_channel_urls yes

这样之后,我们就可以conda update scikit-learn

然后这就可以升级完成了,以后就不会报错了。解决完这个可能遇到的插曲之后,我们在来往下来看

我们的训练集和测试集数据已经有了,下面的任务是使用训练集来训练我们的模型,并且用测试集来测试我们的模型,得到我们模型的准确率:

model = XGBClassifier()model.fit(X, Y)y_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))

首先创建一个XGBClassifier的分类器,然后使用这个分类器来拟合我们的数据,这样我们xgboost的模型就建立了,然后我们可以使用这个模型来预测我们的测试集数据,它返回的结果是所有预测样本的0,1。结果为:

然后我们遍历这个列表,使用round来对每一个数进行处理,结果为:

那么这个就是所有的我们测试集的预测数据,那么我们拿它和y_test来一一进行比较,就可以得出我们的模型在测试集准确率,当前准确率为:

Accuracy: 88.19%

全部代码为:

我们在使用xgboost的过程中其实就是不断在地在往里面加树,一开始它有基准模型,然后在基准模型地基础上又加入了一个小地模型,使得整体地模型发生了变化,我们上面是直接地使用xgboost,其实我们也可以进行监控,每加上一棵树,每加上一个小模型都可以看到加完之后模型地结果是怎么样地,看一下这个过程中地lost值发生什么样地变化

eval_set = [(X_test, y_test)]model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="logloss", eval_set=eval_set, verbose=True)y_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))

首先我们创建一个eval_set,因为X_test和y_test这二者本身就是array,一个二维一个一维,然后用括号括起来,然后再用[]括起来,那么最终地效果就是[([[]],[])]

最为关键地其实就是下面拟合地过程,第一个和第二个数据还是我们地训练样本,这个训练样本用于拟合数据。然后第三个参数early_stopping_rounds=10表示如果我们再不断建立树地时候,loss值有10次没有降低地话,那么建树过程就停止了,模型就最终确定了。第四个参数eval_metric表示用什么loss作为评判地表准,这里使用logloss,第五个参数为测试集数据,我们每创建一棵树,就要用当前地模型来测试一下这个测试集,如果想要让这个测得地过程显示出来,我们需要指定verbose=True,不用我们输出,它会自动输出。

这段程序地运行结果为:

可以看出这个模型再第42次停止了,也就是说从第32次到42次模型地loss基本没有变化,我们最终模型对测试集地准确度为78.35%。

我们数据集中肯定有的特征肯定是建立树地效果最好地,我们建立完模型之后,我们可以以图像的形式画出来到底哪个特征是最好的。

from xgboost import plot_importance

from matplotlib import pyplot

plot_importance(model)

pyplot.show()

效果为

通过这个图可以看出来最重要的是第一个特征,最不重要的是第四个特征

xgboost的调参

第一个参数是学习率,一般设置为0.1以下

还有一些树的参数,比如max_depth、min_child_weight、subsample(建造树的时候要不要每次从总样本中选择百分之80)、colsample_bytree(特征选择百分之多少)、gamma(惩罚项,叶子节点个数越多损失越大)

还有正则化参数lambda(权重的L2正则化项)、alpha(权重的L1正则化项,可以应用在很高维度的情况下,使得算法的速度更快)

n_estimators表示建造树的个数

我们再建造树的过程中要进行一阶导和二阶导的运算,所以需要指定用什么损失函数来明确指定出来,这样才能基于这个函数进行一个求导的操作

我们有这么多的参数那么就涉及到一个调参的问题,究竟哪个参数能够使得我们的模型最好呢?

因为grid_result = grid_search.fit(X, Y)涉及到一个并行运算的问题,所以我们把它放到if __name__ =="__main__"中

我们来分析一下这个程序,这个程序我们的目的是找到最合适的学习率

我们用一个列表存放我们要测试的学习率,然后我们要将其转换成字典

这是GridSearchCV的使用要求

kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)为交叉验证,shuffle为洗牌

GridSearchCV中第一个参数为模型,第二个为我们要测试的参数,n_jobs为使用所有空闲的cpu,cv为我们使用交叉验证

grid_result = grid_search.fit(X, Y)为拟合我们的数据X,Y,返回值就是我们的参数所对应的效果

我们输出一下最好的那个学习率和loss值为:

这是最好的,下面的那个for循环是输出所有的:

至此我们可以知道最好的学习率应为0.1

相关推荐

一条命令搞定pip国内镜像源设置(pip install 指定镜像)

玩python的同学想必没有不用pip的吧,pip是python包管理工具,和Nodejs的npm、Java的maven类似,这些依靠开源力量建立起的庞大软件库极大提高了开发的效率,不过默认pytho...

Cadence Allegro在PCB中手动或者自动添加差分对属性

设计PCB过程中,若设计中有差分对信号,则需要将是差分的2个信号设置为差分对,设置差分对有2种方式:手动添加及自动添加一、手动添加差分对:1、点击Setup-Constraints-Constrain...

合亿 Gutab 三防|车载工业平板功能介绍,车载工业平板厂家推荐

在商用车队管理迈向智能化、特种车辆作业追求高效化的今天,车载工业平板早已突破传统“车载导航”的单一功能,成为连接车辆、司机与云端管理的核心枢纽。从物流运输的实时调度中枢,到矿山开采的无人驾驶控制器,再...

「探长分享-黑匣子」本田冠道 2020款

【品牌】探长360汽车黑匣子【产品型号】2TPro【安装车型】本田冠道2020款【功能特点】360全景安全辅助,行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,震动监控,一步标...

「探长分享-黑匣子」奥迪A6L 2019款

【品牌】探长360汽车黑匣子【产品型号】2TPro【安装车型】奥迪A6L2019款【功能特点】360全景安全辅助,行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,震动监控,一步...

探长360全景案例分享:奥迪Q7 2011款360全景效果展示

【品牌】DCT360汽车黑匣子【产品型号】3TPro【安装车型】奥迪Q72011款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,24小时停...

「探长分享-黑匣子」保时捷Cayenne 2015款

【品牌】探长360汽车黑匣子【产品型号】4TPro【安装车型】保时捷Cayenne2015款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,...

苍蝇再小也是肉,变态电路的大阳巧客S2差点难死大神

这台大阳巧客S2电动四轮车是我家第二台四轮俱全的篷车!哈哈!大阳巧客S2配置4.5Kw永磁同步电机,SVPWM矢量控制正弦波系统,车辆在加速、爬坡上性能有提升,效率高,操控灵敏。这台车前段时间刚更换了...

「探长分享-黑匣子」奥迪Q5L 2020款

360汽车黑匣子【产品型号】4TPro【安装车型】奥迪Q5L2020款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,24小时停车监控,一秒一...

「探长分享-黑匣子」丰田兰德酷路泽 2016款

【品牌】探长360汽车黑匣子【产品型号】3TPro【安装车型】丰田兰德酷路泽2016款【功能特点】360全景安全辅助,四路行车录像,极致高清摄像头,模拟/数字高清/AHD多种信号格式输出,24小...

驾驶室盲区是酿成重卡事故主因?后视系统:这个锅我不背

小时候家中长辈常常提醒:离大货车远一点!司机根本看不到你!早期的货车可能真的存在驾驶盲区,比如车辆正下方,因驾驶座过高,恰好是司机看不到的视野盲区。而如今的重卡在环视系统上已经非常完善,是否还存在驾驶...

前后双录,360 G580行车记录仪(360行车记录仪g580s)

相信每一位车主都会为爱车安装行车记录仪,行车记录仪的作用不仅能为交通事故还原证据,还能防止碰瓷。传统的单镜头行车记录仪只能拍摄车头方向的行车画面,如果遇到后方车辆故意碰瓷的事故时,没有监控和后摄画面则...

海康威视同轴录像机怎么使用,海康XVR配置说明

海康威视同轴录像机支持模拟、同轴以及数字IP摄像机接入,因此在使用多种类型摄像机、老久监控项目改造等场景广泛使用。首先,新录像机第一次使用需要设置管理密码激活,密码需由8-16位数字、小写字母、大写...

亿道三防2代工业级车载平板电脑震撼登场,农机矿车专用

亿道三防近日推出2024年全新2代车载平板电脑V12R,引领多项技术创新和升级,为农机、矿车等车载领域带来了超越期待与想象的震撼体验。V12R是一款从里到外,性能、功能全线拉满的工业级车载平板电脑!拥...

分析神州十八号返回舱内的摄像机最有可能是什么类型的摄像头

有没有发现,神州十八号返回舱内摄像机的图像虽然清晰度不是很高,但是画面非常干净,没有一点干扰,几乎看不到噪点。图像清晰度不高不太可能是镜头原因,很可能是图像传感器的分辨率比较低的原因,图像传感器分辨率...