【机器学习】集成学习代码练习(随机森林、GBDT、XGBoost、LightGBM等)
本文是中国大学慕课《机器学习》的“集成学习”章节的课后代码。
课程地址:
(资料图片)
https://www.icourse163.org/course/WZU-1464096179
课程完整代码:
https://github.com/fengdu78/WZU-machine-learning-course
代码修改并注释:黄海广,haiguang2000@wzu.edu.cn
importwarningswarnings.filterwarnings("ignore")importpandasaspdfromsklearn.model_selectionimporttrain_test_split生成数据
生成12000行的数据,训练集和测试集按照3:1划分
fromsklearn.datasetsimportmake_hastie_10_2data,target=make_hastie_10_2()
X_train,X_test,y_train,y_test=train_test_split(data,target,random_state=123)X_train.shape,X_test.shape
((9000, 10), (3000, 10))模型对比
对比六大模型,都使用默认参数
fromsklearn.linear_modelimportLogisticRegressionfromsklearn.ensembleimportRandomForestClassifierfromsklearn.ensembleimportAdaBoostClassifierfromsklearn.ensembleimportGradientBoostingClassifierfromxgboostimportXGBClassifierfromlightgbmimportLGBMClassifierfromsklearn.model_selectionimportcross_val_scoreimporttimeclf1=LogisticRegression()clf2=RandomForestClassifier()clf3=AdaBoostClassifier()clf4=GradientBoostingClassifier()clf5=XGBClassifier()clf6=LGBMClassifier()forclf,labelinzip([clf1,clf2,clf3,clf4,clf5,clf6],["LogisticRegression","RandomForest","AdaBoost","GBDT","XGBoost","LightGBM"]):start=time.time()scores=cross_val_score(clf,X_train,y_train,scoring="accuracy",cv=5)end=time.time()running_time=end-startprint("Accuracy:%0.8f (+/-%0.2f),耗时%0.2f秒。模型名称[%s]"%(scores.mean(),scores.std(),running_time,label))
Accuracy: 0.47488889 (+/- 0.00),耗时0.04秒。模型名称[Logistic Regression]Accuracy: 0.88966667 (+/- 0.01),耗时16.34秒。模型名称[Random Forest]Accuracy: 0.88311111 (+/- 0.00),耗时3.39秒。模型名称[AdaBoost]Accuracy: 0.91388889 (+/- 0.01),耗时13.14秒。模型名称[GBDT]Accuracy: 0.92977778 (+/- 0.00),耗时3.60秒。模型名称[XGBoost]Accuracy: 0.93188889 (+/- 0.01),耗时0.58秒。模型名称[LightGBM]
对比了六大模型,可以看出,逻辑回归速度最快,但准确率最低。而LightGBM,速度快,而且准确率最高,所以,现在处理结构化数据的时候,大部分都是用LightGBM算法。
XGBoost的使用 1.原生XGBoost的使用importxgboostasxgb#记录程序运行时间importtimestart_time=time.time()#xgb矩阵赋值xgb_train=xgb.DMatrix(X_train,y_train)xgb_test=xgb.DMatrix(X_test,label=y_test)##参数params={"booster":"gbtree",#"silent":1,#设置成1则没有运行信息输出,最好是设置为0.#"nthread":7,#cpu线程数默认最大"eta":0.007,#如同学习率"min_child_weight":3,#这个参数默认是1,是每个叶子里面h的和至少是多少,对正负样本不均衡时的0-1分类而言#,假设 h 在0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100个样本。#这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。"max_depth":6,#构建树的深度,越大越容易过拟合"gamma":0.1,#树的叶子节点上作进一步分区所需的最小损失减少,越大越保守,一般0.1、0.2这样子。"subsample":0.7,#随机采样训练样本"colsample_bytree":0.7,#生成树时进行的列采样"lambda":2,#控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。#"alpha":0,#L1正则项参数#"scale_pos_weight":1, #如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。#"objective":"multi:softmax",#多分类的问题#"num_class":10,#类别数,多分类与multisoftmax并用"seed":1000,#随机种子#"eval_metric":"auc"}plst=list(params.items())num_rounds=500#迭代次数watchlist=[(xgb_train,"train"),(xgb_test,"val")]
#训练模型并保存#early_stopping_rounds当设置的迭代次数较大时,early_stopping_rounds可在一定的迭代次数内准确率没有提升就停止训练model=xgb.train(plst,xgb_train,num_rounds,watchlist,early_stopping_rounds=100,)#model.save_model("./model/xgb.model")#用于存储训练出的模型print("bestbest_ntree_limit",model.best_ntree_limit)y_pred=model.predict(xgb_test,ntree_limit=model.best_ntree_limit)print("error=%f"%(sum(1foriinrange(len(y_pred))ifint(y_pred[i]>0.5)!=y_test[i])/float(len(y_pred))))#输出运行时长cost_time=time.time()-start_timeprint("xgboostsuccess!","\n","costtime:",cost_time,"(s)......")
[0]train-rmse:1.11000val-rmse:1.10422[1]train-rmse:1.10734val-rmse:1.10182[2]train-rmse:1.10465val-rmse:1.09932[3]train-rmse:1.10207val-rmse:1.09694
……
[497]train-rmse:0.62135val-rmse:0.68680[498]train-rmse:0.62096val-rmse:0.68650[499]train-rmse:0.62056val-rmse:0.68624best best_ntree_limit 500error=0.826667xgboost success! cost time: 3.5742645263671875 (s)......2.使用scikit-learn接口
会改变的函数名是:
eta -> learning_rate
lambda -> reg_lambda
alpha -> reg_alpha
fromsklearn.model_selectionimporttrain_test_splitfromsklearnimportmetricsfromxgboostimportXGBClassifierclf=XGBClassifier(# silent=0, #设置成1则没有运行信息输出,最好是设置为0.是否在运行升级时打印消息。#nthread=4,#cpu线程数默认最大learning_rate=0.3,#如同学习率min_child_weight=1,#这个参数默认是1,是每个叶子里面h的和至少是多少,对正负样本不均衡时的0-1分类而言#,假设 h 在0.01 附近,min_child_weight 为 1 意味着叶子节点中最少需要包含 100个样本。#这个参数非常影响结果,控制叶子节点中二阶导的和的最小值,该参数值越小,越容易 overfitting。max_depth=6,#构建树的深度,越大越容易过拟合gamma=0,#树的叶子节点上作进一步分区所需的最小损失减少,越大越保守,一般0.1、0.2这样子。subsample=1,#随机采样训练样本训练实例的子采样比max_delta_step=0,#最大增量步长,我们允许每个树的权重估计。colsample_bytree=1,#生成树时进行的列采样reg_lambda=1,#控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。#reg_alpha=0,#L1正则项参数#scale_pos_weight=1, #如果取值大于0的话,在类别样本不平衡的情况下有助于快速收敛。平衡正负权重#objective="multi:softmax",#多分类的问题指定学习任务和相应的学习目标#num_class=10,#类别数,多分类与multisoftmax并用n_estimators=100,#树的个数seed=1000#随机种子#eval_metric="auc")clf.fit(X_train,y_train)y_true,y_pred=y_test,clf.predict(X_test)print("Accuracy:%.4g"%metrics.accuracy_score(y_true,y_pred))
Accuracy : 0.936LIghtGBM的使用 1.原生接口
importlightgbmaslgbfromsklearn.metricsimportmean_squared_error#加载你的数据#print("Loaddata...")#df_train=pd.read_csv("../regression/regression.train",header=None,sep="\t")#df_test=pd.read_csv("../regression/regression.test",header=None,sep="\t")##y_train=df_train[0].values#y_test=df_test[0].values#X_train=df_train.drop(0,axis=1).values#X_test=df_test.drop(0,axis=1).values#创建成lgb特征的数据集格式lgb_train=lgb.Dataset(X_train,y_train)#将数据保存到LightGBM二进制文件将使加载更快lgb_eval=lgb.Dataset(X_test,y_test,reference=lgb_train)#创建验证数据#将参数写成字典下形式params={"task":"train","boosting_type":"gbdt",#设置提升类型"objective":"regression",#目标函数"metric":{"l2","auc"},#评估函数"num_leaves":31,#叶子节点数"learning_rate":0.05,#学习速率"feature_fraction":0.9,#建树的特征选择比例"bagging_fraction":0.8,#建树的样本采样比例"bagging_freq":5,#k意味着每k次迭代执行bagging"verbose":1#<0显示致命的,=0显示错误(警告),>0显示信息}print("Starttraining...")#训练cvandtraingbm=lgb.train(params,lgb_train,num_boost_round=500,valid_sets=lgb_eval,early_stopping_rounds=5)#训练数据需要参数列表和数据集print("Savemodel...")gbm.save_model("model.txt")#训练后保存模型到文件print("Startpredicting...")#预测数据集y_pred=gbm.predict(X_test,num_iteration=gbm.best_iteration)#如果在训练期间启用了早期停止,可以通过best_iteration方式从最佳迭代中获得预测#评估模型print("error=%f"%(sum(1foriinrange(len(y_pred))ifint(y_pred[i]>0.5)!=y_test[i])/float(len(y_pred))))
Start training...[LightGBM] [Warning] Auto-choosing col-wise multi-threading, the overhead of testing was 0.000448 seconds.You can set `force_col_wise=true` to remove the overhead.[LightGBM] [Info] Total Bins 2550[LightGBM] [Info] Number of data points in the train set: 9000, number of used features: 10[LightGBM] [Info] Start training from score 0.012000[1]valid_0"s auc: 0.814399valid_0"s l2: 0.965563Training until validation scores don"t improve for 5 rounds[2]valid_0"s auc: 0.84729valid_0"s l2: 0.934647[3]valid_0"s auc: 0.872805valid_0"s l2: 0.905265[4]valid_0"s auc: 0.884117valid_0"s l2: 0.877875[5]valid_0"s auc: 0.895115valid_0"s l2: 0.852189
……
[191]valid_0"s auc: 0.982783valid_0"s l2: 0.319851[192]valid_0"s auc: 0.982751valid_0"s l2: 0.319971[193]valid_0"s auc: 0.982685valid_0"s l2: 0.320043Early stopping, best iteration is:[188]valid_0"s auc: 0.982794valid_0"s l2: 0.319746Save model...Start predicting...error=0.6640002.scikit-learn接口
fromsklearnimportmetricsfromlightgbmimportLGBMClassifierclf=LGBMClassifier(boosting_type="gbdt",#提升树的类型gbdt,dart,goss,rfnum_leaves=31,#树的最大叶子数,对比xgboost一般为2^(max_depth)max_depth=-1,#最大树的深度learning_rate=0.1,#学习率n_estimators=100,#拟合的树的棵树,相当于训练轮数subsample_for_bin=200000,objective=None,class_weight=None,min_split_gain=0.0,#最小分割增益min_child_weight=0.001,#分支结点的最小权重min_child_samples=20,subsample=1.0,#训练样本采样率行subsample_freq=0,#子样本频率colsample_bytree=1.0,#训练特征采样率列reg_alpha=0.0,#L1正则化系数reg_lambda=0.0,#L2正则化系数random_state=None,n_jobs=-1,silent=True,)clf.fit(X_train,y_train,eval_metric="auc")#设置验证集合verbose=False不打印过程clf.fit(X_train,y_train)y_true,y_pred=y_test,clf.predict(X_test)print("Accuracy:%.4g"%metrics.accuracy_score(y_true,y_pred))
Accuracy : 0.927参考
1.https://xgboost.readthedocs.io/
2.https://lightgbm.readthedocs.io/
3.https://blog.csdn.net/q383700092/article/details/53763328?locationNum=9&fps=1
往期精彩回顾适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码
-
【机器学习】集成学习代码练习(随机森林、GBDT、XGBoost、LightGBM等)本文是中国大学慕课《机器学习》的“集成学习”章节的课后代码。课程地址:https: www icourse163 org course WZU-1464096
-
当前动态:图灵看市12.28晚-白银冲高失败,空头短期控场图灵看市12 28晚-白银冲高失败,空头短期控场白银白银昨日多头冲击高点失败,虽然整体表现强于黄金,但是也已经无限接近末端走势。今天日内空
-
重量级老艺术家要回归春晚!赵本山,郭德纲,陈佩斯的呼声最高|最新兔年春晚的彩排工作,已经正式开启了,不得不说,除了有众多明星大腕加盟之外,众多老艺术家的参与,也是让这台晚会增光不少只不过根据知情人
-
联动科技:近期机构投资者调研情况,请您关注公司相关投资者活动关系记录表披露情况 天天热讯联动科技(301369)12月28日在投资者关系平台上答复了投资者关心的问题。投资者:您好!半导体设备上市公司有:华海清科、盛美上海、中微公司、
-
官宣!国乒公布教练竞聘名单,李隼马琳王皓在列,秦志戬没有参与官宣!国乒公布教练竞聘名单,李隼马琳王皓在列,秦志戬没有参与
-
当前焦点!2023中国银行兔年纪念币预约入口汇总一、中国银行兔年贺岁普通纪念币预约平台:1、官方网站预约:请进入中国银行官网“纪念币预约”系统,根据页面提示填写相应信息;》》》电...
-
鲜桃煮多久才能吃 桃要煮多少分钟才能熟 环球速读1、黄桃要煮15-20分钟才能熟。2、黄桃是冷冻食物,煮之前可以放在温水里,解冻起来会快些,煮的时候可以根据自己的喜好口感软硬程度,调整煮制
-
联防联控机制:各地要每日收集和逐级报告人群核酸检测和居民自行抗原检测数及阳性数(原标题:联防联控机制:各地要每日收集和逐级报告人群核酸检测和居民自行抗原检测数及阳性数)证券时报网讯,据国家卫健委消息,国务院应对
-
官方:利物浦签下加克波达协议,总价5000万镑|世界热点评官方:利物浦签下加克波达协议,总价5000万镑
-
石头晚评:12月27日期货操作建议 即时焦点白银2302:盘中窄幅震荡小阳线报收,行情符合预期,沪银趋势多头,短期承压运行,震荡思路对待,操作上关注5260一线支撑有效性低多参与,反弹
-
长三角铁路今起实施新列车运行图新图中,对上海至南宁、长沙至上海等直通方向加大运能投入,调整直通旅客列车运行区段5 5对,调整直通旅客列车运行经由2对。阜阳西至上海虹桥G
-
东部战区位台岛周边海空域组织联合火力打击演练中新网12月25日电据东部战区微信公众号消息,东部战区新闻发言人施毅陆军大校表示,12月25日,中国人民解放军东部战区位台岛周边海空域组织诸
-
全球热门:借去花借款逾期11个月延迟还款征信有什么影响网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后上报给征信机构,因为有些借贷机构可
-
极市直播预告丨NeurIPS 2022 Oral-张博航:如何从模型层面获得对抗鲁棒性保证?|天天视点↑点击蓝字关注极市平台|极市线上分享第107期|一直以来,为让大家更好地了解学界业界优秀的论文和工作,极市已邀请了超过100位技术大咖嘉宾,
-
【世界热闻】[年报]视声智能(870976):2020年年度报告(更正公告)证券代码:870976证券简称:视声智能主办券商:开源证券广州视声智能股份有限公司2020年年度报告更正公告本公司及董事会
-
永诚财险7.6%股份被中国华电集团挂牌转让,转让底价2.56亿元12月22日,北京产权交易所官网显示,永诚财产保险股份有限公司(简称“永诚财险”)16552 8万股股份(占总股本的7 6%)被挂牌转让,转让方为中
-
【港股通】友邦保险(01299)升2.68% 近日回购264.88万股股份 世界新要闻友邦保险盘中股价走势向上,并回收上日跌幅,最新报83 15港元,涨2 68%,成交额6 48亿港元。消息面上,公司公布,12月22日耗资约2 25亿港元回
-
世界快看点丨人人贷贷款逾期27年多久会上征信系统网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后上报给征信机构,因为有些借贷机构可
-
最新资讯:长春莲花山浅山星空露营地荣获“吉林省十佳最美露营地”近日,2022中国露营产业金天幕风云榜榜单正式揭晓,长春莲花山浅山星空露营地荣获“吉林省十佳最美露营地”。
-
华立科技:12月21日融券卖出金额10.50万元,占当日流出金额的0.65%同花顺数据中心显示,华立科技12月21日获融资买入104 66万元,占当日买入金额的6 48%,当前融资余额6423 60万元,占流通市值的3 92%,低于历史
-
运达科技(300440.SZ):控股股东拟协议转让5.40%的股份予广金美好基金格隆汇12月21日丨运达科技公布,持有公司股份210,003,642股,占总股本(剔除公司回购专用账户中的股份数量7,902,000股后的股本436,811,000股,
-
微资讯!厦门倡导“非必要不做核酸、非必要不查核酸”12月21日起,厦门优化调整核酸政策,倡导“非必要不做核酸,非必要不查核酸证明”。
-
12.21—秋末悔城:黄金再到临界点,2手准备防突发走势_天天新要闻周二,黄金先跌后涨,先抑后扬模式,走出上升,测试上方1824附近的前高,目前高位走势区间,已经到达临界点。下面,先解读这些盘面的信号和注
-
当前快讯:中国平安(02318.HK):新方正集团已完成了相应的企业变更登记手续格隆汇12月20日丨中国平安公布,有关,(i)珠海华发集团有限公司(代表珠海国资)、公司、深圳市特发集团有限公司组成的联合体参与方正集团重整及
-
涨停雷达:ST升达:拟与信托计划实施债务重组 ST升达触及涨停今日走势:ST升达(002259)今日触及涨停板,该股近一年涨停18次。异动原因揭秘:1、ST升达12月18日公告,华宝信托为信托计划之受托管理人。截
-
环球时讯:国药现代(600420)12月19日主力资金净卖出1531.10万元截至2022年12月19日收盘,国药现代(600420)报收于9 8元,下跌5 5%,换手率3 25%,成交量33 4万手,成交额3 37亿元。
-
北京:目前120急救电话日呼叫量约为常态时呼叫量的5倍北京:目前120急救电话日呼叫量约为常态时呼叫量的5倍央视网消息:12月19日,北京召开新冠疫情防控第432场新闻发布会,通报北京最新疫情,发
-
女人想要私处健康 不要碰这些东西!三角区是女性特别重视维护的地方,是女性最脆弱的地方之一,如果女性维护不好,三角区就容易受伤。小编注意到,如果女性们希望三角区总是安全
-
协程这么好,它能完全代替线程么?好多问题呀,开始回答或者提问前,其实可以看看问题本身是不是有问题,像黄执中一样。------这个问题首先前提就有问题,谁说协程那么好的?任
-
天天滚动:青海湟中西子湖畔会“合伙人” 政商携手谋发展当日,青海省西宁市湟中区政府考察团赴浙江省杭州市访问,并与曙光地产集团、绿城管理集团相关人士座谈交流。藏传佛教格鲁派六大寺院之一的塔