头歌-机器学习 第12次实验 Adaboost算法

第1关:什么是集成学习

任务描述

本关任务:根据本节课所学知识完成本关所设置的选择题。

相关知识

为了完成本关任务,你需要掌握:1.什么是集成学习。

什么是集成学习

集成学习方法是一种常用的机器学习方法,分为baggingboosting两种方法,应用十分广泛。集成学习基本思想是:对于一个复杂的学习任务,我们首先构造多个简单的学习模型,然后再把这些简单模型组合成一个高效的学习模型。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。

集成学习采取投票的方式来综合多个简单模型的结果,按bagging投票思想,如下面例子:

假设一共训练了5个简单模型,每个模型对分类结果预测如上图,则最终预测结果为: A:2 B:3 3>2 结果为B

不过在有的时候,每个模型对分类结果的确定性不一样,即有的对分类结果非常肯定,有的不是很肯定,说明每个模型投的一票应该是有相应的权重来衡量这一票的重要性。就像在歌手比赛中,每个观众投的票记1分,而专家投票记10分。按boosting投票思想,如下例:

A:(0.9+0.4+0.3+0.8+0.2)/5=0.52 B:(0.1+0.6+0.7+0.2+0.8)/5=0.48 0.52>0.48 结果为A

闯关要求

根据所学知识完成右侧选择题!!!

1、对于一个二分类问题,假如现在训练了500个子模型,每个模型权重大小一样。若每个子模型正确率为51%,则整体正确率为多少?若把每个子模型正确率提升到60%,则整体正确率为多少?(C)A、51%,60%B、60%,90%C、65.7%,99.99%D、65.7%,90%

第2关: Boosting

任务描述

本关任务:根据本节课所学知识完成本关所设置的选择题。 ####相关知识 为了完成本关任务,你需要掌握:1.Boosting。 #####Boosting 提升方法基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。

历史上,KearnsValiant首先提出了强可学习弱可学习的概念。指出:在PAC学习的框架中,一个概念,如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的;一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么就称这个概念是弱可学习的。非常有趣的是Schapire后来证明强可学习与弱可学习是等价的,也就是说,在PAC学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的。

这样一来,问题便成为,在学习中,如果已经发现了弱学习算法,那么能否将它提升强学习算法。大家知道,发现弱学习算法通常要比发现强学习算法容易得多。那么如何具体实施提升,便成为开发提升方法时所要解决的问题。

bagging不同,boosting采用的是一个串行训练的方法。首先,它训练出一个弱分类器,然后在此基础上,再训练出一个稍好点的弱分类器,以此类推,不断的训练出多个弱分类器,最终再将这些分类器相结合,这就是boosting的基本思想,流程如下图:

可以看出,子模型之间存在强依赖关系,必须串行生成。boosting是利用不同模型的相加,构成一个更好的模型,求取模型一般都采用序列化方法,后面的模型依据前面的模型。

1、现在有一份数据,你随机的将数据分成了n份,然后同时训练n个子模型,再将模型最后相结合得到一个强学习器,这属于boosting方法吗?(B)A、是B、不是C、不确定

第3关:Adaboost算法流程

任务描述

本关任务:用Python实现Adaboost,并通过鸢尾花数据集中鸢尾花的2种属性与种类对Adaboost模型进行训练。我们会调用你训练好的Adaboost模型,来对未知的鸢尾花进行分类。

相关知识

为了完成本关任务,你需要掌握:1.Adaboost算法原理,2.Adaboost算法流程。

数据集介绍

数据集为鸢尾花数据,一共有150个样本,每个样本有4个特征,由于Adaboost是一个串行的迭代二分类算法,运算成本较大,为了减轻运算成本,我们只利用其中两个特征与两种类别构造与训练模型,且adaboost算法返回的值为1-1,所以要将标签为0的数据改为-1部分数据如下图:

数据获取代码:

 
  1. #获取并处理鸢尾花数据
  2. def create_data():
  3. iris = load_iris()
  4. df = pd.DataFrame(iris.data, columns=iris.feature_names)
  5. df['label'] = iris.target
  6. df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
  7. data = np.array(df.iloc[:100, [0, 1, -1]])
  8. #将标签为0的数据标签改为-1
  9. for i in range(len(data)):
  10. if data[i,-1] == 0:
  11. data[i,-1] = -1
  12. return data[:,:2], data[:,-1]
Adaboost算法原理

对提升方法来说,有两个问题需要回答:一是在每一轮如何改变训练数据的权值或概率分布;二是如何将弱分类器组合成一个强分类器。关于第1个问题,AdaBoost的做法是,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注。于是,分类问题被一系列的弱分类器“分而治之”。至于第2个问题,即弱分类器的组合,AdaBoost采取加权多数表决的方法,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用

Adaboost算法流程

AdaBoostAdaptiveBoost的缩写,表明该算法是具有适应性的提升算法。

算法的步骤如下:

1.给每个训练样本(x1​,x2​,..,xN​)分配权重,初始权重w1​均为1/N

2.针对带有权值的样本进行训练,得到模型Gm​(初始模型为$$G _1$$)

3.计算模型Gm​的误分率:

em​=i∑N​wi​I(yi​​=GM​(Xi​))

其中:

I(yi​​=GM​(Xi​)

为指示函数,表示括号内成立时函数值为1,否则为0

4.计算模型Gm​的系数:

αm​=21​log[em​1−em​​]

5.根据误分率e和当前权重向量wm​更新权重向量:

wm+1,i​=zm​wm​​exp(−αm​yi​Gm​(xi​))

其中Zm​为规范化因子:

zm​=i=1∑m​wmi​exp(−αm​yi​Gm​(xi​))

6.计算组合模型f(x)=∑m=1M​αm​Gm​(xi​)的误分率

7.当组合模型的误分率或迭代次数低于一定阈值,停止迭代;否则,回到步骤 2

编程要求

根据提示,在右侧编辑器补充 Python 代码,实现Adaboost算法,并利用训练好的模型对鸢尾花数据进行分类。

测试说明

只需返回分类结果即可,程序内部会检测您的代码,预测正确率高于95%视为过关。

#encoding=utf8import numpy as np#adaboost算法
class AdaBoost:'''input:n_estimators(int):迭代轮数learning_rate(float):弱分类器权重缩减系数'''def __init__(self, n_estimators=50, learning_rate=1.0):self.clf_num = n_estimatorsself.learning_rate = learning_ratedef init_args(self, datasets, labels):self.X = datasetsself.Y = labelsself.M, self.N = datasets.shape# 弱分类器数目和集合self.clf_sets = []# 初始化weightsself.weights = [1.0/self.M]*self.M# G(x)系数 alphaself.alpha = []    def _G(self, features, labels, weights):'''input:features(ndarray):数据特征labels(ndarray):数据标签weights(ndarray):样本权重系数'''#********* Begin *********#m = len(features)error = 100000.0 # 无穷大beat_v = 0.0#单维featuresfeatures_min = min(features)features_max = max(features)n_step = (features_max-features_min+self.learning_rate) // self.learning_ratedirect,compare_array = None,Nonefor i in range(1,int(n_step)):v = features_min + self.learning_rate * iif v not in features:# 误分类计算compare_array_positive = np.array([1 if features[k] > v else -1 for k in range(m)])weight_error_positive = sum([weights[k] for k in range(m)if compare_array_positive[k] != labels[k]])compare_array_nagetive = np.array([-1 if features[k] > v else 1 for k in range(m)])weight_error_nagetive = sum([weights[k] for k in range(m)if compare_array_nagetive[k] != labels[k]])if weight_error_positive < weight_error_nagetive:weight_error = weight_error_positive_compare_array = compare_array_positivedirect = 'positive'else:weight_error = weight_error_nagetive_compare_array = compare_array_nagetivedirect = 'nagetive'# print('v:{} error:{}'.format(v, weight_error))if weight_error < error:error = weight_errorcompare_array = _compare_arraybest_v = vreturn best_v, direct, error, compare_array# 计算alphadef _alpha(self, error):return 0.5 * np.log((1 - error) / error)# 规范化因子def _Z(self, weights, a, clf):return sum([weights[i] * np.exp(-1 * a * self.Y[i] * clf[i])for i in range(self.M)])# 权值更新def _w(self, a, clf, Z):for i in range(self.M):self.weights[i] = self.weights[i] * np.exp(-1 * a * self.Y[i] * clf[i]) / Z# G(x)的线性组合def _f(self, alpha, clf_sets):passdef G(self, x, v, direct):if direct == 'positive':return 1 if x > v else -1else:return -1 if x > v else 1def fit(self, X, y):self.init_args(X, y)for epoch in range(self.clf_num):axis = 0final_direct = 'null'best_clf_error, best_v, clf_result = 100000, None, None# 根据特征维度, 选择误差最小的for j in range(self.N):features = self.X[:, j]# 分类阈值,分类误差,分类结果v, direct, error, compare_array = self._G(features, self.Y, self.weights)if error < best_clf_error:best_clf_error = errorbest_v = vfinal_direct = directclf_result = compare_arrayaxis = j  # axis数字代表第几个属性列# print('epoch:{}/{} feature:{} error:{} v:{}'.format(epoch, self.clf_num, j, error, best_v))if best_clf_error == 0:break# 计算G(x)系数aa = self._alpha(best_clf_error)self.alpha.append(a)# 记录分类器self.clf_sets.append((axis, best_v, final_direct))# 规范化因子Z = self._Z(self.weights, a, clf_result)# 权值更新self._w(a, clf_result, Z)#********* End *********#            def predict(self, feature):result = 0.0for i in range(len(self.clf_sets)):axis, clf_v, direct = self.clf_sets[i]f_input = feature[axis]result += self.alpha[i] * self.G(f_input, clf_v, direct)# signreturn 1 if result > 0 else -1def score(self, X_test, y_test):right_count = 0for i in range(len(X_test)):feature = X_test[i]if self.predict(feature) == y_test[i]:right_count += 1return right_count / len(X_test)

第4关:sklearn中的Adaboost

任务描述

本关任务:你需要调用sklearn中的Adaboost模型,并通过鸢尾花数据集中鸢尾花的2种属性与种类对Adaboost模型进行训练。我们会调用你训练好的Adaboost模型,来对未知的鸢尾花进行分类。

相关知识

为了完成本关任务,你需要掌握:1.AdaBoostClassifier

数据介绍

数据集为鸢尾花数据,一共有150个样本,每个样本有4个特征,由于Adaboost是一个串行的迭代二分类算法,运算成本较大,为了减轻运算成本,我们只利用其中两个特征与两种类别构造与训练模型,且adaboost算法返回的值为1-1,所以要将标签为0的数据改为-1部分数据如下图:

数据获取代码:

 
  1. #获取并处理鸢尾花数据
  2. def create_data():
  3. iris = load_iris()
  4. df = pd.DataFrame(iris.data, columns=iris.feature_names)
  5. df['label'] = iris.target
  6. df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']
  7. data = np.array(df.iloc[:100, [0, 1, -1]])
  8. #将标签为0的数据标签改为-1
  9. for i in range(len(data)):
  10. if data[i,-1] == 0:
  11. data[i,-1] = -1
  12. return data[:,:2], data[:,-1]
AdaBoostClassifier

AdaBoostClassifier 的构造函数中有四个常用的参数可以设置:

  • algorithm:这个参数只有 AdaBoostClassifier 有。主要原因是scikit-learn 实现了两种 Adaboost 分类算法,SAMMESAMME.R。两者的主要区别是弱学习器权重的度量,SAMME.R使用了概率度量的连续值,迭代一般比SAMME快,因此 AdaBoostClassifier 的默认算法algorithm的值也是SAMME.R
  • n_estimators:弱学习器的最大迭代次数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50
  • learning_rate: AdaBoostClassifier 和 AdaBoostRegressor 都有,即每个弱学习器的权重缩减系数ν,默认为1.0
  • base_estimator:弱分类学习器或者弱回归学习器。理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。我们常用的一般是 CART 决策树或者神经网络 MLP。

sklearn中其他分类器一样,AdaBoostClassifier 类中的fit函数用于训练模型,fit函数有两个向量输入:

  • X:大小为**[样本数量,特征数量]**的ndarray,存放训练样本
  • Y:值为整型,大小为[样本数量]的ndarray,存放训练样本的分类标签

AdaBoostClassifier 类中的predict函数用于预测,返回预测标签,predict函数有一个向量输入:

X:大小为**[样本数量,特征数量]**的ndarray,存放预测样本 AdaBoostClassifier的使用代码如下:

 
  1. ada=AdaBoostClassifier(n_estimators=5,learning_rate=1.0)
  2. ada.fit(train_data,train_label)
  3. predict = ada.predict(test_data)
编程要求

填写ada_classifier(train_data,train_label,test_data)函数完成鸢尾花分类任务,其中:

  • train_data:训练样本
  • train_label:训练标签
  • test_data:测试样本
测试说明

只需返回预测结果即可,程序内部会检测您的代码,预测正确率高于95%视为过关。

#encoding=utf8
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifierdef ada_classifier(train_data,train_label,test_data):'''input:train_data(ndarray):训练数据train_label(ndarray):训练标签test_data(ndarray):测试标签output:predict(ndarray):预测结果'''#********* Begin *********#ada=AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_depth=2,min_samples_split=10,min_samples_leaf=5),n_estimators=50,learning_rate=0.2)ada.fit(train_data,train_label)predict=ada.predict(test_data)#********* End *********# return predict

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

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

相关文章

Vue2.x实现商城购物车

1.实现购物车页面 在页面中显示购物车中的商品信息&#xff0c;并能进行数量增减及商品删除操作&#xff0c;购物车中金额也随商品数量的变化而变化 2.创建cart.html页面 创建cart.html页面&#xff0c;在其中创建Vue实例&#xff0c;实例中首先准备一些商品信息以供显示&a…

天软特色因子看板 (2024.4 第3期)

该因子看板跟踪天软特色因子A05005(近一月单笔流出金额占比(%)&#xff0c;该因子为近一月单笔流出金额占比(% 均值因子&#xff0c;用以刻画下跌时的 单成交中可能存在的抄底现象 今日为该因子跟踪第3期&#xff0c;跟踪其在SH000852 (中证1000) 中的表现&#xff0c;要点如下…

微信小程序转盘抽奖

场景&#xff1a; 在微信小程序里面开展抽奖活动使用转盘抽奖&#xff1b;类似下图&#xff08;图片来自百度&#xff09; 方法&#xff1a; 使用lukcy-canvas组件 在 微信小程序 中使用 | 基于 Js / TS / Vue / React / 微信小程序 / uni-app / Taro 的【大转盘 & 九宫…

Dolphinscheduler单机部署

目录 概述实践二进制包前置准备工作解压并启动 Dolphinscheduler登录 Dolphinscheduler启停服务配置数据库 结束 概述 Standalone仅适用于 Dolphinscheduler 的快速体验 实践 官网 官网standalone 二进制包 二进制包&#xff1a;在下载页面下载 Dolphinscheduler 二进制包…

IO流【 文件字符输入、出流;带缓冲区的字符输入、出流;对象流】

day36 IO流 字符流继承图 字符流 继day35 应用场景&#xff1a;操作纯文本数据 注意&#xff1a;字符流 字节流编译器 编译器&#xff1a;可以识别中文字符和非中文字符&#xff0c;非中文字符获取1个字节&#xff08;一个字节一个字符&#xff09;&#xff0c;编译器会根据…

深入浅出Golang image库:编写高效的图像处理代码

深入浅出Golang image库&#xff1a;编写高效的图像处理代码 引言image库概览图像处理基础概念image库的主要组成和功能image接口图像格式的支持color模型 结论 图像的基本操作创建图像新图像的创建从文件加载图像 图像的保存与导出图像的颜色和像素处理绘制基本形状和文字 高级…

【开源社区】openEuler、openGauss、openHiTLS、MindSpore

【开源社区】openEuler、openGauss、openHiTLS、MindSpore 写在最前面开源社区参与和贡献的一般方式开源技术的需求和贡献方向 openEuler 社区&#xff1a;开源系统官方网站官方介绍贡献攻略开源技术需求 openGauss 社区&#xff1a;开源数据库官方网站官方介绍贡献攻略开源技术…

数据结构(三)----栈和队列

目录 一.栈 1.栈的基本概念 2.栈的基本操作 3.顺序栈的实现 •顺序栈的定义 •顺序栈的初始化 •进栈操作 •出栈操作 •读栈顶元素操作 •若使用另一种方式: 4.链栈的实现 •链栈的进栈操作 •链栈的出栈操作 •读栈顶元素 二.队列 1.队列的基本概念 2.队列的基…

关于ABP 新增表,dbfirst模式

下面的代码是基于abp生成的项目&#xff0c;项目名&#xff1a;Store 1.在Domain结尾的项目中通过EF工具生成数据实体&#xff1a; Scaffold-DbContext Data Source服务器IP;Initial Catalog数据库;User Idsa;Password密码;EncryptFalse; Microsoft.EntityFrameworkCore.SqlS…

Java基础_15集合及其方法

今天的内容 1.集合 1.集合【重点】 1.1为什么使用集合 集合和数组是一样的都是用来存储数据的&#xff01;&#xff01;&#xff01; 真实的开发的时候&#xff0c;使用的是集合不是数组&#xff0c;为啥&#xff1f; 数组存数据: ​ 1.数组的容量是固定的 ​ 2.数组封装的方法…

慢品人间烟火色,闲观万事岁月长

小女孩的衣柜里&#xff0c;怎能缺少一套别致的新中式穿搭&#xff1f;让我们的小公主在时尚与传统中寻找平衡 演绎属于自己的中国风魅力精致的小立领&#xff0c;淡淡的文艺复古气息 上衣系带设计&#xff0c;外加一层高透轻纱穿上身如亭亭玉立的大小姐整个人仿佛笼罩了一层…

【docker】之linux写shell脚本备份线上数据库(备份为dump文件)

目录 1. SH文件1.1 SH文件示例1.2 文件解释1.3 .sh文件执行 2. 备份线上数据库的.sh文件2.1 文件命令解析 3. 命令执行4. 线下dump文件的恢复与备份 环境&#xff1a;linux容器&#xff1a;docker 1. SH文件 SH文件通常指的是 Shell 脚本文件&#xff0c;文件后缀名为.sh&…

IP查询在追踪网络攻击源头中的应用

随着网络攻击事件的不断增加&#xff0c;追踪攻击源头成为网络安全领域的重要任务之一。IP查询技术通过分析网络流量中的IP地址&#xff0c;可以帮助确定攻击的来源。本文将探讨IP查询在追踪网络攻击源头中的应用&#xff0c;包括其原理、方法以及实际案例分析。 IP地址查询&a…

比特币减半后 牛市爆发

作者&#xff1a;Arthur Hayes of Co-Founder of 100x 编译&#xff1a;Qin jin of ccvalue (以下内容仅代表作者个人观点&#xff0c;不应作为投资决策依据&#xff0c;也不应被视为参与投资交易的建议或意见&#xff09;。 Ping PingPing&#xff0c;我的手机发出的声音&…

Linux CentOS 安装 MySQL 服务教程

Linux CentOS 安装 MySQL 服务教程 1. 查看系统和GNU C库(glibc)版本信息 1.1 查询机器 glibc 版本信息 glibc&#xff0c;全名GNU C Library&#xff0c;是大多数Linux发行版中使用的C库&#xff0c;为系统和应用程序提供核心的API接口。在Linux系统中&#xff0c;特别是在…

js 数组 按列循环二维数组

期待效果&#xff1a; 核心代码&#xff1a; //js function handle(array) {var result [];for (let i 0; i < array[0].length; i) {var item []; for (let j 0; j < array.length; j) {item.push(array[j][i])} result.push(item);} return result; } 运行代码&a…

酷开科技 | 酷开系统打破客厅局限让大家享受更智能便捷的服务

曾经电视是家庭场景中的重要屏幕&#xff0c;是家庭发现世界和获取资讯的中心。但经历了近一百年的发展&#xff0c;传统电视行业进入瓶颈期&#xff0c;电视在家庭中的地位被逐渐替代。特别是智能手机的诞生&#xff0c;让手机成为个人生活的中心和全社会关注焦点&#xff0c;…

STM32F7 MPU Cache的原理和一致性问题

目录 概述 1 Cache 及其原理 2 结构及策略 2.1 Cache类型 2.2 Cache实例 3 Cache 及 MPU 属性 4 Cache 一致性问题 4.1 未Clean写Cache情况 4.2 DMA 更新物理内存情况 4.3 一个实例 4.3.1 功能描述 4.3.2 代码实现 4.3.3 结论 概述 本文主要从结构原理以及应用方…

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

助力低碳出行 | 基于ACM32 MCU的电动滑板车方案

随着智能科技的快速发展&#xff0c;电动滑板车的驱动系统也得到了长足的发展。国内外的电动滑板车用电机驱动系统分为传统刷式电机和无刷电机两种类型。其中&#xff0c;传统的刷式电机已经逐渐被无刷电机所取代&#xff0c;无刷电机的性能和寿命都更出色&#xff0c;已成为电…