当前位置:首页>滚动 > >正文

【机器学习】集成学习代码练习(随机森林、GBDT、XGBoost、LightGBM等)

  • 2022-12-22 23:12:55来源:

本文是中国大学慕课《机器学习》的“集成学习”章节的课后代码。

课程地址:

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.936

LIghtGBM的使用 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.664000

2.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月22日报道圣诞将至,但美国民众的购买欲望和购买力正在下降。据彭博新闻社网站12月21日报道,圣诞节到来时,(@参考消息)

博彩公司遭黑客攻击,67000账户被窃,损失超30万!公司称登录信息由第三方泄露

大数据文摘出品作者:Caleb12月19日,卡塔尔世界杯落幕,总决赛可以说是让观众一直紧绷神经。梅西带领的阿根廷队与卫冕冠军法国队战成三比三平

多部门召开2023年研考工作调度会 全力确保研考平稳顺利实施_新动态

要严格执行安全保密规定,确保试卷流转绝对安全,严格落实入场和考场监督检查要求,严厉打击考试作弊,严肃处理各类违规违纪行为

今日关注:茂业商业(600828)12月21日主力资金净卖出20.40万元

截至2022年12月21日收盘,茂业商业(600828)报收于3 68元,上涨3 08%,换手率0 34%,成交量5 95万手,成交额2177 8万元。12月2

浙江德清:3800亩废矿地变身绿色高产田

初冬,早晨8点半,费颖儿又准时出现在位于浙江湖州市德清县洛舍镇东衡村的先锋农机专业合作社。打了几个电话后,她换上套鞋,出门向晚稻收割现

新智认知荣获和讯“2022年度上市公司经营模式创新榜样” 世界动态

2022年12月19日,在和讯网和巨浪视线联合主办、财经中国会承办、博智宏观提供学术支持的“2022年财经中国年会暨第20届中国财经风云榜”上,

前大连人外援龙东与埃弗顿解约 出场33次仅进3球

近日,埃弗顿官方宣布球队已经和前大连人前锋龙东完成解约。

冬至一阳生,亚岁待春来(解码二十四节气)

“天时人事日相催,冬至阳生春又来。”(杜甫《小至》)冬至是冬季的第四个节气,于公历12月21-23日之间交节。此日太阳直射南回归线,地球...

阿斯利康(AZN.US):Imfinzi作为治疗肺癌单一疗法失败:世界热门

阿斯利康(AZN US)当地时间周一表示,其药物Imfinzi作为晚期非小细胞肺癌患者的单一疗法与铂类化疗相比未能达到提高总体生存期的主要目标。该公

世界报道:华林证券荣获中国上市公司协会“上市公司董办优秀实践”奖

华林证券荣获中国上市公司协会“上市公司董办优秀实践”奖2022年12月19日13:20中国网财经

天天微资讯!好的领域模型应该是什么样子?

​好的领域模型应该长什么样子?DDD说,领域模型应该是可以准确表达业务需求的模型。模型和领域模型是两个概念,模型可以是数据模型或服务模型

北京下周冰冻模式继续,数九寒冬将至

北京日报客户端|记者骆倩雯京城近期冷空气不断,一直处于冰冻模式。根据市气象台预报,12月20日京城将再迎北风,气温再次下滑,防寒保暖仍是重

鸡丁要炖多久会熟 鸡丁煮几分钟熟:世界快看点

1、鸡丁要炖5-8分钟。若是未经任何腌制等处理的纯肉鸡丁,需要完全煮熟后才可以食用,所以焖煮的时间要长一点,否则容易造成外部鸡肉已经熟了

2020毕节工伤认定标准怎么规定

职工有下列情形之一的,应当认定为工伤:(一)在工作时间和工作场所内,因工作原因受到事故伤害的;(二)工作时间前后在工作场所内,从事与

山东黄金: 山东黄金矿业股份有限公司第六届董事会第三十二次会议决议公告

山东黄金:山东黄金矿业股份有限公司第六届董事会第三十二次会议决议公告

污水处理氯气浓度调节装置中氯气传感器的应用|当前视点

氯气价格低廉,用量少,消毒可靠,工艺成熟,是自来水公司普遍使用的消毒剂,所以氯气适用于污水处理,可确保回收水质的稳定。但是因为氯气(C

白猫贷借款逾期征信有什么影响

网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后上报给征信机构,因为有些借贷机构可

石头晚评:12月16日期货操作建议

白银2302:盘中冲高回落上影阴线报收,行情符合预期,沪银趋势多头,短期承压反弹,震荡思路对待,操作上关注5230一线支撑有效性低多参与,探

兴瑞科技(002937.SZ):子公司拟212.5万元坡元购买印尼一处厂房及土地

格隆汇12月15日丨兴瑞科技(002937)(002937 SZ)公布,公司于2022年12月14日召开第三届董事会二十六次会议,审议通过了《关于控股子公司购买

特钢板块12月14日跌0.66%,盛德鑫泰领跌,主力资金净流入399.66万元

12月14日特钢板块较上一交易日下跌0 66%,盛德鑫泰领跌。当日上证指数报收于3176 53,上涨0 01%。深证成指报收于11321 81,下跌0 02%。

跨境通12月14日主力资金大幅流出

跨境通12月14日主力资金净流出1 58亿元,涨跌幅为-9 91%,主力净量(dde大单净额 流通股)为-2 04%,两市排名4865 4887。投顾分析:该股今日主力

当前焦点!富力否认“张力行贿案”中出资保释金 专家:幸好有“双老板制”托底

12月12日晚,市场消息称,富力地产创始人之一、联席董事长、总裁张力被指控在美国涉嫌行贿,保释金高达1 28亿元。

全球微资讯!三一重能: 三一重能首次公开发行网下配售限售股上市流通公告

证券代码:688349         证券简称:三一重能              公告编号:2022-032                 

天天滚动:鹏翎股份董秘回复:当前阶段公司主要深耕国内业务

鹏翎股份(300375)12月13日在投资者关系平台上答复了投资者关心的问题。

竹荪蛋吃法 在这里给大家做个详细的介绍

1 西红柿煮竹花鸡蛋。材料:番茄、竹花蛋、大蒜、调味盐1 2茶匙、香油、葱花、竹荪香精。做法:先将西红柿去皮切块,用大蒜炒熟,根据自己的口味

由“规矩”变“习惯”文明交通成了鹤壁新风景

越线停车的非机动车越来越少,斑马线前礼让行人的机动车越来越多,闯红灯逆行的越来越少,文明交通标识越来越多……春节期间,漫步鹤壁街头...

世界通讯!华泰证券:数据资源会计处理标准逐步清晰 有望带来企业价值重估

智通财经APP获悉,华泰证券发布研究报告称,数据资源会计处理标准逐步清晰,有望带来企业价值重估。财政部印发《企业数据资源相关会计处理暂行

【全球热闻】美联储年内最终加息将至 现货黄金维持跌势

摘要本交易日亚盘,现货黄金开于1785 12美元 盎司,截止0952,黄金价格最高上探至1788 03美元 盎司,最低触及1780 40美元 盎司。本月,美联储

猜您喜欢

Copyright ©  2015-2022 北冰洋服装网版权所有  备案号:沪ICP备2020036824号-3   联系邮箱:562 66 29@qq.com