18- Adaboost梯度提升树 (集成算法) (算法)

news2024/11/24 15:56:17

Adaboost 梯度提升树:

from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(n_estimators=500)
model.fit(X_train,y_train)


1、Adaboost算法介绍

1.1、算法引出

AI 39年(公元1995年),扁鹊成立了一家专治某疑难杂症的医院,经过半年的精心筹备,硬件设施已全部到位,只缺经验丰富的医生前来坐诊。找几个猎头打听了一下,乖乖,请一个资深专家(总监头衔的),一年的工资就得256万。这恐怕还不够去知名搜索引擎投放广告!

穷则思变,扁鹊院长想来想去,找到了两个天才的顾问,名叫Freund和Schapire,想请他们出出主意,怎样用较低的成本解决医生的问题。这两位老兄想到了同一个点子:

三个臭皮匠,赛过诸葛亮

我们玩人海战术!不如去医学院招一批应届生,给他们训练一段时间然后上岗,组成一个会诊小组,一起来给病人看病,集体决策。扁鹊很快招来了8个年轻的新手:

赵大夫,钱大夫,孙大夫,李大夫,周大夫,吴大夫,郑大夫,王大夫

1.2、算法策略

怎么训练这些新人呢?两个顾问设计出了一套培训方案:

  1. 用大量的病例让这些新手依次学习,每个大夫自己琢磨怎样诊断,学习结束后统计一下每个人在这些病例上的诊断准确率

  2. 训练时,前面的大夫误诊的病例,后面的大夫要重点学习研究,所谓查缺补漏

  3. 训练结束之后,给每个大夫打分,如果一个大夫对病例学习的越好,也就是说在这些学习的病例集上诊断的准确率越高,他在后面诊断病人时的话语权就越大

1.3、训练流程

接下来培训过程开始了。首先接受培训的是赵大夫,经过学习总结,他摸索出了一套诊断规则,这套规则表现很不错,至少在学习用的病例集上,达到了70%的诊断准确率。学习完成之后,他给每一条病例调整了权重,被他误诊的病例,权重增大,诊断正确的病例,权重调小,以便于后面的医生有重点的学习。

接下来让钱大夫学习,他同样学习这些病例,但重点要关注被赵大夫误诊的那些病例,经过一番训练,钱大夫达到了75%的准确率。学习完之后,他也调整了这些病例的权重,被他误诊的病例,加大权重,否则减小权重。

后面的过程和前面类似,依次训练孙大夫,李大夫,周大夫,吴大夫,郑大夫,王大夫,每个大夫在学习的时候重点关注被前面的大夫误诊的病例,学习完之后调整每条病例的权重。这样到最后,王大夫对前面这些大夫都误诊的病例特别擅长,专攻这些情况的疑难杂症!

1.4、大夫话语权

当所有大夫都培训完成之后,就可以让他们一起坐堂问诊了。Freund和Schapire设计出了这样一套诊断规则:来一个病人之后,8个大夫一起诊断,然后投票。如果一个大夫之前在学习时的诊断准确率为p,他在投票时的话语权是:

\bg_white \small \alpha = \frac{1}{2}ln\frac{p}{1-p}

按照这个计算规则,8个大夫的话语权为:

 1.5、诊断结果

这样诊断结果的计算方法为,先汇总整合8个大夫的诊断结果:

在这里对病人的诊断结果有两种可能,阳性和阴性,我们量化表示,+1表示阳性,-1表示阴性。

最后的诊断结果是:如果上面计算出来的s值大于0,则认为是阳性,否则为阴性。

1.6、病人诊断

第一个病人来了,8个大夫一番诊断之后,各自给出了结果:

现在是投票集体决策的时候了。投票值为:

按照规则,这个病人被判定为阳性。

1.7、算法总结

医院运营了3个月,效果出奇的好,扁鹊院长统计了一下,诊断准确率居然高达95%,不比一个资深老专家差!每个医生一年的工资10万,8个医生总共才80万,这比请一个资深专家要便宜170万,太划算了!

这次成功之后,Freund和Schapire决定把这种方法推广到其他行业,用于解决一些实际问题。这些行业要解决的问题都有一个特点:要做出一个决策,这个决策有两种可能,例如银行要根据客户的收入、负债情况、信用记录等信息决定给客户贷款还是不贷款;人脸识别公司要判断一张图像是人脸还是不是人脸。这就是机器学习中的二分类问题,给定一个样本数据,判断这个样本的类别。对于上面的疾病诊断来说,样本数据就是病人的各项检查数据,类别是阴性和阳性。

两位天才给这种方法取了一个名字:AdaBoost算法

Adaboosting中的Ada是adaptive的意思,所以AdaBoosting表示自适应增强算法

2、Adaboost算法使用

2.1、乳腺癌案例

1、导包

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier,RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn import datasets

2、加载拆分数据

X,y = datasets.load_breast_cancer(return_X_y=True)
display(X.shape,y.shape,np.unique(y))
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)

3、使用决策树建模

model = DecisionTreeClassifier()
# 训练
model.fit(X_train,y_train)
# 预测值
y_pred = model.predict(X_test)
display(y_pred[:20],y_test[:20])
# 准确率
accuracy_score(y_test,y_pred)    # 准确率大约是:0.8947368421052632

4、使用随机森林建模

%%time
model = RandomForestClassifier(n_estimators=500)
# 训练
model.fit(X_train,y_train)
# 预测
y_pred = model.predict(X_test)
display(y_pred[:20],y_test[:20])
# 准确率
accuracy_score(y_test,y_pred)   # 准确率大约是:0.956140350877193

5、使用Adaboost算法建模

%%time
model = AdaBoostClassifier(n_estimators=500)
# 训练
model.fit(X_train,y_train)
# 预测
y_pred = model.predict(X_test)
display(y_pred[:20],y_test[:20])
# 准确率
accuracy_score(y_test,y_pred)  # 准确率大约是:0.9649122807017544

结论:

  • 课件,Adaboost对数据拟合更加深入,准确率高,效果好

  • 果然是:三个臭皮匠,顶个诸葛亮!

2.2、手写数字案例

1、导包

import numpy as np
import pandas as pd
from sklearn import tree
import graphviz
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier,RandomForestClassifier
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

2、加载拆分数据

data = pd.read_csv('./digits.csv')
# 随机抽样
data = data.take(np.random.randint(0,42000,5000))
X = data.iloc[:,1:]
y = data['label']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,
                                                 random_state=1024)
display(X_train.shape,X_test.shape,y_train.shape,y_test.shape)

3、决策树

model = DecisionTreeClassifier()
# 训练
model.fit(X_train,y_train)
# 预测值
y_pred = model.predict(X_test)
display(y_pred[:20],y_test[:20].values)
# 准确率
accuracy_score(y_test,y_pred)      # 准确率:0.779

4、随机森林

%%time
model = RandomForestClassifier(n_estimators=100)
# 训练
model.fit(X_train,y_train)
# 预测
y_pred = model.predict(X_test)
display(y_pred[:20],y_test[:20].values)
# 准确率
accuracy_score(y_test,y_pred)     # 准确率:0.934

5、Adaboost提升算法

%%time
model = AdaBoostClassifier(n_estimators=100)
# 训练
model.fit(X_train,y_train)
# 预测
y_pred = model.predict(X_test)
display(y_pred[:20],y_test[:20].values)
# 准确率
accuracy_score(y_test,y_pred)   # 准确率:0.521

6、逻辑回归算法

%%time
model = LogisticRegression(max_iter=10000)
# 训练
model.fit(X_train,y_train)
# 预测
y_pred = model.predict(X_test)
display(y_pred[:20],y_test[:20].values)
# 准确率
accuracy_score(y_test,y_pred)   # 准确率:0.891

7、可视化

plt.figure(figsize=(5*2,10*2))
plt.rcParams['font.family'] = 'STKaiti'
for i in range(50):
    plt.subplot(10,5,i + 1)
    plt.imshow(X_test.iloc[i].values.reshape(28,28))
    plt.axis('off')
    plt.title('预测值是:%d' %(y_pred[i]))

 结论:

  • 手写数字的特征是像素值,特征值多大784个

  • 而且像素中很多值都是0,没有特征区分度

  • Adaboost对这个效果就不好

  • 逻辑回归,比决策树算法效果要好一些

3、Adaboost二分类算法原理

3.1、算法流程

算法流程详解:

3.2、手撕算法

3.2.1、创建模拟数据

from sklearn.ensemble import AdaBoostClassifier
import numpy as np
from sklearn import tree
import graphviz
X = np.arange(10).reshape(-1,1)
y = np.array([1,1,1,-1,-1,-1,1,1,1,-1])
display(X,y)

3.2.2、Adaboost建模

# 使用SAMME表示在构建树时,每棵树都采用相同的分裂方式
ada = AdaBoostClassifier(algorithm='SAMME',n_estimators=3)
ada.fit(X,y)
y_ = ada.predict(X)
display(y,y_)

3.2.3、查看每一棵树结构

第一棵树:

dot_data = tree.export_graphviz(ada[0],filled=True)
graph = graphviz.Source(dot_data)
y1_ = ada[0].predict(X)  # 第一棵树的预测值,怎么预测呢?

 第二棵树:

dot_data = tree.export_graphviz(ada[1],filled=True)
print(ada[1].predict(X))
graphviz.Source(dot_data)#样本权重,发生变化了

 第三棵树:

dot_data = tree.export_graphviz(ada[2],filled=True)
print(ada[2].predict(X))
graphviz.Source(dot_data)

 3.2.4、第一棵树代码构建

1、gini系数计算

w1 = np.full(shape = 10,fill_value=1/10)
cond = y == -1
p1 = w1[cond].sum()
cond = y == 1
p2 = w1[cond].sum()
# 计算方式一
gini = p1 * (1 - p1) + p2 * (1 - p2)
print('计算方式二:',gini)
# 计算方式二
gini = 1 - p1**2 - p2**2
print('计算方式二:',gini)     # 输出:0.48

2、拆分条件

gini_result = []
best_split = {}
lower_gini = 1
# 如何划分呢,分成两部分
for i in range(len(X) - 1):
    split = X[i:i+2].mean()
    cond = (X <= split).ravel()
    part1 = y[cond]
    part2 = y[~cond]
    gini1 = 0
    gini2 = 0
    for i in np.unique(y):
        p1 = (part1 == i).sum()/part1.size
        gini1 += p1 * (1 - p1)
        p2 = (part2 == i).sum()/part2.size
        gini2 += p2 * (1 - p2)
    part1_p = cond.sum()/cond.size
    part2_p = 1 - part1_p
    gini  = part1_p * gini1 + part2_p* gini2
    gini_result.append(gini)
    if gini < lower_gini:
        lower_gini = gini
        best_split.clear()
        best_split['X[0]'] = split
print(gini_result)
print(best_split)

3、计算误差率

# 计算误差率
print(y)
y1_ = ada[0].predict(X) #预测结果
print(y1_)
y1_ = np.array([1 if X[i] < 2.5 else -1 for i in range(10)])
print(y1_)
e1 = ((y != y1_)).mean()#误差
print('第一棵树误差率是:',e1)

4、计算第一个分类器权重

# 计算第一个弱学习器的权重,相当于大夫的话语权
alpha_1 = 1/2*np.log((1 -e1)/e1 )
print('计算第一个弱学习器的权重:',alpha_1)
# 输出:计算第一个弱学习器的权重: 0.42364893019360184

5、更新样本权重

# 在w1的基础上,进行更新 w1 = [0.1,0.1,0.1……]
w2 = w1 * np.exp(-alpha_1 * y * y1_)
w2 = w2/w2.sum() # 归一化
print('第一棵树学习结束更新权重:\n',w2)
# 输出
'''
第一棵树学习结束更新权重:
 [0.07142857 0.07142857 0.07142857 0.07142857 0.07142857 0.07142857
 0.16666667 0.16666667 0.16666667 0.07142857]
'''

3.2.5、第二棵树代码构建  (后面继续)

 

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

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

相关文章

ubuntu18.04 天选2 R95900hx 3060显卡驱动安装

天选2 R95900hx 3060显卡驱动安装需求问题解决内核集显显卡驱动需求 外接显示器&#xff0c;安装nvidia驱动 问题 由于一开始直接在软件和更新中附加读懂安装了nvidia-470&#xff0c;导致系统黑屏。 解决 grub页面系统选择进入ubuntu recovery模式&#xff0c;选择root&a…

ChatGPT模型采样算法详解

ChatGPT模型采样算法详解 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型有几个参数&#xff0c;理解它们对文本生成任务至关重要。其中最重要的一组参数是temperature和top_p。二者控制两种不同的采样技术&#xff0c;用于因果语言模型&#xff08;Cau…

BCMA靶点药物销售市场-上市药品前景分析

在之前的二十多年里&#xff0c;治疗多发性骨髓瘤(MM)的药物选择发生了重大转变&#xff0c;无论是新诊断还是复发/难治期。新药类别的引入&#xff0c;如蛋白酶体抑制剂、免疫调节剂、抗CD38和抗SLAMF7单克隆抗体&#xff0c;加上自体干细胞移植&#xff0c;使该疾病的五年生存…

Android无菜单键,如何触发onCreateOptionsMenu(Menu menu)

文章目录小结问题及解决无法触发onCreateOptionsMenu(Menu menu)修改配置文件解决使用一个按钮来触发其它办法参考小结 现在的Android有三个键&#xff1a; 任务键&#xff0c;Home键&#xff0c;返回键&#xff0c;也就是没有菜单键了&#xff0c;那么如何如何触发onCreateOp…

TensorRT的功能

TensorRT的功能 文章目录TensorRT的功能2.1. C and Python APIs2.2. The Programming Model2.2.2. The Runtime Phase2.3. Plugins2.4. Types and Precision2.5. Quantization2.6. Tensors and Data Formats2.7. Dynamic Shapes2.8. DLA2.9. Updating Weights2.10. trtexec本章…

狂神 VUE笔记

文章目录0 VUE相关了解0.1 概述0.2 MVVM0.3 JavaScript框架0.4 [Vue](https://so.csdn.net/so/search?qVue&spm1001.2101.3001.7020)的七大属性1 VUE基础1.0 第一个vue代码&#xff1a;Hello&#xff0c;vue1.1 v-bind1.2 v-if &#xff0c; v-else &#xff0c; v-else-i…

Burp Suite Professional 2023.2 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;https://sysin.org/blog/burp-suite-pro-2023/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org Burp Suite Professional&…

【Spring】一文带你吃透AOP面向切面编程技术(下篇)

个人主页&#xff1a; 几分醉意的CSDN博客_传送门 上节我们介绍了什么是AOP、Aspectj框架的前置通知Before传送门&#xff0c;这篇文章将继续详解Aspectj框架的其它注解。 文章目录&#x1f496;Aspectj框架介绍✨JoinPoint通知方法的参数✨后置通知AfterReturning✨环绕通知Ar…

mysql数据库完全备份和增量备份与恢复

mysql数据备份&#xff1a; 数据备份方式 物理备份&#xff1a; 冷备&#xff1a;.冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库热备&#xff1a;一般用于保证服务正常不间断运行&#xff0c;用两台机器作为服务机器&#xff0c;一台用于实际数据库操作应用,另外…

基于stm32mp157的嵌入式linux+qt项目实战物联网毕业设计选题之智慧医疗项目

stm32mp157开发板FS-MP1A是华清远见自主研发的一款高品质、高性价比的Linux单片机二合一的嵌入式教学级开发板。开发板搭载ST的STM32MP157高性能微处理器&#xff0c;集成2个Cortex-A7核和1个Cortex-M4 核&#xff0c;A7核上可以跑Linux操作系统&#xff0c;M4核上可以跑FreeRT…

吃瓜教程 | Datawhale 打卡(Task 01)

第1章 绪论 引言 机器学习致力于研究如何通过计算的手段&#xff0c;利用经验来改善系统自身的性能。 “经验”通常以“数据”的形式存在。 机器学习研究的主要内容&#xff1a; 在计算机上从数据中产生“模型”&#xff08;model&#xff09;的算法&#xff0c;即“学习算法…

软件开发风险 需要规避的4个重点

1、前期减少投资 开发软件&#xff0c;最好减少前期的投入。软件开发成本高低是取决于所需开发的功能&#xff0c;需求越多&#xff0c;需要实现的功能越多&#xff0c;开发成本就越高。在不确定开发软件能够带来预期价值的情况下&#xff0c;建议先开发核心功能&#xff0c;辅…

分享166个HTML医疗保健模板,总有一款适合您

分享166个HTML医疗保健模板&#xff0c;总有一款适合您 166个HTML医疗保健模板下载链接&#xff1a;https://pan.baidu.com/s/1tBFEInec5Jnw_ShQd21MJg?pwdakif 提取码&#xff1a;akif Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 import os import shuti…

【残差稠密网络:医学图像:超分】

Residual dense network for medical magnetic resonance images super-resolution &#xff08;医学磁共振图像超分辨率的残差稠密网络&#xff09; 高分辨率磁共振成像&#xff08;MRI&#xff09;有助于专家定位病灶和诊断疾病&#xff0c;但高分辨率MRI难以获得。此外&am…

PyQt5数据库开发1 4.2 配置SQL Server 2008 数据源(ODBC编程)

文章目录 配置SQL Server 2008 数据源&#xff08;ODBC编程&#xff09; 1. 了解要配置的数据源服务器名称&#xff0c;以及数据库和对应表 2. 打开控制面板&#xff0c;点击管理工具 3. 双击数据源 4. 选择“用户DSN”选项卡&#xff0c;点击“添加” 5. 选择SQL Serv…

晚上下班之后可以做什么副业,业余时间需要利用起来

对大多数普通人来说&#xff0c;他们晚上有很多空闲时间&#xff0c;但他们总是在手机上玩游戏&#xff0c;刷视频&#xff0c;白白度过一夜。事实上&#xff0c;近年来&#xff0c;很多朋友都想利用晚上的时间做一些副业&#xff0c;因为目前的工资已经不能满足自己的需求&…

第05章_MySQL排序与分页

第05章_排序与分页 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. 排序数据 如果没有使用排序操作&#xff0c;默认情况下查询返回的数据时按照添加数据的顺序显示的 SELECT employee_id, la…

yocto创建自己的machine

前面讲了如何离线构建yocto工程&#xff0c;这节讲如何创建自己的machine&#xff0c;在初始化yocto启动bitbake需要输入如下命令 DISTROfsl-imx-fb MACHINEimx6ull14x14evk source imx-setup-release.sh -b build其中DISTRO用来指定发行版本 MACHINE用来指定硬件平台 build为构…

HTML复习1

VSCode 工具生成骨架标签新增代码 < !DOCTYPE html>表示的什么意思&#xff1f; 这句代码的意思是&#xff1a;当前页面采取的是HTML5版本来显示网页. 注意&#xff1a; < !DOCTYPE> 声明位于文档中的最前面的位置&#xff0c;处于 < html> 标签之前。< …

SAP S/4HANA Cloud 2302 财务模块亮点

&#xff08;亮点1:&#xff09;含项目制造的按订单设计 (ETO) 使用 SAP S/4HANA Cloud 2302&#xff0c;新的范围项目 6GD首先发布在德国和美国的国家版本下&#xff0c;提供项目制造的按订单设计 (ETO)的功能。 价值体现 借助 ETO 解决方案&#xff0c;您可以&#xff1a;…