前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【机器学习】随机森林、GBDT、XGBoost、LightGBM等集成学习代码练习

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

作者头像
黄博的机器学习圈子
发布于 2023-01-10 07:02:50
发布于 2023-01-10 07:02:50
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

本文是中国大学慕课《机器学习》的“集成学习”章节的课后代码。 课程地址: https://www.icourse163.org/course/WZU-1464096179 课程完整代码: https://github.com/fengdu78/WZU-machine-learning-course 代码修改并注释:黄海广,haiguang2000@wzu.edu.cn

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
from sklearn.model_selection import train_test_split  

生成数据

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.datasets import make_hastie_10_2

data, target = make_hastie_10_2()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X_train, X_test, y_train, y_test = train_test_split(data, target, random_state=123)
X_train.shape, X_test.shape
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
((9000, 10), (3000, 10))

模型对比

对比六大模型,都使用默认参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 time

clf1 = 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 - start
    print("Accuracy: %0.8f (+/- %0.2f),耗时%0.2f秒。模型名称[%s]" %
          (scores.mean(), scores.std(), running_time, label))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import xgboost as xgb
#记录程序运行时间
import time

start_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.10.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')]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#训练模型并保存
# 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(1
           for 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)......")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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

……

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.model_selection import train_test_split
from sklearn import metrics

from xgboost import XGBClassifier

clf = 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.10.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))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Accuracy : 0.936

LIghtGBM的使用

1.原生接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(1
           for i in range(len(y_pred)) if int(y_pred[i] > 0.5) != y_test[i]) /
       float(len(y_pred))))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

……

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[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接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn import metrics
from lightgbm import LGBMClassifier

clf = LGBMClassifier(
    boosting_type='gbdt',  # 提升树的类型 gbdt,dart,goss,rf
    num_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))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习初学者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
python-高级协程编程-协程间的通信和数据传输(二)
Queue 是一种常见的协程间通信和数据传输的机制。它是一个先进先出(FIFO)的数据结构,协程可以将数据放入队列中,另一个协程可以从队列中取出数据。
玖叁叁
2023/04/22
5760
Python黑科技之异步编程:玩转事件循环
Python的异步编程是一项极为强大的技术,通过事件循环和协程,你可以实现高效的非阻塞并发操作。在这篇文章中,我们将揭示Python异步编程的黑科技,深入了解事件循环的奥秘,助你在编写异步代码时游刃有余。
dbdocker
2024/02/04
5530
Python异步IO操作,看这个就够了
异步 IO 是一种并发编程设计,Python3.4 开始,已经有专门的标准库 asyncio 来支持异步 IO 操作。你可能会说,我知道并发用多线程,并行用多进程,这里面的知识已经够我掌握的了,异步 IO 又是个什么鬼?本文将会回答该问题,从而使你更加牢固地掌握 Python 的异步 IO 操作方法。
somenzz
2020/11/25
2.9K0
Python异步IO操作,看这个就够了
python-协程并发-多个协程的同步(二)
条件变量是一种常用的协程同步机制,用于在协程之间传递信号。在Python中,我们可以使用asyncio模块中的条件变量来实现协程的同步。asyncio.Condition是一个类似于标准库中Condition的同步原语,用于协调多个协程之间的等待和通信。
玖叁叁
2023/04/21
4350
浅度测评:requests、aiohttp、httpx 我应该用哪一个?
作者 l kingname 来源 l 未闻 Code(ID:itskingname)
andrew_a
2020/02/18
2.3K0
浅度测评:requests、aiohttp、httpx 我应该用哪一个?
性能测试: Python3 利用asynico协程系统构建生产消费模型
今天研究了下python3的新特性 asynico ,试了试 aiohttp 协程效果,单核QPS在500~600之间,性能还可以。
机械视角
2019/10/23
4420
3.异步协程爬取下载网络小说
之前,我们已经通过多线程的方式实现了下载网络小说,参阅文章地址,下面将采用异步携程的方式进行下载。
jiagui
2024/07/08
1190
python-协程并发-多个协程的同步(三)
队列是一种常用的协程同步机制,用于在协程之间传递数据。在Python中,我们可以使用asyncio模块中的队列来实现协程的同步。asyncio.Queue是一个类似于标准库中Queue的同步原语,用于在协程之间传递数据。
玖叁叁
2023/04/21
4730
协程和异步I/O
协程(coroutine)通常又称之为微线程或纤程,它是相互协作的一组子程序(函数)。所谓相互协作指的是在执行函数A时,可以随时中断去执行函数B,然后又中断继续执行函数A。注意,这一过程并不是函数调用(因为没有调用语句),整个过程看似像多线程,然而协程只有一个线程执行。协程通过yield关键字和 send()操作来转移执行权,协程之间不是调用者与被调用者的关系。
用户8442333
2021/05/21
8580
Python异步爬虫与代理完美结合
为了编写一个高性能的异步爬虫,并使用代理IP,我们可以使用以下技术栈:aiohttp (用于异步HTTP请求)、asyncio (用于异步编程)、代理IP可以使用一个代理池,我们从文件中读取或者从API获取。在这里,我们假设代理IP存储在一个文本文件中,每行一个,格式为:http://ip:port 或 http://user:pass@ip:port
华科云商小徐
2025/06/05
1030
剖析灵魂,为什么aiohttp默认的写法那么慢?
在上一篇文章中,我们提到了 aiohttp 官方文档中的默认写法速度与 requests 单线程请求没有什么区别,需要通过使用asyncio.wait来加速 aiohttp 的请求。今天我们来探讨一下这背后的原因。
青南
2019/12/25
1.9K0
剖析灵魂,为什么aiohttp默认的写法那么慢?
【Python爬虫实战】深入理解Python异步编程:从协程基础到高效爬虫实现
随着网络和数据的迅速发展,越来越多的场景需要高效处理大量请求和数据。传统的同步编程模式在处理I/O密集型任务时会浪费大量等待时间,而Python的异步编程技术提供了一种更高效的方式。本文从Python异步编程的基础概念出发,深入讲解协程、asyncio库及其核心功能。通过详细的代码示例与解释,我们将逐步探索异步编程的应用场景
易辰君
2024/11/07
2010
Python协程-asyncio、async/await
上面的代码也可以这样写,将15到21行换成一行await asyncio.gather(a(), b())也能实现类似的效果,await asyncio.gather 会并发运行传入的可等待对象(Coroutine、Task、Future)。
Cloud-Cloudys
2020/07/07
3.3K0
aiohttp 异步http请求-2.post 请求application/json和data
前言 aiohttp 发送post请求,body类型的常见的类型传参: application/json application/x-www-form-urlencode application/json POST 请求接口报文示例,Content-Type类型是application/json POST /api/v1/login/ HTTP/1.1 Accept: application/json, */* Accept-Encoding: gzip, deflate Connection: keep-
上海-悠悠
2022/04/21
6.7K0
一日一技:在Python 的线程中运行协程
在一篇文章理解Python异步编程的基本原理这篇文章中,我们讲到,如果在异步代码里面又包含了一段非常耗时的同步代码,异步代码就会被卡住。
青南
2020/02/26
4.4K0
一日一技:在Python 的线程中运行协程
Python异步编程与事件循环的实战指南
异步编程是一种高效的编程方式,特别适用于I/O密集型任务,如网络请求、文件读取等。Python中,异步编程主要通过asyncio模块实现。asyncio提供了事件循环、协程和任务等关键概念,使得编写异步代码更加直观和高效。本文将详细介绍Python异步编程与事件循环的基本概念和高级用法,包含具体的示例代码,帮助更好地理解和应用这些技术。
sergiojune
2024/08/12
2920
Python异步编程与事件循环的实战指南
【Python】教你彻底了解Python中的并发编程
随着计算机处理能力的不断提升和多核处理器的普及,并发编程变得越来越重要。并发编程可以使程序同时执行多个任务,从而提高程序的性能和响应速度。在Python中,有多种方式可以实现并发编程,包括线程、进程和异步编程。在这篇文章中,我们将深入探讨Python中的并发编程,涵盖其基本概念、线程与进程、多线程编程、多进程编程、异步编程以及并发编程的实际应用示例。
E绵绵
2025/05/25
1980
一日一技:装饰器如何装饰异步函数
在 Python 开发的工程中,我们常常使用装饰器来优化代码,例如一个打印日志的装饰器:
青南
2020/02/19
4K1
一日一技:装饰器如何装饰异步函数
python协程
https://docs.python.org/zh-cn/3/library/asyncio.html
润森
2019/11/10
5200
大型fastapi项目实战 高并发请求神器之aiohttp(上) [建议收藏]
在 Python 众多的 HTTP 客户端中,最有名的莫过于 requests、aiohttp 和 httpx。在不借助其他第三方库的情况下,requests 只能发送同步请求;aiohttp 只能发送异步请求;httpx 既能发送同步请求,又能发送异步请求。在并发量大的情况下,如何高效的处理数据,异步是我们的优选,今天我们主要详解的是在生产环境广泛使用的 aiohttp。
python编程从入门到实践
2021/02/04
10.7K0
推荐阅读
相关推荐
python-高级协程编程-协程间的通信和数据传输(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档