AI 自学 Lesson2 - 回归(Regression)

目录

背景

数据集选择原因

一、回归概述

1. 常见的回归模型总结

2. 选择模型的依据

二、代码

1. 单变量线性回归

2. 多变量线性回归

3. L1 正则化 - Lasso 回归

4. L2 正则化 - 岭回归

5. 决策树&随机森林回归

6. 梯度提升回归

7. 模型评估

总结


背景

回归(Regression)是一种用于 预测连续目标变量 的统计技术。其核心思想是根据已知的输入特征,构建一个模型来预测一个数值输出。回归既是一类算法,也可以视为一种模型,它通过学习数据中自变量(特征)和因变量(目标)之间的关系,来实现预测或推断。

在机器学习中,回归模型不仅用于简单的预测任务,还广泛应用于优化、控制和金融等领域。本文中将使用 加州房价数据集 作为例子进行分析处理。

数据集选择原因

加州房价数据集(California Housing Dataset) 是一个经典的回归任务数据集,非常适合作为回归模型的学习材料。原因如下:

  1. 连续目标变量:加州房价数据集的目标变量是连续的房屋价格。

  2. 多维特征:该数据集包含8个特征(如人口密度、房间数量、房龄等),可以用于 多变量线性回归正则化回归模型 的学习。

  3. 数据规模适中:加州房价数据集的样本数为约 2w+ 条记录,规模适中,适合用于训练、调试和优化模型,同时也不会因为数据量过大而增加计算负担。同时,与更早的 波士顿房价数据集 相比,数量更多(仅有 506 条记录)。

  4. 适合多种模型的比较:由于该数据集包含多种不同类型的特征,适合用于多种模型的比较分析,如 线性回归岭回归Lasso回归决策树回归随机森林回归 等。通过不同模型对该数据集的表现,可以直观地看到各种模型在回归任务中的优缺点。


一、回归概述

1. 常见的回归模型总结

以下是机器学习中常见的回归模型及其特点与适用场景:

名称特点使用场景优点缺点
线性回归(Linear Regression)通过拟合一条直线最小化误差(通常为均方误差)。适用于当特征和目标变量之间存在线性关系的场景。

简单、易于解释;对线性关系的建模效果好。

对异常值敏感。

岭回归(Ridge Regression)一种 L2正则化 的线性回归,在线性回归的损失函数中加入权重系数的平方和,防止过拟合。适用于特征数较多、可能存在多重共线性的场景。通过正则化限制模型复杂度。不能自动进行特征选择。
Lasso回归(Lasso Regression)一种 L1正则化 的线性回归,通过在损失函数中引入权重系数的绝对值和来进行正则化。这种正则化能够将一些权重压缩为零,从而进行特征选择。适用于希望同时进行特征选择的场景,例如当数据中有很多冗余特征或无关特征时。可以自动进行特征选择,减少冗余特征。对于复杂的非线性数据,效果有限。
弹性网络回归(Elastic Net Regression)结合了 L1正则化L2正则化,可以同时进行特征选择和控制模型复杂度。适用于存在高度相关特征且希望自动特征选择的场景。适用于高维数据。需要调节两个正则化参数。
多项式回归(Polynomial Regression)通过增加特征的多项式项(例如平方、立方),来捕捉特征和目标变量之间的非线性关系。适用于自变量和因变量之间存在非线性关系的场景。能够建模非线性关系。容易过拟合,需要正则化控制。
支持向量回归(Support Vector Regression, SVR)在回归任务中通过构造最大化间隔的决策边界,允许一定的错误,并使用核函数来处理非线性数据。适用于数据特征和目标变量间存在复杂关系且需要非线性拟合的场景。能够很好地处理高维数据。计算复杂度较高,训练时间较长。
决策树回归(Decision Tree Regression)基于树形结构,递归地将数据划分为多个子集,直到每个子集内部的样本具有相似的目标值。适用于需要解释性强不规则的数据分布的场景。

可处理非线性关系;直观且易于解释。

容易过拟合,需要剪枝或正则化来防止。
随机森林回归(Random Forest Regression)由多棵决策树组成的集成模型,通过随机选择特征和样本进行训练,并对回归结果进行平均。适用于复杂数据集或高维数据场景,泛化性能较好。

抗噪能力强,防止过拟合。

难以解释具体的决策过程。
梯度提升回归(Gradient Boosting Regression)通过逐步训练多个弱学习器(通常是决策树),每一步纠正误差,提高模型的整体性能。适用于大规模数据和高维数据,特别是当需要高精度预测时。具有很强的学习能力,精度较高。训练时间较长,容易过拟合。

注:在前文中有提到过一个分类算法,名叫【逻辑回归】,虽然名字中带有“回归”,但它实际上是一个分类算法。逻辑回归是用于二分类和多分类问题的模型。它通过将线性回归的输出映射到 [0, 1] 范围内的概率值,适合用来解决分类任务。


2. 选择模型的依据

在使用回归模型时,可以通过从以下维度进行考虑来解决:

  • 特征与目标变量的关系:如果线性关系明显,使用线性回归;如果存在非线性关系,可以考虑多项式支持向量回归。
  • 特征的数量:当特征数量较多时,可能需要正则化模型如 岭回归Lasso回归 来防止过拟合。
  • 数据的复杂性:如果数据具有复杂的模式,使用集成模型如 随机森林梯度提升回归 可能效果更好。
  • 模型的可解释性:如果需要模型具有较好的解释性,可以选择 线性回归决策树回归

二、代码

详细代码,包含:

  • 回归部分前:导入需要使用的工具包、数据预处理等数据准备、可视化结果过程
  • 回归部分:使用的模型根据公式
  • 回归部分后:的型调优、模型对比等过程

文首绑定资源文件。

1. 单变量线性回归

由于该数据集有 8 个维度,若要使用单变量线性回归模型,需从中摘取 2 个维度【中位收入】、【房龄】,探究其各自与目标值【房价】之间的线性关系。

# 选择 MedInc 和 HouseAge 两个维度
X_MedInc = california_df[['MedInc']].values
X_HouseAge = california_df[['HouseAge']].values# 建立线性回归模型
linear_reg_medinc = LinearRegression()
linear_reg_houseage = LinearRegression()# 分别训练模型
linear_reg_medinc.fit(X_MedInc, y)
linear_reg_houseage.fit(X_HouseAge, y)# 预测房价
y_pred_medinc = linear_reg_medinc.predict(X_MedInc)
y_pred_houseage = linear_reg_houseage.predict(X_HouseAge)# 绘制散点图
plt.figure(figsize=(12, 5))# 第一幅图:MedInc vs Target
plt.subplot(1, 2, 1)
plt.scatter(california_df['MedInc'], y, color='blue', alpha=0.5)
plt.xlabel('MedInc (中位收入)')
plt.ylabel('Target (房价中位数)')
plt.title('中位收入与房价的散点图')# 第二幅图:HouseAge vs Target
plt.subplot(1, 2, 2)
plt.scatter(california_df['HouseAge'], y, color='green', alpha=0.5)
plt.xlabel('HouseAge (房龄)')
plt.ylabel('Target (房价中位数)')
plt.title('房龄与房价的散点图')plt.tight_layout()
plt.show()

得到两张散点图,明显其一存在线性关系,其一不存在,进一步探索显示【中位收入】和【房价】之间的回归线。

# 绘制加有回归线的
plt.figure(figsize=(12, 5))# MedInc vs Target
plt.subplot(1, 2, 1)
plt.scatter(X_MedInc, y, color='blue', label='实际数据点', alpha=0.5)
plt.plot(X_MedInc, y_pred_medinc, color='red', label='回归线')
plt.xlabel('MedInc (中位收入)')
plt.ylabel('Target (房价中位数)')
plt.title('中位收入与房价的线性回归')
plt.legend()# 显示图形
plt.tight_layout()
plt.show()

2. 多变量线性回归

# 用线性回归拟合
lr = LinearRegression()
lr.fit(X_train,y_train)y_pred_lin = lr.predict(X_test) #在测试集上做预测
print("test_R2=",r2_score(y_test,y_pred_lin))
y_pre = lr.predict(X_train)#模型预测
print("train_R2=",r2_score(y_train,y_pre))plot.scatter(range(len(y_test)),y_test,label="y_test")
plot.scatter(range(len(y_pred_lin)),y_pred_lin,label="y_pred_lin")
plot.legend()

3. L1 正则化 - Lasso 回归

# 用lasso
las = Lasso(alpha=0.5)
las.fit(X_train,y_train)
print("las.score=",las.score(X_train,y_train))
y_pred_lasso = las.predict(X_test)
print("test_R2=",r2_score(y_test,y_pred_lasso))
y_pre2 = las.predict(X_train)#模型预测
print("train_R2=",r2_score(y_train,y_pre2))
plot.scatter(range(len(y_test)),y_test,c='r',label="y_test")
plot.scatter(range(len(y_pred_lasso)),y_pred_lasso,c='b',label="y_pred_lasso")
plot.legend()

4. L2 正则化 - 岭回归

# 用Ridge
rid = Ridge(alpha=0.5)
rid.fit(X_train,y_train)
print("rid.score=",rid.score(X_train,y_train))
y_pred_ridge = rid.predict(X_test)
y_pred_ridge = rid.predict(X_test) #在测试集上做预测
print("test_R2=",r2_score(y_test,y_pred_ridge))
y_pre4 = rid.predict(X_train)#模型预测
print("train_R2=",r2_score(y_train,y_pre4))
plot.scatter(range(len(y_test)),y_test,c='r',label="y_test")
plot.scatter(range(len(y_pred_ridge)),y_pred_ridge,c='b',label="y_pred_ridge")
plot.legend()

5. 决策树&随机森林回归

# 使用决策树回归模型进行训练和预测
tree_model = DecisionTreeRegressor(random_state=42)
tree_model.fit(X_train, y_train)  # 训练模型
y_pred_tree = tree_model.predict(X_test)  # 预测测试集# 使用随机森林回归模型进行训练和预测
forest_model = RandomForestRegressor(n_estimators=100, random_state=42)
forest_model.fit(X_train, y_train)  # 训练模型
y_pred_forest = forest_model.predict(X_test)  # 预测测试集# 绘制真实值与决策树预测值对比图
plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)  # 左图
plt.scatter(range(len(y_test)), y_test, color='blue', label='真实值')
plt.scatter(range(len(y_pred_tree)), y_pred_tree, color='red', label='预测值(决策树)')
plt.title('决策树回归预测 vs 真实值')
plt.xlabel('样本索引')
plt.ylabel('房价')
plt.legend()# 绘制真实值与随机森林预测值对比图
plt.subplot(1, 2, 2)  # 右图
plt.scatter(range(len(y_test)), y_test, color='blue', label='真实值')
plt.scatter(range(len(y_pred_forest)), y_pred_forest, color='green', label='预测值(随机森林)')
plt.title('随机森林回归预测 vs 真实值')
plt.xlabel('样本索引')
plt.ylabel('房价')
plt.legend()plt.tight_layout()
plt.show()

6. 梯度提升回归

# 预处理加州房价数据
data = fetch_california_housing()
X = data.data  # 特征
y = data.target.reshape(-1, 1)  # 目标值(房价)# 特征标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 在X中加入一列全为1的偏置项
X_scaled = np.insert(X_scaled, 0, 1, axis=1)# 初始化参数w
w = np.zeros((1, X_scaled.shape[1]))# 定义代价函数(均方误差)
def computeCost(X, y, w):error = np.dot(X, w.T) - yreturn np.sum(np.square(error)) / (2 * len(X))# 实现批量梯度下降
def batch_gradientDescent(X, y, w, alpha, iters):temp = np.zeros(w.shape)  # 暂存w的值parameters = X.shape[1]  # 参数个数(包括偏置项)cost = np.zeros(iters)  # 用于记录每次迭代的代价for i in range(iters):error = np.dot(X, w.T) - y  # 计算预测误差# 对每个参数进行更新for j in range(parameters):term = np.multiply(error, X[:, j].reshape(-1, 1))temp[0, j] = w[0, j] - (alpha / len(X)) * np.sum(term)w = temp  # 更新权重cost[i] = computeCost(X, y, w)  # 记录每次迭代后的代价return w, cost# 设置学习速率和迭代次数
alpha = 0.01  # 学习速率
iters = 1000  # 迭代次数# 训练模型
w, cost = batch_gradientDescent(X_scaled, y, w, alpha, iters)# 输出最终的权重
print("最终的权重:", w)# 绘制代价函数的变化图
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(np.arange(iters), cost, 'r')
ax.set_xlabel('迭代次数', fontsize=18)
ax.set_ylabel('代价', rotation=0, fontsize=18)
ax.set_title('误差和训练Epoch数', fontsize=18)
plt.show()

7. 模型评估

使用均方误差(MSE)和决定系数(R²)来评估模型的好坏。MSE 越小越好,R² 越接近 1 越好。

线性回归: MSE = 0.5559, R² = 0.5758

Lasso(L1正则化): MSE = 0.9400, R² = 0.2827

Ridge(L2正则化): MSE = 0.5559, R² = 0.5758

决策树回归: MSE = 0.4975, R² = 0.6203

随机森林回归: MSE = 0.2566, R² = 0.8042

最佳随机森林模型: MSE = 0.2543, R² = 0.8059

根据结果,各种回归模型在加州房价数据集上的表现差异较大。以下是对各个模型的表现评价:

  • 线性回归模型:表现中规中矩。预测误差相对较大,模型能够解释约57.6%的目标值变化。这意味着模型在捕捉房价变化的复杂性方面能力有限,可能是因为房价数据与特征之间的关系并非简单线性关系。
  • Lasso 回归:表现较差。MSE 为 0.9400,远高于其他模型,预测误差较大。 为 0.2827,说明模型仅能解释 28.3% 的房价变化。Lasso 的 L1 正则化倾向于将部分不重要的特征权重降为零,因此在某些情况下可以简化模型并减少过拟合,但在本例中效果不佳,可能由于其过度简化了特征的重要性。
  • Ridge 回归:表现与普通线性回归基本一致,MSE 均相同。这表明在这个数据集上,L2 正则化对模型的改进作用不大,可能是因为特征间的多重共线性不严重,或者 Ridge 无法显著提升模型的泛化能力。
  • 决策树回归:表现明显优于线性回归模型。相比于线性回归,决策树能够更好地捕捉房价数据中的非线性关系,但泛化能力有限。
  • 随机森林回归:表现显著优于之前所有模型,MSE 降至 0.2566,预测误差大幅减少, 提升至 0.8042,表明该模型能够解释 80.4% 的目标变量变化。随机森林通过集成多个决策树,减少了单一决策树过拟合的风险,提高了模型的泛化能力。这也是为什么随机森林在这个任务中的表现特别出色。

总结

  • 线性模型(线性回归、Lasso、Ridge):在加州房价数据集上,线性模型表现较弱,无法有效捕捉复杂的房价变化。特别是 Lasso 回归,表现最差,表明在这个数据集上,过度简化特征可能导致模型性能下降。
  • 树模型(决策树、随机森林):树模型在房价预测中表现更好。单一决策树捕捉了数据中的非线性关系,但容易过拟合。随机森林通过集成多个决策树,显著提高了模型的泛化能力和预测准确性。
  • 最佳模型:通过调参后的最佳随机森林模型进一步提高了性能,MSE 降至 0.2543, 提升至 0.8059。虽然提升不大,但说明通过调参可以进一步优化模型。随机森林的性能受超参数(如树的数量、最大深度等)的影响较大,合理调参后模型的表现可以更好。

说明集成学习方法(如随机森林)在处理复杂数据集时具有强大的优势。

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

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

相关文章

Spring Cloud OAuth认证中心

在微服务架构中,由于不同的业务会拆分成不同的微服务,传统的单体项目一般是通过过滤器进行拦截校验,而微服务显然不可能分发到各个服务进行用户认证,这就需要由一个统一的地方来管理所有服务的认证信息,实现只登录一次…

松脂醇-落叶松脂素还原酶(pinoresinol-lariciresinol reductase, PLR)克隆与鉴定-文献精读71

菘蓝中松脂醇-落叶松脂素还原酶编码基因IiPLR2的克隆与功能分析 摘要 松脂醇-落叶松脂素还原酶(pinoresinol-lariciresinol reductase, PLR)是植物中木脂素生物合成的关键酶,能连续催化两步反应分别生成落叶松脂素和开环异落叶松脂素。落叶松脂素等木脂素类成分是…

Unity SpriteEditor 中的图集处理功能

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 因为unity不只能做3d,还有2d游戏需要大量编辑处理图片素材,所以需要了解Sprite(精灵&…

KPaaS 集成平台低代码在跨境电商行业的应用

在全球化的经济浪潮中,跨境电商行业蓬勃发展,机遇与挑战并存。随着业务规模的不断扩大和市场竞争的日益激烈,跨境电商企业面临着诸多复杂的业务管理和技术难题。KPaaS 业务集成扩展平台以其低代码的创新特性,为跨境电商行业带来了…

头歌——人工智能(机器学习 --- 决策树2)

文章目录 第5关:基尼系数代码 第6关:预剪枝与后剪枝代码 第7关:鸢尾花识别代码 第5关:基尼系数 基尼系数 在ID3算法中我们使用了信息增益来选择特征,信息增益大的优先选择。在C4.5算法中,采用了信息增益率…

银河麒麟相关

最近安装了银河麒麟server版本,整理下遇到的一些小问题 1、vmware安装Kylin-Server-V10-SP3-General-Release-2303-X86_64虚拟机完成后,桌面窗口很小,安装vmwaretools后解决,下载地址http://softwareupdate.vmware.com/cds/vmw-de…

leetcode-71-简化路径

题解: 1、以"/"作为分隔符对字符串进行分割得到数组names; 2、初始化一个栈stack(python中的栈使用列表实现); 3、遍历数组names;如果当前元素为".."且栈不为空,则将弹出栈顶元素&a…

网络安全行业10大副业汇总,总有一个适合你

网络安全行业这10大副业汇总 总有一个适合你 引言 在当今的网络安全行业中,除了全职工作外,许多师傅还通过副业来增加收入、不断拓展自身技能,并积累更多实际操作经验,为职业发展增添了无限可能。 本文提供了10种适合各种类型…

Android13关于获取外部存储文件的相关问题及解决方案记录

Android的学习路上... 测试设备:vivo X90s安卓版本: Android13开发环境:AndroidStudio FlamingoSDK:33 最近我在Android13的环境下尝试写一个文件选择器,以便日后的开发使用。但是我们知道,从Android13 (A…

django restful API

文章目录 项目地址一、django环境安装以及初识restful1.1 安装python 3.10的虚拟环境1.2 创建django工程文件1.3 创建一个book app1.4 序列化(Django JsonResponse)1.4.1创建一个Models1.4.2 创建django的超级用户admin1.4.3 添加serializers.py生成序列化器1.5 FBV创建视图1…

用docker Desktop 下载使用thingsboard/tb-gateway

1、因为正常的docker pull thingsboard/tb-gateway 国内不行了,所以需要其它工具来下载 2、在win下用powershell管理员下运行 docker search thingsboard/tb-gateway 可以访问到了 docker pull thingsboard/tb-gateway就可以下载了 3、docker Desktop就可以看到…

ComfyUI初体验

ComfyUI 我就不过多介绍了,安装和基础使用可以看下面大佬的视频,感觉自己靠图文描述的效果不一定好,大家看视频比较方便。 ComfyUI全球爆红,AI绘画进入“工作流时代”?做最好懂的Comfy UI入门教程:Stable D…

分布式ID生成策略

文章目录 分布式ID必要性1.UUID2.基于DB的自增主键方案3.数据库多主模式4.号段模式5.Redis6.Zookeeper7.ETCD8.雪花算法9.百度(Uidgenerator)10.美团(Leaf)11.滴滴(TinyID) 分布式ID必要性 业务量小于500W的时候单独一个mysql即可提供服务,再大点的时候就进行读写分…

nuScenes数据集使用的相机的外参和内参

因为需要用不同数据集测试对比效果,而一般的模型代码里实现的检测结果可视化都是使用open3d的Visualizer在点云上画的3d框,展示出来的可视化效果很差,可能是偷懒,没有实现将检测结果投影到各相机的图像上,所以检测效果…

[ARM-2D 专题]4. 快速搭建ARM2D的PC仿真开发环境及避坑手法

有几种情况你需要使用pc仿真开发环境: 手上没有合适的硬件条件只想快速的了解一下ARM-2D开发过程中,加速开发过程,避免频繁的下载代码 无论如何,pc仿真开发环境,你都值得拥有。 第一步,先下载源代码&#…

基于ElementPlus的Form组件封装

前言 我们在项目开发过程中遇到最多就是表单页面的开发,那么使用频率比较高的就是Form组件,无论是vue亦或者是react,我们在项目中使用到UI库都会有Form组件。多数情况下都是用到了Form组件,我们先根据UI库或者其他类似的页面直接…

h5页面与小程序页面互相跳转

小程序跳转h5页面 一个home页 /pages/home/home 一个含有点击事件的元素&#xff1a;<button type"primary" bind:tap"toWebView">点击跳转h5页面</button>toWebView(){ wx.navigateTo({ url: /pages/webview/webview }) } 一个webView页 /pa…

物联网行业应用实训室建设方案

一、建设背景 随着物联网技术的迅猛发展和广泛应用&#xff0c;物联网产业已跃升为新时代的经济增长引擎&#xff0c;对于产业升级和社会信息化水平的提升具有举足轻重的地位。因此&#xff0c;为了满足这一领域的迫切需求&#xff0c;培养具备物联网技术应用能力的优秀人才成…

自动发现-实现运维管理自动化

nVisual-Discovery是一款自动化工具软件&#xff0c;通过多种自动发现技术&#xff0c;协助运维管理人员快速建立可视化的网络文档&#xff0c;提升网络管理的效率与准确性。 01 IP扫描发现 当我们新接手一个网络运维项目&#xff0c;通常缺乏精准的网络文档数据&#xff0c;…

4.2-6 使用Hadoop WebUI

文章目录 1. 查看HDFS集群状态1.1 端口号说明1.2 用主机名访问1.3 主节点状态1.4 用IP地址访问1.5 查看数据节点 2. 操作HDFS文件系统2.1 查看HDFS文件系统2.2 在HDFS上创建目录2.3 上传文件到HDFS2.4 删除HDFS文件和目录 3. 查看YARN集群状态4. 实战总结 1. 查看HDFS集群状态 …