首页 >热点 > > 正文

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

2022-12-29 10:08:03

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

课程地址:

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,加入微信群请扫码

上一篇: 下一篇:
x
推荐阅读

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

2022-12-29

12月19日-25日 中国LNG综合进口到岸价格指数217.96点 环比下跌19.32%|天天微资讯

2022-12-28

贝肯能源(002828)12月28日主力资金净卖出664.85万元

2022-12-28

世界热议:鹏欣资源董秘回复:因海外疫情等因素对海外矿业生产造成一定影响,相关工作仍在推进中,请持续关注公司公告

2022-12-28

全球简讯:云路股份:融资余额4425.11万元,创历史新低(12-27)

2022-12-28

上海港湾: 中原证券股份有限公司关于上海港湾基础建设(集团)股份有限公司预计2023年日常性关联交易的核查意见

2022-12-27

支持开票 | Python实证指标构建与文本分析

2022-12-27

太平洋证券2023年风电策略:海陆装机增速共振 即将开启新的高增周期|全球今热点

2022-12-27

易借速贷逾期几天上征信呢

2022-12-27

豪森股份: 独立董事候选人声明(张令荣)

2022-12-26

全球滚动:记一次QQ找回经历

2022-12-26

川宁生物(301301.SZ)将于12月27日在创业板上市_滚动

2022-12-26

翼龙贷网贷20万逾期不还会面临起诉吗_世界热议

2022-12-25

2022埃媒年终盘点:欧洲经历二战后最危险变革期 报资讯

2022-12-24

中微半导: 中信证券股份有限公司关于中微半导体(深圳)股份有限公司2022年持续督导工作现场检查报告 新消息

2022-12-23

当前速读:本周盘点(12.19-12.23):欧亚集团周跌4.43%,主力资金合计净流出136.82万元

2022-12-23

泰格医药:12月22日获融资买入2757.44万元,占当日流入资金比例7.27%-全球最资讯

2022-12-23

考完中级会计考试需要参加评审吗

2022-12-22

冠龙节能:公司四季度生产运营正常,详细财务数据,请持续关注公司定期报告

2022-12-22

环球微头条丨逾期5年延迟还款影响征信吗

2022-12-22

3小时!开发ChatGPT微信小程序 焦点精选

2022-12-21

中国工业百强区揭晓 深圳市龙岗区再次位列全国工业百强区榜首

2022-12-21

西陇科学: 第五届监事会第十四次会议决议公告

2022-12-07

汉嘉设计:近期公司作为联合体成员之一中标了钱潮嘉苑共有产权房项目EPC工程总承包工程_每日观点

2022-12-06

山东推出文化体验主题旅游产品 推出多种旅游惠民措施

2022-05-22

唐山加快验收时间 为建筑工地开复工保驾护航

2022-03-19

消费者“身材焦虑” 减肥市场疯狂吸金

2022-03-19

2月份秦皇岛新建商品住宅销售价格环比下降0.2% 同比下降4%

2022-03-19

深圳技术进出口全年合同数量共1347项 同比增长2.51%

2022-03-19

邢台柏乡:打造羊肚菌产业示范带 引领村级集体经济发展

2022-03-19

胡金秋32分17板 浙江广厦男篮“双杀”稠州金租

2022-03-19

新疆北部有降雪 湖北、湖南等地出现大雾

2021-12-13

黑龙江新增本土核酸检测初筛阳性人员5例 均在讷河市

2021-12-13

“恋爱盲盒”抽的不是爱情,是急功近利的心

2021-12-13

北京12月12日新增2例境外输入确诊病例

2021-12-13

满洲里本轮疫情社会面“清零”,迎来拐点!

2021-12-13

北京今日晴冷在线气温低 本周中后期或再遭冷空气侵袭

2021-12-13

近六成受访大学生表示自己不能脱离表情包

2021-12-13

停车费上涨,昆明部分医院停车难缓解了吗?

2021-12-13

救人快递小哥:我不想成为网红 将继续踏实工作

2021-12-13

野猪拟从“三有”野生动物名录中除名

2021-12-13

“三有”名录删除野猪,要把握好捕杀与保护的度

2021-12-13

齐齐哈尔讷河发现5例核酸检测初筛阳性人员

2021-12-13

野猪退出“三有”名录不是一道“滥捕滥杀令”

2021-12-13

网红蹭“遗孤”流量是变相吃“血馒头”

2021-12-13

演员涂们病逝 曾被称为“草原王爷专业户”

2021-12-13

被偷走的那些年:被拐14年后他们成夹在中间的孩子

2021-12-13

文峰道歉:官微官网整改,10个工作日内对接预付卡备案

2021-12-13

山东烟台海域货船沉没已致9人遇难 搜救仍在进行

2021-12-13

浙江绍兴累计报告确诊病例107例 无症状感染者1例

2021-12-13

第三届国际白鹤论坛举办 中外专家聚焦生物多样性保护

2021-12-13

浙江绍兴本轮疫情已累计报告107例确诊病例

2021-12-13

“零容忍” 浙江宁波公安机关将严厉打击涉疫违法犯罪行为

2021-12-13

宁波镇海疫情未发生外溢 44例感染者均在蛟川街道管控区内

2021-12-13

来华留学生游梵净山 感知贵州多彩文化

2021-12-13

货船触礁进水 福建海警成功营救6名船员

2021-12-13

战“疫”时刻:浙江疫情下的“特殊”二三事

2021-12-13

浙江宁波44人已确诊 年龄最小为2岁 最大为70岁

2021-12-13

浙江宁波此轮疫情病毒为德尔塔变异株(AY.4 进化分支)华沙株

2021-12-13

南粤古驿道徒步体验活动(西京古道站)韶关举行

2021-12-13

上海试点驾驶证“学法减分” 一年最多减6分

2021-12-13

河南周口发布公告 明确过节确需返乡应提前3天报备

2021-12-13

浙江越城区新增1例确诊病例 系上虞区病例的密接者

2021-12-13

浙江已报告阳性感染者139例 明确严控跨省出行

2021-12-13

第二届鄱阳湖国际观鸟周在“中国候鸟小镇”江西吴城开幕

2021-12-13

“酥油茶‘遇见’咖啡,好比空气中飘着香水味”

2021-12-13

西安新增1例本土确诊病例 活动轨迹公布

2021-12-13

浙江三地病例感染病毒均属于德尔塔变异株

2021-12-13

山东烟台海域一载有14人货船沉没 9人已无生命体征

2021-12-13

浙江严控跨省出行 中高风险地区人员严格限制出行

2021-12-13

陕西西安一诊所工作人员确诊 8份核酸检测环境样本结果呈阳性

2021-12-13

浙江绍兴越城区在集中隔离点发现1名核酸检测阳性感染者

2021-12-13

截至12日15时 西安已追踪管控密切接触者486人

2021-12-13

陕西西安一诊所工作人员被诊断为确诊病例 活动轨迹公布

2021-12-13

抗疫特写:交通封控后的上虞“24小时”

2021-12-13

居家观察期间擅自离开封控区域 浙江上虞警方处罚3人

2021-12-13

杭州发布致市民公开信:非必要不流动 少聚集

2021-12-13

满洲里新冠肺炎救治感控督导组:“战事”越严峻 越要教会大家如何躲“子弹”

2021-12-13

浙江宁波、绍兴和杭州三地累计新冠肺炎确诊病例138例

2021-12-13

宁波镇海疫情下的“产科故事”:三天迎来28个宝宝

2021-12-13

内蒙古满洲里核酸检测累计检出阳性样本532份

2021-12-13

内蒙古满洲里新增确诊病例3例

2021-12-13

银川一企业为社区防疫人员捐赠“黑心棉”大衣被查处

2021-12-13

重庆15家医疗美容机构被立案调查

2021-12-13

四川泸州市泸县发生3.0级地震 震源深度8千米

2021-12-13

物资如何安全运抵封闭城区?浙江镇海内外联动保供应

2021-12-13

广西宁明县实施分区分级防控 非必要不离县

2021-12-13

江西吉安发现1例境外输入新冠病毒核酸检测阳性

2021-12-13

一货船在烟台海域沉没 3人获救4人遇难7人失联

2021-12-13

【挑战365天正能量速写画】第012期:为了陌生人赴汤蹈火

2021-12-13

守望下一个春天——疫情中的“冰城人”侧记

2021-12-13

山东烟台海域一货船沉没致14人遇险 3人已获救4人遇难

2021-12-13

满洲里已确诊病例年龄最小的3个月、最大的过百岁

2021-12-13

浙江绍兴新增7例确诊病例和8例无症状感染者

2021-12-13

浙江11日新增阳性感染者47例 多地紧急开展核酸检测

2021-12-13

吉林白城破获一起生产销售伪劣柴油案 涉案价值1亿余元

2021-12-13

哈尔滨市新增本土新冠肺炎确诊病例1例

2021-12-13

陕西新增报告本土确诊病例1例

2021-12-13

云南新增境外输入确诊病例2例

2021-12-13

江苏宜兴启动应急响应 发布十一条措施强化疫情防控工作

2021-12-13