当前位置: 首页 > web >正文

【机器学习】(11) --回归树算法

文章目录
回归树
回归树结构
回归树的工作原理
优点与缺点
构建回归树模型
回归树模型参数介绍
训练模型
测试模型
总结
回归树
决策树是一种常用的机器学习算法,广泛应用于分类和回归任务中。当决策树用于回归任务时,我们称之为回归树(Regression Tree)。与分类树的主要区别在于,回归树的输出是连续的数值,而不是离散的类别标签。

回归树结构


回归树的工作原理
分裂节点的选择:
在构建回归树时,选择最佳分裂点(即特征值)和分裂规则的主要依据是减少数据集的残差平方和(Residual Sum of Squares, RSS)。具体来说,对于每个候选分裂点,算法会评估将数据集分为两部分后,这两部分数据各自的残差平方和之和是否比不分裂时更小。
通常使用最小二乘法来评估每个候选分裂点的质量。
生长与剪枝:
回归树通过递归地选择最佳分裂点来生长,直到满足某个停止条件(如节点内样本数少于某个阈值、树的最大深度达到预设值等)。
由于过拟合的风险,回归树在构建完成后通常需要进行剪枝。剪枝可以通过预剪枝(在树生长过程中提前停止)或后剪枝(树完全生长后再通过某种准则修剪)来实现。
预测:
对于新样本的预测,回归树会将其沿树向下传递,直到达到一个叶节点。该叶节点的平均值(或其他统计量,如中位数)将被用作该样本的预测值。
优点与缺点
优点:

易于理解和解释。
对异常值不敏感(因为树是基于分裂规则构建的,而不是直接拟合数据)。
可以处理非线性关系。
缺点:

可能过拟合,尤其是当树生长得过于复杂时。
对特征之间的交互建模能力有限。
相比于一些其他回归模型,可能不够精确。
构建回归树模型
与分类树不同,回归树的目标是预测一个连续值,而不是一个类别。

对于构建一个完整的模型,主要从以下两个方面进行:

训练模型
测试模型
回归树模型参数介绍

class sklearn.tree.DecisionTreeRegressor(
criterion='mse',splitter='best',max_depth=None,min_samples_split=2,
min_samples_leaf=1,min_weight_fraction_leaf=0.0,max_features=None,random_state=None,
max_leaf_nodes=None,min_impurity_decrease=0.0,min_impurity_split=None,presort=False)criterion:节点分裂依据,默认:mse ----> 【按默认选择mse即可】
splitter:表示以最优的方式切分节点,默认best ----> 【按默认选择best即可】
max_depth:树的最大深度。----> 【通过交叉验证来进行选择】
min_samples_split :分裂一个内部节点需要的最小样本数,默认值是2。
min_samples_leaf :叶子节点最少样本数,默认值是1,
max_leaf_nodes:设置最多的叶子节点个数,达到要求就停止分裂【控制过拟合】 ----> 【设置此参数之后max_depth失效】★重要


训练模型
收集数据
链接:训练数据

数据预处理
读取数据,将变量与标签分离:

import pandas as pd
#回归
data_1 = pd.read_csv("spambase.csv",encoding='gbk')
x = data_1.iloc[:,:-1]     #取所有行的第一列到倒数第二列数据,左闭右开
y = data_1.iloc[:,-1]    #取所有行的最后一列数据



构建模型
可以通过交叉验证遍历最大深度max_depth来提高模型效果:

from sklearn import tree
reg = tree.DecisionTreeRegressor() #尝试修改参数max_depth,测试模型效果
reg = reg.fit(x,y)



测试模型
因为回归树训练的是回归模型,所以在此我们要观测模型效果不是通过混淆矩阵,我们通过R的平方结果查看效果:

y_pr = reg.predict(x)    #预测训练结果
print(y_pr)
score = reg.score(x,y)    #查看预测结果分数
print(score)
-------------------
[1. 1. 1. ... 0. 0. 0.]
0.99863358578953



这样,我们就构建了一个完整的回归树模型啦!!!

总结
本篇介绍了:

回归树的过程
回归树模型中的参数:比如通过交叉验证遍历最大深度max_depth,提高模型效果。
如何构建回归模型

决策树
机器学习中的决策树算法是一种基本的分类与回归方法,它通过树状结构建立决策模型,以解决分类和回归问题。以下是对决策树算法的详细解析:

一、基本定义
决策树是一种直观的预测模型,它表示对象属性和对象值之间的一种映射关系。树中的每个节点表示某个对象,而每个分叉路径则代表某个可能的属性值,每个叶节点则对应从根节点到该叶节点所经历的路径所表示的对象的值。对于分类问题,决策树模型表示基于特征对实例进行分类的过程,可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。

二、学习过程
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着特征空间的划分,也对应着决策树的构建。常见的决策树学习算法包括ID3、C4.5和CART算法。

ID3算法:
核心思想:以信息增益来度量特征选择,选择信息增益最大的特征进行分裂。
优点:理论清晰,方法简单,学习能力较强。
缺点:对可取值数目较多的属性有所偏好,只能处理分类问题,不能处理连续值属性,且没有剪枝策略,容易过拟合。
C4.5算法:
核心思想:克服了ID3对特征数目的偏重这一缺点,引入信息增益率来作为分类标准。
优点:能够处理连续属性,且能够处理缺失值。
缺点:生成的决策树规模一般比ID3大。
CART算法:
核心思想:使用基尼指数来选择特征进行分裂,且生成的决策树必须是二叉树。
优点:既可以用于分类也可以用于回归,生成的决策树规模相对较小。
缺点:在样本不平衡时,生成的决策树会偏向于那些样本数量多的类别。
我们在构建模型时,常用基尼指数判断类别即CART算法。

三、剪枝处理
决策树算法很容易过拟合,剪枝算法就是用来防止决策树过拟合,提高泛化性能的方法。剪枝分为预剪枝与后剪枝。

预剪枝:在决策树的生成过程中,对每个节点在划分前先进行评估,若当前的划分不能带来泛化性能的提升,则停止划分,并将当前节点标记为叶节点。预剪枝的不足在于可能过早地停止决策树的生长,导致模型欠拟合。
后剪枝:先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考察,若将该节点对应的子树替换为叶节点,能带来泛化性能的提升,则将该子树替换为叶节点。后剪枝决策树通常比预剪枝决策树保留了更多的分枝,一般情形下,后剪枝决策树的欠拟合风险很小,泛化能力往往优于预剪枝决策树。但后剪枝决策树的训练时间开销较大。
我们在学习时,主要使用预剪枝,可以通过调整最大深度来调整数的生长。

四、决策树的特点
优点:
决策树模型容易理解,可解释性较好。
可以用于小数据集,时间复杂度较小。
可以处理多输入问题,对缺失值不敏感。
缺点:
在处理特征关联性比较强的数据时,表现得不太好。
当样本中各类别不均匀时,信息增益会偏向于那些具有更多数值的特征。
对连续性的字段比较难预测,容易出现过拟合。
当类别太多时,错误可能会增加得比较快。
综上所述,决策树算法是机器学习领域中的一种重要算法,它通过树状结构建立决策模型,以直观的方式展现分类或回归的过程和结果。在实际应用中,需要根据具体问题和数据集的特点选择合适的决策树算法及其剪枝策略。

五、构建模型
对于构建一个完整的模型,主要从以下两个方面进行:

训练模型
测试模型
训练模型
收集数据
链接:训练数据

数据预处理
数据预处理主要有以下几个方面:读取数据、划分测试集与训练集:

import pandas as pd
import numpy as npdata = pd.read_excel("电信客户流失数据.xlsx")
data_x = data.drop("流失状态",axis = 1)
data_y = data.流失状态from sklearn.model_selection import train_test_split
data_train,data_test,target_train,target_test = \train_test_split(data_x,data_y,test_size=0.2,random_state=0) #从原始数据中,划分测试集与训练集


调参,交叉验证
交叉验证(Cross-Validation)是一种评估统计分析模型性能的方法,特别是在预测模型中非常有用。它通过重复使用数据子集来训练模型并测试模型,以评估模型对新数据的泛化能力。

同时,在此处可以调参数,找到能使模型效果更好的参数:

from sklearn import tree
from sklearn.model_selection import cross_val_scoredep_parma = []
scores = []
for i in range(5,20):lr = tree.DecisionTreeClassifier(criterion='gini',max_depth=i,random_state=0)score = cross_val_score(lr,data_train,target_train,cv=8,scoring='recall')sco_mean = sum(score)/len(score)scores.append(sco_mean)dep_parma.append(i)
# print(scores)
dep_choose =  dep_parma[np.argmax(scores)]
print("最优深度为:",dep_choose)


----------------------------------
最优深度为: 14


除此之外,决策树模型中还可以调整的参数有:

min_samples_split :(表示分裂一个内部节点需要的最小样本数,默认为2)

max_leaf_nodes :(最大叶子节点数),通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。

训练模型

dtr = tree.DecisionTreeClassifier(criterion='gini',max_depth=dep_choose,min_samples_split=8,random_state=0)
dtr.fit(data_train,target_train)


测试模型
用训练集本身数据测试
from sklearn import metrics
train_predict = dtr.predict(data_train)
print(metrics.classification_report(target_train,train_predict))
----------------------------------
precision    recall  f1-score   support

           0       0.94      0.98      0.96       357
1       0.94      0.80      0.87       123

    accuracy                           0.94       480
macro avg       0.94      0.89      0.91       480
weighted avg       0.94      0.94      0.94       480


划分的测试集数据
test_predict = dtr.predict(data_test)
print(metrics.classification_report(target_test,test_predict))
--------------------------
precision    recall  f1-score   support

           0       0.88      0.76      0.82        89
1       0.51      0.71      0.59        31

    accuracy                           0.75       120
macro avg       0.70      0.74      0.71       120
weighted avg       0.79      0.75      0.76       120


这样,我们就成功构建了一个决策树模型啦!!

总结
本篇介绍了:

常见的决策树学习算法:ID3算法、C4.5算法、CART算法
常用预剪枝方法防止过拟合
决策树主要的模型参数调整有:
树的最大深度:max_depth
最大叶子节点数:max_leaf_nodes
分裂一个内部节点需要的最小样本数:min_samples_split

http://www.xdnf.cn/news/18894.html

相关文章:

  • 算法题打卡力扣第167题:两数之和——输入有序数组(mid)
  • AMH和cyberpanel等管理软件,哪个里面可以部署AI软件?
  • week4-[二维数组]平面上的点
  • 文件读取结束的判定方法:正确使用feof函数避免文件读取错误
  • 代码随想录算法训练营30天 | ​​01背包理论基础、416. 分割等和子集
  • Pandas 高效数据处理:apply、向量化与分组
  • Android用Coil 3检查媒体资源是否有效,Kotlin
  • LeetCode 面试经典 150_双指针_验证回文串(25_125_C++_简单)(双指针)
  • 基于多通道同步分析的智能听诊系统应用程序
  • k8s数据存储
  • k8s-容器化部署论坛和商城服务(小白的“升级打怪”成长之路)
  • Rust Async 异步编程(六):Pin 和 Unpin
  • Python实现点云投影到直线、平面、柱面和球面
  • ComfyUI AI一键换装工作流无私分享
  • 《分布式系统跨服务数据一致性Bug深度复盘:从现象到本质的排查与破局》
  • 从“数据孤岛”到“业财融合”,外贸订单管理ERP重构一体化逻辑
  • 电气工程及其自动化的课程笔记
  • 接口自动化测试:测试用例也能自动生成
  • Vue3 + Golang Gin 实现客服实时聊天系统(WebSocket + Socket.IO 详解)
  • 【工具安装使用-Jetson】Jetson Orin Nano 刷机和踩坑总结
  • 从人工巡检到AI预警:智慧工地如何用技术重构施工安全体系
  • Flink 状态 RocksDBListState(写入时的Merge优化)
  • 《C++哈希表:高效数据存储与检索的核心技术》
  • 正则表达式 —— \s*
  • C# 相机内存复用(减少图像采集耗时)以及行数复用
  • HTB赛季8靶场 - Previous
  • 无障碍辅助模块|Highcharts引领可访问数据可视化的交流
  • 《李沐读论文》系列笔记:论文读写与研究方法【更新中】
  • 【每天一个知识点】大模型训推一体机
  • linux的conda配置与应用阶段的简单指令备注