集成学习算法(Bagging 思想、Boosting思想)及具体案例

概述:是机器学习中的一种思想,通过多个模型的组合形成一个精度更高的模型,参与组合的模型称为弱学习器

1、Bagging 思想

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

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

        弱学习器可以并行训练

代表算法:随机森林

        概述:是基于 Bagging 思想实现的一种集成学习算法,采用决策树模型作为每一个弱学习器

        构建过程:1. 随机选数据,2. 随机选特征,3. 训练弱学习器,4. 重复1~3训练n个弱学习器,

                          5. 平权投票

        API

# 导包
from sklearn.ensemble import RandomForestClassifierparam = { ' n_estimators ':[40,50,60,70],' max_depth ':[2,4,6,8,10],' random_state ':[ 9 ] }

        from sklearn.ensemble import RandomForestClassifier

        param = { ' n_estimators ':[40,50,60,70],' max_depth ':[2,4,6,8,10],' random_state ':[ 9 ] }

        n_estimators:决策树数量,default = 10
        max_features = ' auto ' :最大特征数量,= sqrt ( n_features )
        log2( n_features ),None = n_features
        bootstrap:是否采用有放回抽样,默认为 True
        min_impurity_split:节点划分最小不纯度,一般不改,默认为 1e-7

泰坦尼克号案例
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCVdef dm01_随机森林():
# 1 获取数据集
titan = pd.read_csv(“./data/titanic/train.csv”)# 2 确定特征值和目标值
x = titan[[“Pclass”, “Age”, “Sex”]].copy()
y = titan[“Survived”]# 3-1 处理数据-处理缺失值
x[‘Age’].fillna(value=titan[“Age”].mean(), inplace=True)
print(x.head())# 3-2 one-hot编码
x = pd.get_dummies(x)# 4 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22, test_size=0.2# 5-1 使用决策树进行模型训练和评估
dtc = DecisionTreeClassifier()
dtc.fit(x_train, y_train)
dtc_y_pred = dtc.predict(x_test)
accuracy = dtc.score(x_test, y_test)
print('单一决策树accuracy-->\n', accuracy)# 5-2 随机森林进行模型训练和评估
rfc = RandomForestClassifier(max_depth=6, random_state=9)
rfc.fit(x_train, y_train)
rfc_y_pred = rfc.predict(x_test)
accuracy = rfc.score(x_test, y_test)
print('随机森林进accuracy-->\n', accuracy)# 5-3 随机森林 交叉验证网格搜索 进行模型训练和评估
estimator = RandomForestClassifier()
param = {"n_estimators": [40, 50, 60, 70], "max_depth": [2, 4, 6, 8, 10], "random_state":[9]}
grid_search = GridSearchCV(estimator, param_grid=param, cv=2)
grid_search.fit(x_train, y_train)
accuracy = grid_search.score(x_test, y_test)
print("随机森林网格搜索accuracy:", accuracy)
print(grid_search.best_estimator_)
2、Boosting 思想

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

        通过加权投票的方式,得出预测结果;

        串行的训练方式

代表算法:Adaboost、GBDT、XGBoost、LightGBM

1. Adaboost 算法

概述:自适应提升算法(Adaptive Boosting)通过逐步提高那些被前一步分类错误的样本的权重来

           训练一个强分类器

算法推导

1 初始化数据权重,来训练第1个弱学习器。找最小的错误率计算模型权重,再更新模数据权重

2 根据新权重的样本集 训练第 2 个学习器,重复上述的计算、更新

3 迭代训练在前一个学习器的基础上,根据新的样本权重训练当前学习器,直到训练出 m 个弱学习器

4 m 个弱学习器集成预测公式

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

5 模型权重计算公式

        a_t 为模型权重
        ​ε_t 表示第 t 个弱学习器的错误率

6 样本权重计算公式

        Z_t 为归一化值(所有样本权重总和)
        ​D_t(x)为样本权重
        ​a_t 为模型权重

API

# 导包
from sklearn.preprocessing import LabelEncoder# 训练模型
y = LabelEncoder().fit_transform(y)# 导入Adaboost分类包
from sklearn.ensemble import AdaBoostClassifiermyada = AdaBoostClassifier ( base_estimator = mytree, n_estimators = 500, learning_rate = 0.1, random_state = 0 )

from sklearn.preprocessing import LabelEncoder

类别转换:y = LabelEncoder().fit_transform(y)

from sklearn.ensemble import AdaBoostClassifier

myada = AdaBoostClassifier ( base_estimator = mytree,n_estimators = 500,learning_rate = 0.1,random_state = 0 )

葡萄酒数据案例
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import AdaBoostClassifier   # 集成学习# 1 读数据到内存 df_wine
df_wine = pd.read_csv('./wine0501.csv')
df_wine.info()# 2 特征处理
# 2-2 Adaboost一般做二分类 去掉一类(1,2,3)
df_wine = df_wine[df_wine['Class label']!=1]# 2-3 准备特征值和目标值 Alcohol酒精含量 Hue颜色
x = df_wine[['Alcohol','Hue']].values
y = df_wine['Class label']# 2-4 类别转化 y (2,3)=>(0,1)
y = LabelEncoder().fit_transform(y)# 2-5 划分数据
X_train, X_test, y_train, y_test = train_test_split(x,y,random_state=22,test_size=0.2)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)# 3 实例化单决策树 实例化 Adaboost,由 500颗树组成
mytree = DecisionTreeClassifier(criterion='entropy',max_depth=1,random_state=0)
myada = AdaBoostClassifier(base_estimator=mytree,n_estimators=500,learning_rate=0.1,random_state=0)# 4 单决策树训练和评估
mytree.fit(X_train,y_train)
myscore = mytree.score(X_test,y_test)
myscore# 5 AdaBoost训练和评估
myada.fit(X_train,y_train)
myscore = myada.score(X_test,y_test)
myscore
2. GBDT 梯度提升树

Gradient Boosting Decision Tree

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

梯度提升树:不再拟合残差,而是利用梯度下降的近似方法,利用损失函数的负梯度作为提升树算法中的残差近似值

构建流程:1 初始化弱学习器(目标值的均值作为预测值)

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

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

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

API

# 导包
from sklearn.ensemble import GradientBoostingClassifierfrom sklearn.metrics import classification_report

导包:from sklearn.ensemble import GradientBoostingClassifier

           from sklearn.metrics import classification_report

3. XGBoost 极端梯度提升树

eXtreme Gradient Boosting

构建思想

1 构建模型的方法是最小化训练数据的损失函数,训练的模型复杂度较高,易过拟合

        tips:使用二阶泰勒展开式去近似目标函数

2 在损失函数中加入正则化项,提高对未知的测试数据的泛化性能

        tips:正则化项由树的叶子节点的个数以及L2正则化项组成

3 从样本角度转为按照叶子节点输出角度,优化损失函数,目标函数最终为:

        Gi:每个样本的一阶导
        ​Hi:每个样本的二阶导
​        ft(xi):样本的预测值
        ​T:叶子结点的数目

打分函数:确定某个节点是否能够继续分裂,以及某个特征的最佳分割点

目标函数:

模型复杂度:

                        ​||w||2:由叶子结点值组成向量的模 

API

# 导包
import xgboost as xgb# 模型训练
estimator = xgb.XGBClassifier(n_estimators=100, objective='multi:softmax', eval_metric='merror', eta=0.1, use_label_encoder=False, random_state=22)

导包:import xgboost as xgb

模型训练:estimator = xgb.XGBClassifier(n_estimators=100, objective='multi:softmax',eval_metric='merror', eta=0.1, use_label_encoder=False, random_state=22)

交叉验证--分层抽取

# 导包
from sklearn.model_selection import StratifiedKFoldspliter = StratifiedKFold(n_splits=5, shuffle=True)

导包:from sklearn.model_selection import StratifiedKFold

spliter = StratifiedKFold(n_splits=5,shuffle=True)

分类权重

# 导包
from sklearn.utils import class_weightclasses_weights = class_weight.compute_sample_weight(class_weight = ‘balanced’, y = y_train)

导包:from sklearn.utils import class_weight

classes_weights = class_weight.compute_sample_weight(class_weight = ‘balanced’, y = y_train)

xgb案例:红酒品质分类
from sklearn.utils import class_weightdef dm01_训练模型():
# 1 加载数据集
train_data = pd.read_csv(‘./data/红酒品质分类-train.csv’)
test_data = pd.read_csv(‘./data/红酒品质分类-test.csv’)# 2 准备数据 训练集测试集
x_train = train_data.iloc[:, :-1]
y_train = train_data.iloc[:, -1]
x_test = test_data.iloc[:, :-1]
y_test = test_data.iloc[:, -1]
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)# 2-2 样本不均衡问题处理
classes_weights = class_weight.compute_sample_weight(class_weight=‘balanced’, y=y_train)# 3 xgb模型训练
estimator = xgb.XGBClassifier(n_estimators=100,objective=‘multi:softmax’,eval_metric=‘merror’, eta=0.1, use_label_encoder=False, random_state=22)# 训练的时候,指定样本的权重
estimator.fit(x_train, y_train, sample_weight=classes_weights)# 4 xgb模型评估
y_pred = estimator.predict(x_test)
print(classification_report(y_true=y_test, y_pred=y_pred)) 
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import GridSearchCVdef dm02_交叉验证网格搜索():
# 1 加载数据集
train_data = pd.read_csv('./data/红酒品质分类-train.csv')
test_data = pd.read_csv('./data/红酒品质分类-test.csv')# 2 准备数据 训练集测试集
x_train = train_data.iloc[:, :-1]
y_train = train_data.iloc[:, -1]
x_test = test_data.iloc[:, :-1]
y_test = test_data.iloc[:, -1]
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)# 3 交叉验证时,采用分层抽取
spliter = StratifiedKFold(n_splits=5, shuffle=True)# 4 模型训练
# 4-1定义超参数
param_grid = {‘max_depth’: np.arange(3, 5, 1),‘n_estimators’: np.arange(50, 150, 50),‘eta’: np.arange(0.1, 1, 0.3)}# 4-2 实例化xgb
estimator = xgb.XGBClassifier(n_estimators=100,objective=‘multi:softmax’,eval_metric=‘merror’,eta=0.1,use_label_encoder=False,random_state=22)# 4-2 实例化cv工具
estimator = GridSearchCV(estimator=estimator, param_grid=param_grid, cv=spliter)# 4-3 训练模型
estimator.fit(x_train, y_train)# 5 模型评估
y_pred = estimator.predict(x_test)
print(classification_report(y_true=y_test, y_pred=y_pred))
print(‘estimator.best_estimator_-->’,estimator.best_estimator_)
print(‘estimator.best_params_-->’, estimator.best_params_)
3、Bagging与Boosting的对比
baggingboosting
数据采样对数据进行有放回的采样训练全部样本,根据前一轮学习结果调整数据的重要性
投票方式所有学习器平权投票对学习器进行加权投票
学习顺序并行的,每个学习器没有依赖关系串行,学习有先后顺序

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud整合Zookeeper代替Eureka案例

文章目录 本期代码下载地址zookeeper简介zookeeper下载安装新建服务提供者测试 新建消费者测试 本期代码下载地址 地址:https://github.com/13thm/study_springcloud/tree/main/days4 zookeeper简介 zookeeper是一个分布式协调工具,可以实现注册中心功能 关闭Lin…

chatgpt的实用技巧四temperature 格式

四、temperature 格式 GPT3.5 temperature 的范围为:0-0.7; GPT4.0 temperature 的范围为:0-1; 当 temperature 为 0 时候,结果可稳定。 当 temperature 为 0.7/1 时候,结果发散具备创力。 数值越大&a…

Babylonjs inspector工具开启embedMode模式后不显示

项目地址见:https://github.com/tipace/simple-babylonjs 简单的babylonjs example 本身问题挺简单的,仅做一个记录。开始以为是babylon的问题,最后发现是css问题。 因为是做demo,把canas设置为占满全屏,习惯性的写…

2024-01-05 C语言定义的函数名里面插入宏定义,对函数名进行封装,可以通过宏定义批量修改整个文件的函数名里面的内容

一、C语言定义的函数名里面插入宏定义,对函数名进行封装,可以通过宏定义批量修改整个文件的函数名里面的内容。使用下面的代码对函数进行封装,这样移植的时候可以根据包名和类名进行批量修改,不用一个函数一个函数的修改。。 #de…

Android Bluetooth Framework源码剖析(二)它们都重要

在具体讲述每个模块前我们先来看看一些公共的知识点,如Binder、JNI、Service、AIDL、Broadcast等,它们都是Android/Java基础的知识点,在网络上有许多相关的文章,本文就不深入的讲述它们,但在Bluetooth Framework或者ap…

2023 年顶级前端工具

谁不喜欢一个好的前端工具?在本综述中,您将找到去年流行的有用的前端工具,它们将帮助您加快开发工作流程。让我们深入了解一下! 在过去的 12 个月里,我在我的时事通讯 Web Tools Weekly 中分享了数百种工具。我为前端…

json-server的基础使用

json-server 是什么? 用来快速搭建模拟的 REST API 的工具包 可以30秒内快速为我们搭建一个假的基于 REST API的服务 我们要如何使用呢? 1.先安装 //全局安装 npm i -g json-server 2.创建文件 db.json 我们需要在db.json放入一点内容 放入示例: {/…

门禁监控如何提升安全系数?这个技术,学习一下!

随着社会的不断发展和科技的快速进步,安全管理成为各个领域至关重要的议题。在这一背景下,门禁监控系统逐渐崭露头角,成为保障建筑物和场所安全的关键工具。 门禁监控系统不仅在提高安全性方面发挥着积极作用,而且通过智能化的技术…

【备战蓝桥杯】图论重点 敲黑板啦!

蓝桥杯备赛 | 洛谷做题打卡day11 文章目录 蓝桥杯备赛 | 洛谷做题打卡day11杂务题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题解代码我的一些话 杂务 题目描述 John 的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它。比如&a…

前端学习路线图和一些经验

关于前端目前个人建议的一个路线,也是自己之前前端学习时候的一个大致路线,给想要学习前端的小白一个参考,以前自己刚开始接触前端的时候就是不知道该按照什么路线学习 eg-前端是做什么的? 就是开发网站,移动端,小程序之类的页面 调调接口完成页面的渲…

老飞飞限制多开解决办法2024

办法1 当有些客户端只能开4个。那么开4个后。会提示禁止多开什么的。解决办法1 ECHO OFF color 0A ECHO ---------------------------------------------------------------------------- ECHO. ECHO 版权所有 copyright of ECHO. ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~…

Flask 与 小程序 加入购物车功能

mina/pages/food/info.wxml <!--购买和收藏弹窗--><view class"show-popup" hidden"{{hideShopPopup}}" ><view class"popup-mask" bindtap"closePopupTap"></view><view class"popup-contents"…