机器学习——boosting之提升树

提升树和adaboost基本流程是相似的

我看到提升树的时候,懵了
这…跟adaboost有啥区别???
直到看到有个up主说了,我才稍微懂

在这里插入图片描述
相当于,我在adaboost里的弱分类器,换成CART决策树就好了呗?

书上也没有明说,唉。。。

还好,有大神提升树的具体讲解

看出来了,提升树主要是做二叉树分类和回归的:

  • 如果是处理分类问题,弱分类器用CART决策树,就是adaboost了
  • 如果是处理回归问题,弱分类器也是用CART决策树
    • 每个新的弱分类器都是降低残差

1. 推导过程

  1. 建立提升树的加法模型

    • 假设构成第i个弱分类器的参数为 θ i θ_i θi,第i个弱分类器则表示为 T ( x , θ i ) T(x,θ_i) T(x,θi)
    • 当前弱分类器若表示为 T ( x , θ m ) T(x,θ_m) T(x,θm),强分类器则表示为: f m ( x ) = f m − 1 ( x ) + T ( x , θ m ) f_m(x) = f_{m-1}(x)+T(x,θ_m) fm(x)=fm1(x)+T(x,θm)
    • 预测结果为 y p r e = f m ( x ) = f m − 1 ( x ) + T ( x , θ m ) y_{pre}=f_m(x)=f_{m-1}(x)+T(x,θ_m) ypre=fm(x)=fm1(x)+T(x,θm)
  2. 损失函数Loss采用平方误差损失函数

    • 使用CART回归树作为弱分类器,那么每次选取的特征及特征值,都会使平方误差损失函数达到最低
    • 但弱分类器是不需要完全CART回归树一次性就把所有特征及特征值都遍历训练完成的,只需要挑选平方损失函数最低的那个特征及特征值
      弱分类器,只进行一个树杈的划分
    • 弱分类器内部的平方损失函数,是取二分树杈的左右两个数据集的平方损失之和最小
      L o s s t r e e = ∑ ( y i l e f t − y ˉ l e f t ) 2 + ∑ ( y j r i g h t − y ˉ r i g h t ) 2 Loss_{tree} = ∑(y_i^{left}-\bar{y}_{left})^2+ ∑(y_j^{right}-\bar{y}_{right})^2 Losstree=(yileftyˉleft)2+(yjrightyˉright)2
    • 强分类器的平方损失函数,是取所有样本的预测值与真实值的平方损失之和最小
      L o s s = ∑ ( y i − y i p r e ) 2 Loss = ∑(y_i-y_i^{pre})^2 Loss=(yiyipre)2 y i y_i yi表示真实值, y i p r e y_i^{pre} yipre表示预测值

    用来选取弱分类器的特征及特征值,进而将所有样本数据划分成两个子集
    每个子集的预测值,是子集的均值

    • 根据 y p r e = f m ( x ) = f m − 1 ( x ) + T ( x , θ m ) y_{pre}=f_m(x)=f_{m-1}(x)+T(x,θ_m) ypre=fm(x)=fm1(x)+T(x,θm),可得
      • L o s s = ∑ ( y i − f m − 1 ( x ) − T ( x , θ m ) ) 2 Loss=∑(y_i-f_{m-1}(x)-T(x,θ_m))^2 Loss=(yifm1(x)T(x,θm))2
      • 其中 y i − f m − 1 ( x ) y_i-f_{m-1}(x) yifm1(x)表示上次强分类器的预测值与实际值的差,一般叫做残差(残留的差值)
      • 我们可以设为 r i = y i − f m − 1 ( x ) r_i = y_i-f_{m-1}(x) ri=yifm1(x),表示残差
      • 那么 要使Loss达到最小,只需要当前的弱分类器,尽可能地拟合残差即可, L o s s = ∑ ( r i − T ( x , θ m ) ) 2 Loss=∑(r_i-T(x,θ_m))^2 Loss=(riT(x,θm))2
      • 那么我们无需求出当前弱分类器的参数 θ,只要计算出每次的强分类器后的残差,再新增一个弱分类器,对残差进行CART回归树的拟合即可
  3. 每次只对残差拟合,直到Loss函数达到某个极小的阈值、特征及特征值已完全分完了,或达到迭代次数即可

2. 程序推演

设置阈值
获取所有特征及特征值
第一轮:

  1. 更改CART决策树,让它只每次只选择一个特征及特征值,划分数据集
  2. 每次划分后,计算出当前弱分类器的预测值 T m ( x , θ ) T_m(x,θ) Tm(x,θ)——对样本的数值预测
  3. 计算出强分类器的预测值 f m = f m − 1 + T ( x , θ ) f_m=f_{m-1}+T(x,θ) fm=fm1+T(x,θ)
  4. 再计算所有样本的残差(预测值-真实值)
  5. 计算强分类器的平方损失函数Loss,判断是否低于阈值,若低于阈值,停止程序

第二轮:

  1. 根据残差,再用CART决策树,选择一个特征及特征值,划分数据集
  2. 每次划分后,计算出当前弱分类器的预测值 T m ( x , θ ) T_m(x,θ) Tm(x,θ)——对样本更新后的残差预测
  3. 计算出强分类器的预测值 f m = f m − 1 + T ( x , θ ) f_m=f_{m-1}+T(x,θ) fm=fm1+T(x,θ)
  4. 再计算所有样本残差的残差(预测值-残差值)
  5. 计算强分类器的平方损失函数Loss,判断是否低于阈值,若低于阈值,停止程序

第三轮同第二轮…

perfect!

二叉回归树代码

确实,预测值的还不错的感觉,但不知道会不会过拟合,还没用测试数据去试。。。大概率是会过拟合的吧。。。
最终预测值和原值的残差,呈正态分布,且大多数聚集在0附近,本来想做个配对样本T检验的。。。但好像均值差距太小,搞不起来
在这里插入图片描述

在这里插入图片描述

import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
pd.options.display.max_columns = None
pd.options.display.max_rows = None
# 获取所需数据:'推荐分值', '专业度','回复速度','服务态度','推荐类型'
datas = pd.read_excel('./datas4.xlsx')
important_features = ['专业度','回复速度','服务态度','推荐分值'] #datas_1 = datas[important_features]
Y = datas_1['推荐分值']
X = datas_1.drop('推荐分值',axis=1)
X_features = X.columns
Y_features = '推荐分值'# 设置阈值
# 获取所有特征及特征值
# 单次:
# 1. 更改CART决策树,让它只每次只选择一个特征及特征值,划分数据集
# 2. 每次划分后,计算出当前弱分类器的预测值$T_m(x,θ)$
# 3. 计算出强分类器的预测值$f_m=f_{m-1}+T(x,θ)$
# 4.  **再计算并更新所有样本的残差(预测值-真实值)**
# 5. 计算强分类器的平方损失函数Loss,判断是否低于阈值,若低于阈值,停止程序
class CartRegTree:def __init__(self,datas,Y_feat,X_feat):self.tree_num = 0self.datas = datasself.Y_feat = Y_featself.X_feat = X_featself.all_feat_and_point = self.get_feat_and_point()self.T = {} # 用于存储所有弱分类器self.last_Loss = 0# 获取所有特征及特征值def get_feat_and_point(self):all_feat_and_point = {}for i in self.X_feat:divide_points = self.datas[i].unique()points = [j for j in divide_points]all_feat_and_point[i]=pointsreturn all_feat_and_pointdef get_tree_name(self):self.tree_num += 1return 'T'+str(self.tree_num)def get_subtree(self,datas):# 1. 选择最优的特征及特征值,划分数据集min_Loss = Nonefeat_and_point = Nonefor feat,points in self.all_feat_and_point.items():for point in points:temp_Loss = self.get_Loss_tree(datas,feat,point)if min_Loss == None or temp_Loss<min_Loss:min_Loss = temp_Lossfeat_and_point = (feat,point)left_datas = datas[datas[feat_and_point[0]]<=feat_and_point[1]]right_datas = datas[datas[feat_and_point[0]] > feat_and_point[1]]# 2.计算出当前弱分类器的预测值,存储左右子树的预测值left_Y = left_datas[self.Y_feat].mean()right_Y = right_datas[self.Y_feat].mean()T_name = self.get_tree_name()self.T[T_name]={'feat':feat_and_point[0],'point':feat_and_point[1],'left_Y':left_Y,'right_Y':right_Y}# 3. 计算并更新所有样本的残差,datas['Tm'] = np.where(datas[feat_and_point[0]]<=feat_and_point[1],left_Y,right_Y)datas[self.Y_feat] = datas[self.Y_feat]-datas['Tm']# 4. 计算残差平方和,判断是否停止Loss = round((datas[self.Y_feat]**2).sum(),2)if Loss==self.last_Loss or self.tree_num>10**3:return self.Telse:self.last_Loss = Lossself.get_subtree(datas)def get_Loss_tree(self,datas,feat,point):left_datas = datas[datas[feat]<=point]right_datas = datas[datas[feat]>point]# 求左右两边的平方损失和left_mean = left_datas[self.Y_feat].mean()right_mean = right_datas[self.Y_feat].mean()left_r = left_datas[self.Y_feat]-left_meanright_r = right_datas[self.Y_feat]-right_meanleft_loss = (left_r**2).sum()right_loss = (right_r**2).sum()Loss = left_loss+right_lossreturn Lossdef predict_one(self,data):Y_temp = 0for tree_key,tree_value in self.T.items():feat = tree_value['feat']point = tree_value['point']left_Y = tree_value['left_Y']right_Y = tree_value['right_Y']if data[feat]<=point:Y_temp += left_Yelse:Y_temp += right_Yreturn Y_tempdef predict(self,datas):Y_pre_all = datas.apply(self.predict_one,axis=1)return Y_pre_all
# 应用了pandas中的apply函数,将每行数据都进行predict运算预测
tree = CartRegTree(datas_1,Y_features,X_features)
tree.get_subtree(datas_1)
Y_hat = tree.predict(datas_1)
lenth = len(Y_hat)
result = pd.DataFrame([[i[0],i[1],i[2]] for i in zip(Y,Y_hat,Y-Y_hat)])
# result = pd.DataFrame([list(Y),list(Y_hat),list(Y-Y_hat)])
print(result)
# print(f"{Y},{Y_hat},残差:{Y-Y_hat}")writer = pd.ExcelWriter('datas_reg_result.xlsx')
# 获取所需数据
result.to_excel(writer,"result")
writer._save()

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

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

相关文章

《安富莱嵌入式周报》第322期:自制10KV电子负载,史上最详细的电池系列资料,创意洞洞板任意互联,开源USB分析仪,英特尔雷电5, QNX功能安全免费课程

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1M8411q7dw/ 《安富莱嵌入式周报》第322期&#xff1a;自制10K…

机器学习基础算法--回归类型和评价分析

目录 1.数据归一化处理 2.数据标准化处理 3.Lasso回归模型 4.岭回归模型 5.评价指标计算 1.数据归一化处理 """ x的归一化的方法还是比较多的我们就选取最为基本的归一化方法 x(x-x_min)/(x_max-x_min) """ import numpy as np from sklea…

SVN 和 GIT 命令对比

参考 https://blog.csdn.net/justry_deng/article/details/82259470 # TortoiseSVN打分支、合并分支、切换分支 https://www.huliujia.com/blog/802a64152bbbe877c95c84ef2fdf3857a056b536/ # 版本控制&#xff1a;Git与Svn的命令对应关系 TortoiseSVN打分支、合并分支、切换…

关系型数据库和非关系型数据库

关系型数据库是以关系&#xff08;表格&#xff09;为基础的数据库&#xff0c;它采用了 SQL&#xff08;Structured Query Language&#xff09;作为数据操作语言&#xff0c;常见的关系型数据库包括 MySQL、Oracle、SQL Server 等。 非关系型数据库则是基于文档、键值、列族…

分布式多级缓存

例子&#xff08;测试环境&#xff09; 项目结构图 运行反向代理服务器也就是负责反向代理到三个nginx的nginx&#xff0c;该nignx也负责前端页面的跳转。 该nginx的conf为下: 突出位置就是该nginx需要反向代理的其他nginx的IP和端口。 Lua语法 linux安装Lua #安装lua环境 …

ES-OAS-ERP-电子政务-企业信息化

ES-OAS-ERP-电子政务-企业信息化 专家系统ES办公自动化系统OAS企业资源规划ERP典型的信息系统架构模型 专家系统ES 模拟人类专家&#xff0c;解决结构化&#xff0c;半结构化问题 数据级&#xff0c;知识库级&#xff0c;控制级 专家系统的特点就是和人的区别 启发性知识&#…

upload-labs文件上传漏洞通关

一、环境搭建 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。 下载地址&#xff1a;https://github.com/c0ny1/upload-labs/releases 在 win 环境下 直接解压到phpstudy下即可 二、通关 &#xff08;一&#xff09;16关…

伦敦金投资为什么要止损?

目前&#xff0c;伦敦金投资的知识越来越丰富&#xff0c;更多普通的投资者都能学习到很多的专业的伦敦金投资知识。其中&#xff0c;伦敦金投资中的止损问题在交易时经常被提及。一些投资者认为我们在伦敦进市场中&#xff0c;投资只管勇往直前就行了&#xff0c;为什么还要考…

系统架构设计专业技能 · 软件工程之UML建模设计

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 软件工程之UML建模设计 一、需求分析 - UML图二、用例图2.…

华为云云耀云服务器实例使用教学

目录 国内免费云服务器&#xff08;体验&#xff09; 认识国内免费云服务器 如何开通国内免费云服务器 云耀云服务器 HECS Xshell 远程连接 云服务器更改安全组 切换操作系统 服务器详情 HECS适用于哪些场景&#xff1f; 网站搭建 电商建设 开发测试环境 云端学习环…

Vue2 | Vant uploader实现上传文件和图片

需求&#xff1a; 实现图片和文件的上传&#xff0c;单个图片超过1M则压缩&#xff0c;全部文件加起来不得超过10M。 效果&#xff1a; 1. html <van-form ref"form"><van-field name"uploader" label"佐证材料" required><t…

小红书直播人物专访:GMV破千万策略心得

采访手记&#xff1a;2023年来&#xff0c;小红书电商动作频频&#xff0c;直播带货已然成为品牌营销的重要场域。面对竞争压力的骤然增加&#xff0c;如何适应当下的游戏规则、释放更大的商业潜力&#xff0c;成为多数品牌入局后亟待解决的难点。 为此&#xff0c;千瓜特约采…