机器学习篇-day06-集成学习-随机森林 Adaboost GBDT XGBoost

news2024/11/24 16:47:34

一. 集成学习思想

集成学习

原理

集成学习是机器学习中的一种思想,它通过多个模型的组合形成一个精度更高的模型,参与组合的模型称为弱学习器(基学习器)。训练时,使用训练集依次训练出这些弱学习器,对未知样本进行预测时,使用这些弱学习器联合进行预测

优势

弱弱变强, 强强联合

集成学习分类

  • Bagging:随机森林

  • Boosting:Adaboost(自适应)、GBDT、XGBoost、LightGBM

Bagging思想

Bagging思想

  1. Bagging: 随机森林算法: 又称装袋算法或者自举汇聚法

  2. 有放回的抽样(booststrap抽样)产生不同的训练集,从而训练不同的学习器

  3. 通过平权投票、多数表决的方式决定预测结果

    在分类问题中,会使用多数投票统计结果

    在回归问题中,会使用求均值统计结果

  4. 弱学习器可以并行训练

  5. 基本的弱学习器算法模型,如: Linear、Ridge、Lasso、Logistic、Softmax、ID3、C4.5、CART、SVM、KNN均可

Boosting思想

思想原理

每一个训练器重点关注前一个训练器不足的地方进行训练通过加权投票的方式,得出预测结果

串行的训练方式

举例

随着学习的积累从弱到强每新加入一个弱学习器,整体能力就会得到提升代表算法:Adaboost,GBDT,XGBoost,LightGBM

总结

集成学习是什么

多个弱学习器组合成一个更强大的学习器,解决单一预测,进步一得到更好性能。

bagging思想

有放回的抽样

平权投票、多数表决的方式决定预测结果

并行训练

boosting思想

重点关注前一个训练器不足的地方进行训练

加权投票的方式

串行的训练方式


bagging思想

二. 随机森林算法

构建方法

基本思想

随机森林是基于 Bagging 思想实现的一种集成学习算法,采用决策树模型作为每一个弱学习器(基学习器)。训练:(1)有放回的产生训练样本(2)随机挑选 n 个特征(n 小于总特征数量)预测:平权投票,多数表决输出预测结果

构建步骤

概念

为什么要随机抽样训练集?如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样。防止过拟合, 提高泛化性能

为什么要有放回地抽样?

  • 如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决。

  • 综上:弱学习器的训练样本既有交集也有差异数据,更容易发挥投票表决效果

随机森林的API

API介绍

案例-泰坦尼克数据集

# 导包
import pandas as pd
​
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier  # 随即森丽分类
from sklearn.metrics import accuracy_score
​
​
# 定义随机森立函数
def dm01_rf_classifier():
    # 数据读取
    data = pd.read_csv('data/train.csv')
    data.info()
    # 数据基本处理
    # 确定特征和标签
    x = data.iloc[:, 2:-2].copy()
    x.drop(['Name', 'Ticket'], inplace=True, axis='columns')
    y = data.Survived
    # print(x)
    # print(y)
    # 空值处理(填充)
    x.Age = x.Age.fillna(x.Age.mean())
    print(x)
​
    # 处理字符类型 数据
    x = pd.get_dummies(x)
    x.drop('Sex_female', inplace=True, axis=1)
    # print(x.head())
​
    # 数据划分
    x_train, x_test, y_train, y_test = train_test_split(
        x, y,
        test_size=0.2,
        random_state=21,
        stratify=y
    )
​
    # 模型训练
    # 决策树模型
    model1 = DecisionTreeClassifier()
    model1.fit(x_train, y_train)
​
    # 随机森林模型
    model2 = RandomForestClassifier(max_depth=6)
    model2.fit(x_train, y_train)
​
    # 模型评估
    print('(决策树)预测后评估:', accuracy_score(y_true=y_test, y_pred=model1.predict(x_test)))
​
    print('(随即森林)预测后评估:', accuracy_score(y_true=y_test, y_pred=model2.predict(x_test)))
​
    # 交叉验证网格搜索, 寻找最优超参数
    estimator = RandomForestClassifier()
    param = {'n_estimators': [10, 20, 30, 40, 50, 60, 70],
             'max_depth': [1, 2, 3, 4, 5, 6, 7, 8, 9],
             }
    grid_search = GridSearchCV(estimator, param_grid=param, cv=5)
    grid_search.fit(x_train, y_train)
    print('(交叉验证后)预测后评估:', accuracy_score(y_true=y_test, y_pred=grid_search.predict(x_test)))
​
​
if __name__ == '__main__':
    dm01_rf_classifier()

总结


boosting思想

三. Adaboost算法

基本原理

放大错误, 缩小正确

Adaptive Boosting(自适应提升)基于 Boosting思想实现的一种集成学习算法核心思想是通过逐步提高那些被前一步分类错误的样本的权重来训练一个强分类器。

Adaboost算法推导

  1. 初始化训练数据权重相等,训练第 1 个学习器

如果有 100 个样本,则每个样本的初始化权重为:1/100

根据预测结果找一个错误率最小的分裂点,计算、更新:样本权重、模型权重

  1. 根据新权重的样本集 训练第 2 个学习器

根据预测结果找一个错误率最小的分裂点计算、更新:样本权重、模型权重

  1. 迭代训练在前一个学习器的基础上,根据新的样本权重训练当前学习器

直到训练出 m 个弱学习器

  1. m个弱学习器集成预测公式:

𝑎𝑖 为模型的权重,输出结果大于 0 则归为正类,小于 0 则归为负类。

  1. 模型权重计算公式:

  1. 样本权重计算公式:

举例构建过程

构建第一个弱分类器

计算最小错误率
第一轮更新权重
一轮更新后

构建第二个弱分类器

最终结果

案例-葡萄酒数据集

# 导包
import pandas as pd
​
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier     # 单个决策树(默认CART)
from sklearn.ensemble import AdaBoostClassifier  # 集成学习
​
​
# 定义函数实现葡萄酒集成学习
def dm01_adaboost():
    # 数据读取
    data = pd.read_csv('data/wine0501.csv')
    # data.info()
​
    # 数据基本处理
    # 去除标签多余类
    data = data[data['Class label'] != 1]
    # 划分特征和标签
    x = data.iloc[:, 1: -1]
    # x = data[['Alcohol', 'Hue']]
    y = data['Class label'].copy()
​
    # 特征工程
    # 标签转化(2, 3) => (0, 1)
    y = LabelEncoder().fit_transform(y)
    # print(x)
    # print(y)
    # 划分训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(
        x, y,
        test_size=0.2,
        stratify=y,
        random_state=21
    )
    # 标准化数据集
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # print(len(x_train))
    # print(len(x_test))
​
    # 模型训练
    decision_model = DecisionTreeClassifier()   # 单一决策树
    decision_model.fit(x_train, y_train)
​
    adaboost_model = AdaBoostClassifier(
        n_estimators=200,
        estimator=decision_model,
        learning_rate=0.2       # 给多个基学习器 加权 Lr=0.2
    )
"""
此处的学习率 != 梯度下降的学习率
学习率源码解释: 
   Weight applied to each regressor at each boosting iteration. A higher
   learning rate increases the contribution of each regressor. There is
   a trade-off between the `learning_rate` and `n_estimators` parameters.
   Values must be in the range `(0.0, inf)`.
   
   在每次提升迭代中应用于每个回归变量的权重。更高的
   学习率会增加每个回归变量的贡献。有
   'learning_rate' 和 'n_estimators' 参数之间的权衡。
   值必须在 '(0.0, inf) ' 范围内。
"""
    adaboost_model.fit(x_train, y_train)
​
    # 模型评估
    print('decision_model:', decision_model.score(x_test, y_test))
    print('adaboost_model:', adaboost_model.score(x_test, y_test))
​
​
if __name__ == '__main__':
    dm01_adaboost()

总结

Adaboost概念

通过逐步提高被分类错误的样本的权重来训练一个强分类器。提升的思想

Adaboost构建过程

1 初始化数据权重,来训练第1个弱学习器。找最小的错误率计算模型权重,再更新模型和数据权重。2 根据更新的数据集权重,来训练第2个弱学习器,再找最小的错误率计算模型权重,再更新模数据权重。3 依次重复第2步,训练n个弱学习器。组合起来进行预测。结果大于0为正类、结果小于0为负类

四..GBDT

提升树

思想通过拟合残差的思想来进行提升残差:真实值 - 预测值

通过拟合残差可将多个弱学习器组成一个强学习器,这就是提升树的最朴素思想

梯度提升树

梯度提升树 (Gradient Boosting Decision Tree => GBDT)梯度提升树不再拟合残差,而是利用梯度下降的近似方法,利用损失函数的负梯度作为提升树算法中的残差近似值。

GBDT 拟合的负梯度就是残差。如果我们的 GBDT 进行的是分类问题,则损失函数变为 logloss,此时拟合的目标值就是该损失函数的负梯度值

案例解释梯度提升树

构建第一棵弱学习树

构建第一棵弱学习树流程

  1. 切分点: 相邻点的平均值

  2. R1, R2

  3. 计算左右子树的均值

  4. 计算平方损失

  5. 平方损失最小的切分点为 分裂点

  6. 构建左右子树的均值

构建第二棵弱学习树

构建第二棵若学习树的流程

  1. 以第一棵弱学习树的负梯度当作目标值

  2. 以前一棵若学习树的左右子树的平均负梯度当作预测值

  3. 重复构建第一棵弱学习树的步骤

构建结果

整体构建流程

  1. 初始化弱学习器(目标值的均值作为预测值)

  2. 迭代构建学习器,每一个学习器拟合上一个学习器的负梯度

  3. 直到达到指定的学习器个数

  4. 当输入未知样本时,将所有弱学习器的输出结果组合起来作为强学习器的输出

案例-泰坦尼克数据集

# 导包
import pandas as pd
​
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import GradientBoostingClassifier   # GBDT
from sklearn.metrics import accuracy_score
​
​
# 定义随机森立函数
def dm01_GBDT_classifier():
    # 数据读取
    data = pd.read_csv('data/train.csv')
    data.info()
    # 数据基本处理
    # 确定特征和标签
    x = data.iloc[:, 2:-2].copy()
    x.drop(['Name', 'Ticket'], inplace=True, axis='columns')
    y = data.Survived
    # print(x)
    # print(y)
    # 空值处理(填充)
    x.Age = x.Age.fillna(x.Age.mean())
    # print(x)
​
    # 处理字符类型 数据
    x = pd.get_dummies(x)
    x.drop('Sex_female', inplace=True, axis=1)
    # print(x.head())
​
    # 数据划分
    x_train, x_test, y_train, y_test = train_test_split(
        x, y,
        test_size=0.2,
        random_state=21,
        stratify=y
    )
​
    # 模型训练
    # 单一决策树模型
    model1 = DecisionTreeClassifier()
    model1.fit(x_train, y_train)
​
    # GBDT
    model2 = GradientBoostingClassifier(max_depth=6)
    model2.fit(x_train, y_train)
​
    # 模型评估
    print('(决策树)预测后评估:', accuracy_score(y_true=y_test, y_pred=model1.predict(x_test)))
​
    print('(GBDT)预测后评估:', accuracy_score(y_true=y_test, y_pred=model2.predict(x_test)))
​
    # 交叉验证网格搜索, 寻找最优超参数
    estimator = GradientBoostingClassifier()
    param = {'n_estimators': [100, 200, 300, 400, 500, 600, 700],
             'max_depth': [1, 2, 3, 4, 5, 6, 7, 8, 9],
             'learning_rate': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
             }
    grid_search = GridSearchCV(estimator, param_grid=param, cv=5)
    grid_search.fit(x_train, y_train)
    print('(交叉验证后)预测后评估:', accuracy_score(y_true=y_test, y_pred=grid_search.best_estimator_.predict(x_test)))
​
​
if __name__ == '__main__':
    dm01_GBDT_classifier()

总结

提升树

每一个弱学习器通过拟合残差来构建强学习器

梯度提升树

每一个弱学习器通过拟合负梯度来构建强学习器

五. XGBoost

XGBoost算法的思想

XGBoost (eXtreme Gradient Boosting)极端梯度提升树,集成学习方法的王牌,在数据挖掘比赛中,大部分获胜者用了XGBoost。

XGBoost的构建思想

  1. 构建模型的方法时最小化训练数据的损失函数

    上述公式训练模型复杂度较高, 容易过拟合

  2. XGBoost极端提升树, 在上述的损失函数基础上加入正则化项, 提高对未知的测数据的泛化性能

  3. 正则化项用来降低模型的复杂度

    γT 中的T表示一棵树的叶子节点数量

    λ||w||²中的w表示叶子节点输出值组成的向量, ||w||表示向量的模,

    λ表示对该项的调节系数

举例说明正则化项

正则化项 = 树 的复杂度 = 模型的复杂度

假设我们要 预测一家人对电子游戏的喜好程度,考虑到年轻和年老相比,年轻更可能喜欢电子游戏,以及男性和女性相比,男性更喜欢电子游戏,故先根据年龄大小区分小孩和大人,然后再通过性别区分开是男是女,逐一给各人在电子游戏喜好程度上打分

XGBoost目标函数推导

推导图解

分裂依据

根据上述图片中计算的Gain值:

  1. 对树中的每个叶子结点尝试进行分裂

  2. 计算分裂前 - 分裂后的分数:

    1. 如果Gain > 0,则分裂之后树的损失更小,会考虑此次分裂

    2. 如果Gain< 0,说明分裂后的分数比分裂前的分数大,此时不建议分裂

  3. 当触发以下条件时停止分裂:

    1. 达到最大深度

    2. 叶子结点数量低于某个阈值

    3. 所有的结点在分裂不能降低损失, 等等..

XGBoost的算法API

XGBoost的安装和使用

XGBoost的编码风格在sklean机器学习库中没有集成XGBoost。想要使用XGBoost,需要手工安装 pip3 install xgboost 可以在XGBoost的官网上查看最新版本:XGBoost Documentation — xgboost 2.1.1 documentation

XGBoost的编码风格

支持非sklearn方式,也即是自己的风格支持sklearn方式,调用方式保持sklearn的形式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chromium 如何查找前端 window.navigator, window.screen等对象在c++中的实现

以前端Navigator 对象为例&#xff1a; 1、直接在vscode里面搜索"Navigator" 过滤条件*.idl&#xff0c;这样可以搜到Navigator.idl对象文件。 2、打开Navigator.idl 可以看到平级目录对应的Navigator.h 和Navigator.cc定义 3、Navigator.idl会在out\Debug\gen\thir…

【系统集成中级】线上直播平台开发项目质量管理案例分析

【系统集成中级】线上直播平台开发项目质量管理案例分析 一、案例二、小林在项目质量管理中存在的问题&#xff08;一&#xff09;计划阶段缺失&#xff08;二&#xff09;测试用例编制与执行问题&#xff08;三&#xff09;质量管理流程问题&#xff08;四&#xff09;质量保证…

全金属的两足机器人钢铁侠开发

比较喜欢钢铁侠和终结者&#xff0c;其全金属的机身&#xff0c;反射着金属的光泽&#xff0c;透露出令人惊叹的美感。 这也是一个全金属机器人&#xff0c;周身有十几片铝片和四个舵机组成&#xff0c;可以叫他钢铁侠或者终结者。这么笨&#xff0c;这么小&#xff0c;可以说是…

【笔记】shell基本使用,超全,更新ing

一、shell的执行 1、执行命令但不输出结果到命令行 [rootlocalhost ~]$ command >/dev/null2、多命令顺序执行 命令 1;命令 2 #顺序执行命令&#xff0c;命令间无逻辑关联 命令 1&&命令 2 #命令1正确执行才执行命令2&#xff0c;否则不执行 命令 1||命令 2 #命令…

记录IDEA编译报错:不支持发行版本

一共四个地方&#xff0c;版本均保持一致

成分喵(一键查询食品/化妆品成分)

一款免费可以一键查询各大品牌食品和化妆品成分神器&#xff0c;无论是拍照、扫码又或者是商品链接都能查成分&#xff0c;还能根据成分查商品&#xff0c;而且各种成分的功效、作用和安全性都会一一标注出来&#xff0c;包括是否对身体有害、敏感风险等级等等。 下载&#xf…

大模型应用开发速成:一本通向LLM专家之路

大家好&#xff0c;今天给大家推荐一本大模型应用开发入门书籍《大模型应用开发极简入门》&#xff0c;本书对很多AI概念做了讲解和说明&#xff01; 朋友们如果有需要 《大模型应用开发极简入门》&#xff0c;扫码获取~ 本书主要讲解了以下几个方面的大模型技术&#xff1a; G…

技术发明一等奖!FISCO BCOS研究成果荣获CCF权威认可

近日&#xff0c;中国计算机学会&#xff08;CCF&#xff09;正式揭晓了2024年度“CCF科技成果奖”的获奖名单。FISCO BCOS开源工作组组长单位微众银行与清华大学合作的“安全可控高性能区块链基础平台”项目&#xff0c;凭借卓越的技术创新与显著的社会经济效益&#xff0c;荣…

MFC项目如何使用hiredis库连接redis

如何在windows平台使用c连接redis 1. 下载hiredis的vs工程文件2. 使用vs2022编译hiredis3.项目中调用4. 集群连接5. 简单的封装下 最近需要在windows PC终端读取redis数据。我这里使用hiredis连接redis. 工程是vs2022开发的。 注意&#xff1a;如果是使用的‘hiredis’就不能在…

【鸟类识别系统】Python+卷积神经网络算法+人工智能+深度学习+ResNet50算法+计算机课设项目

一、介绍 鸟类识别系统。本系统采用Python作为主要开发语言&#xff0c;通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;然后进行模型的迭代训练&#xff0c;得到一个识别精度较高的模型&#xff0c;然后在…

ORA-65096:公用用户名或角色名无效

CREATE USER DATA_SHARING IDENTIFIED BY "Ab2"; Oracle建立用户的的时候&#xff0c;可能会出现一直提示 ORA-65096:公用用户名或角色名无效&#xff1b; 我查了一下&#xff0c;好像是 oracle 12版本及以上版本的特性&#xff0c;用户名必须加c##或者C##前缀才能创…

对ElementPlus的el-select二次封装,添加分页和搜索功能,实现一个自定义的下拉选择框

组件展示效果图 在 Vue3 的 elementPlus项目中&#xff0c;我们经常需要使用下拉选择框 (el-select) 来展示大量数据。然而&#xff0c;默认情况下 el-select 不支持分页和搜索功能。本文将介绍如何通过二次封装 el-select 组件来实现这一需求&#xff0c;并使用自定义的 Hook …

一周热门|OpenAI 回击马斯克:为了自己的竞争优势,不断骚扰我们;微软、清华团队提出 Diff Transformer

「一周热门」将从【企业动态】【技术前瞻】【政策法规】【专家观点】四部分&#xff0c;带你快速跟进大模型行业热门动态。 企业动态 OpenAI 回击马斯克&#xff1a;为了自己的竞争优势&#xff0c;他不断骚扰我们 日前&#xff0c;OpenAI 指控马斯克在一场法律诉讼中对其进行…

谷歌浏览器 文件下载提示网络错误

情况描述&#xff1a; 谷歌版本&#xff1a;129.0.6668.90 (正式版本) &#xff08;64 位&#xff09; (cohort: Control)其他浏览器&#xff0c;比如火狐没有问题&#xff0c;但是谷歌会下载失败&#xff0c;故推断为谷歌浏览器导致的问题小文件比如1、2M会成功&#xff0c;大…

基于Transformer的诗句生成

基于Transformer的诗句生成 前言相关介绍Transformer一、基本原理与结构二、关键技术三、应用领域四、优缺点 Transformer应用&#xff1a;诗句生成优缺点 前提条件实验环境基于Transformer的诗句生成准备数据集读取数据集分割数据集设置相关参数创建自己DataSet对象定义网络模…

双十一速购清单!如何才能挑到性价比高的宠物空气净化器

对于很多上班族而言&#xff0c;平时都不敢大手大脚的花钱&#xff0c;甚至很想将一份钱掰成两份来用&#xff0c;所以双十一是很多人都不会错过的购物狂欢节。 当然&#xff0c;我这个996的社畜也一样&#xff0c;而且我还养了一只爱掉毛的猫咪&#xff0c;每天下班回去都看到…

光路科技TSN交换机和电力专用交换机即将亮相第31届中国国际电力设备及技术展览会

在全球能源领域正经历深刻转型之际&#xff0c;可再生能源技术的飞跃进步正为电力行业的未来开辟新径。太阳能、风能等绿色能源&#xff0c;凭借其无可比拟的优势&#xff0c;正稳步取代化石燃料&#xff0c;成为电力行业的主流趋势。多国政府积极响应&#xff0c;出台多项政策…

日均千万订单的交易平台设计稿

业务背景 平台主要售卖电子商品和少量特定的实物商品。 经营模式&#xff0c;主要分为平台商家和自营店&#xff0c;自营店的流量占整个平台业务的50%以上&#xff0c;我负责自营店交易履约相关业务。 以前的架构&#xff0c;平台交易和履约中心是所有流量共享&#xff0c;在…

day01-Qt5入门

day01-Qt5入门 1.下载Qtcreate 官网地址&#xff1a;http://qt-project.org/downloads 2.配置环境变量 将类似于 D:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin 的目录添加到环境变量中 3.创建一个新项目 输入自己的项目名称&#xff0c;后面默认下一部 4.运行第一个项目 在窗口…

计算机网络:数据链路层 —— PPP 点对点协议

文章目录 PPP 帧PPP帧的格式PPP帧的透明传输面向字节的异步链路面向比特的同步链路 PPP帧的差错检测 PPP 的工作状态 点对点协议&#xff08;Point-to-Point Protocol&#xff0c;PPP&#xff09;是目前使用最广泛的点对点数据链路层协议&#xff0c;用于在两个节点之间进行数据…