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

课程地址:

https://www.icourse163.org/course/WZU-1464096179

课程完整代码:

https://github.com/fengdu78/WZU-machine-learning-course

代码修改并注释:黄海广,haiguang2000@wzu.edu.cn

import warnings
warnings.filterwarnings("ignore")
import pandas as pd
from sklearn.model_selection import train_test_split

生成数据

生成12000行的数据,训练集和测试集按照3:1划分

from sklearn.datasets import make_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))

模型对比

对比六大模型,都使用默认参数,因为数据是

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import GradientBoostingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.model_selection import cross_val_score
import timeclf1 = LogisticRegression()
clf2 = RandomForestClassifier()
clf3 = AdaBoostClassifier()
clf4 = GradientBoostingClassifier()
clf5 = XGBClassifier()
clf6 = LGBMClassifier()for clf, label in zip([clf1, clf2, clf3, clf4, clf5, clf6], ['Logistic Regression', 'Random Forest', '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的使用

import xgboost as xgb
#记录程序运行时间
import timestart_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("best best_ntree_limit", model.best_ntree_limit)
y_pred = model.predict(xgb_test, ntree_limit=model.best_ntree_limit)
print('error=%f' %(sum(1for i in range(len(y_pred)) if int(y_pred[i] > 0.5) != y_test[i]) /float(len(y_pred))))
# 输出运行时长
cost_time = time.time() - start_time
print("xgboost success!", '\n', "cost time:", cost_time, "(s)......")
[0]    train-rmse:1.11000  val-rmse:1.10422
[1] train-rmse:1.10734  val-rmse:1.10182
[2] train-rmse:1.10465  val-rmse:1.09932
[3] train-rmse:1.10207  val-rmse:1.09694

……

[497]  train-rmse:0.62135  val-rmse:0.68680
[498]   train-rmse:0.62096  val-rmse:0.68650
[499]   train-rmse:0.62056  val-rmse:0.68624
best best_ntree_limit 500
error=0.826667
xgboost success! cost time: 3.5742645263671875 (s)......

2.使用scikit-learn接口

会改变的函数名是:

eta -> learning_rate

lambda -> reg_lambda

alpha -> reg_alpha

from sklearn.model_selection import train_test_split
from sklearn import metricsfrom xgboost import XGBClassifierclf = 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.原生接口

import lightgbm as lgb
from sklearn.metrics import mean_squared_error
# 加载你的数据
# print('Load data...')
# 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('Start training...')
# 训练 cv and train
gbm = lgb.train(params,lgb_train,num_boost_round=500,valid_sets=lgb_eval,early_stopping_rounds=5)  # 训练数据需要参数列表和数据集print('Save model...')gbm.save_model('model.txt')  # 训练后保存模型到文件print('Start predicting...')
# 预测数据集
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)  #如果在训练期间启用了早期停止,可以通过best_iteration方式从最佳迭代中获得预测
# 评估模型
print('error=%f' %(sum(1for i in range(len(y_pred)) if int(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.814399    valid_0's l2: 0.965563
Training until validation scores don't improve for 5 rounds
[2] valid_0's auc: 0.84729 valid_0's l2: 0.934647
[3] valid_0's auc: 0.872805    valid_0's l2: 0.905265
[4] valid_0's auc: 0.884117    valid_0's l2: 0.877875
[5] valid_0's auc: 0.895115    valid_0's l2: 0.852189

……

[191]   valid_0's auc: 0.982783    valid_0's l2: 0.319851
[192]   valid_0's auc: 0.982751    valid_0's l2: 0.319971
[193]   valid_0's auc: 0.982685    valid_0's l2: 0.320043
Early stopping, best iteration is:
[188]   valid_0's auc: 0.982794    valid_0's l2: 0.319746
Save model...
Start predicting...
error=0.664000

2.scikit-learn接口

from sklearn import metrics
from lightgbm import LGBMClassifierclf = 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

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载黄海广老师《机器学习课程》视频课黄海广老师《机器学习课程》711页完整版课件

本站qq群955171419,加入微信群请扫码:

【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习相关推荐

  1. 机器学习随机森林实战:声纳信号分类(附python代码保姆级解析)

    随机森林是一种很常用的机器学习算法,"随机"表示每棵树的训练样本随机以及训练时的特征随机.         训练形成的多棵决策树形成了"森林",计算时我们把每棵 ...

  2. 实战五十三:基于机器学习随机森林的购房贷款违约预测(完整代码+数据集)

    1.1 实验题目:购房贷款违约预测 任务:使用机器学习相关知识完成购房贷款违约预测,给定特征字段,输出是否会发生逾期的预测. 1.2 实验要求 1.2 题目背景 随着世界经济的蓬勃发展和中国改革开放的 ...

  3. 机器学习(九):集成学习(bagging和boosting),随机森林、XGBoost、AdaBoost

    文章目录 一.什么是随机森林? 1.1 定义 1.2 目的 1.3 随机森林 VS bagging 二.集成学习 2.1 定义 2.2 决策树的问题 2.3 袋装法概念与理论 2.4 装袋法的优缺点 ...

  4. LCE:一个结合了随机森林和XGBoost优势的新的集成方法

    随机森林 [Breiman, 2001] 和 XGBoost [Chen and Guestrin, 2016] 已成为解决分类和回归的许多挑战的最佳机器学习方法.Local Cascade Ense ...

  5. python 随机森林调参_Python机器学习实践:随机森林算法训练及调参-附代码

    原标题:Python机器学习实践:随机森林算法训练及调参-附代码 文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 ...

  6. ML之RFXGBoost:分别基于RF随机森林、XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)

    ML之RF&XGBoost:分别基于RF随机森林.XGBoost算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 ...

  7. 扩增子16S/ITS/18S微生物多样性课程更新-机器学习随机森林分析

    扩增子16S/ITS/18S微生物多样性课程更新-机器学习随机森林分析 机器学习或者人工智能(AI)是当前计算机领域研究的热点.然而,最近越来越多的研究者开始尝试将 AI 应用于另一个热门领域--微生 ...

  8. PYTHON链家租房数据分析:岭回归、LASSO、随机森林、XGBOOST、KERAS神经网络、KMEANS聚类、地理可视化...

    全文下载链接:http://tecdat.cn/?p=29480 作者:Xingsheng Yang 1 利用 python 爬取链家网公开的租房数据: 2 对租房信息进行分析,主要对房租相关特征进行 ...

  9. Python计算树模型(随机森林、xgboost等)的特征重要度及其波动程度:基于熵减的特征重要度计算及可视化、基于特征排列的特征重要性(feature permutation)计算及可视化

    Python计算树模型(随机森林.xgboost等)的特征重要度及其波动程度:基于熵减的特征重要度计算及可视化.基于特征排列的特征重要性(feature permutation)计算及可视化 目录

最新文章

  1. Session 过期问题处理
  2. 让神经网络给符号AI“打工”,MIT和IBM联合解决深度学习痛点,未来将用于自动驾驶...
  3. php pdo操作数据库
  4. Mysql数据库的基本概念
  5. c语言for要分号错误,c语言for语句
  6. PHP 超级全局变量
  7. [机器学习] Apriori算法
  8. 18年如何拓展前端知识架构
  9. Virtualenv --使用文档
  10. iPhone 12不附赠耳机!代工厂股份大跌5%,负责人:无线耳机销量将上涨
  11. 蓝桥杯 ALGO-21算法训练 装箱问题(动态规划,01背包)
  12. NEFU 117-素数个数的位数(素数定理)
  13. Kali Linux桥接模式配置DNS服务器
  14. 输入的字与系统编码不符_伺服系统故障排除法
  15. VC++中视频采集系统(摄像头的制作,串口通信的应用)
  16. 众多时间时钟Flash动画素材一键即可获取
  17. 小米笔记本用鸿蒙系统,小米笔记本Pro15.6GTX版评测 如果你主力用它来玩游戏显然不是明智之选...
  18. 冬奥幕后故事:从低碳火炬到AI裁判,十四年后中国科技再上场
  19. python定向爬虫之淘宝商品比价
  20. 下载丨66页PDF,云和恩墨技术通讯(2022年7月刊)

热门文章

  1. cxgrid动态创建列
  2. 原生javascript
  3. [转]常用OCR软件介绍
  4. [分享]运维分享一一阿里云linux系统mysql密码修改脚本
  5. js 正则学习小记之左最长规则
  6. 织梦dedecms如何对列表添加判断语句
  7. 引入extThree20JSON之后,怎么在工程中使用
  8. [Android]第四次作业
  9. Python学习笔记之函数式编程
  10. 初步了解学习将传统单机应用改造成Dubbo服务的过程