首页 > 其他分享 >AI 自学 Lesson2 - 回归(Regression)

AI 自学 Lesson2 - 回归(Regression)

时间:2024-10-19 12:53:14浏览次数:9  
标签:Lesson2 plt 模型 AI pred 回归 train test Regression

背景

回归(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) - y
    return 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。虽然提升不大,但说明通过调参可以进一步优化模型。随机森林的性能受超参数(如树的数量、最大深度等)的影响较大,合理调参后模型的表现可以更好。

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

标签:Lesson2,plt,模型,AI,pred,回归,train,test,Regression
From: https://blog.csdn.net/lu_rong_qq/article/details/143001036

相关文章

  • AI编程Arduino单片机点亮WS2812灯带彩虹灯效
    引言随着物联网(IoT)和智能家居的迅速发展,LED灯带因其灵活性和多样的显示效果,广泛应用于装饰、广告、舞台等多个领域。WS2812作为一种智能可控的LED灯带,以其独立控制、丰富的色彩和高亮度,成为众多开发者的首选。而在控制WS2812灯带的过程中,编写高效、稳定的单片机代码至关重要。......
  • AIGC时代的语音笔记工具,创意人士的福音
    国庆期间,我发现了一款特别好用的语音笔记工具,它应该算是AIGC时代的新一代笔记工具了。这个工具,是那些随时会有创意想法要记录,或者经常需要做会议纪要,读书笔记的人福音。它有几个功能让我特别喜欢。第一个是语音笔记功能,这个不像科大讯飞的语音输入法,它不仅仅是简单地将语音转成文......
  • 初探AI之got-ocr2.0大模型本地部署与遇到的各种坑处理
    一、环境搭建1.安装cuda,本人使用的是12.1版本,下载地址:https://developer.nvidia.com/cuda-12-1-1-download-archive2.安装conda3,https://blog.csdn.net/m0_73634846/article/details/1363783503.准备代码环境原文:https://mp.weixin.qq.com/s/PQVrlr5FoVb89Mivzi7pLA顺序执......
  • AI绘画:2024最全面的ComfyUI插件与Lora的下载及使用!
    前言本节我们介绍ComfyUI插件和Lora的下载及使用方式。1.安装1.1Checkpoint安装将从前面介绍的模型下载平台下载后,放在ComfyUI/models/checkpoints文件夹下。1.2Lora安装在前面介绍的模型下载网站下载Lora模型,然后放在ComfyUI/models/loras文件夹下。所有的AI设......
  • stable diffusion安装ai绘画真人动漫win中文版软件
    前言所有的AI设计工具,安装包、模型和插件,都已经整理好了,......
  • AI绘画:24最新Stable Diffusion 终极炼丹宝典:从入门到精通!
    前言我是咪咪酱,以浅显易懂的方式,与大家分享那些实实在在可行之宝藏。历经耗时数十个小时,总算将这份StableDiffusion的使用教程整理妥当。从最初的安装与配置,细至界面功能的详解,再至实战案例的制作,乃至高品质模型的下载,每一步骤皆有细致的指导,且以一个个生动的例子予以演......
  • 英伟达开源新王登基!70B刷爆SOTA,击败GPT-4o只服OpenAI o1
    以下是关于英伟达开源新成果相关的技术详解:一、模型架构与规模1.规模庞大   英伟达推出的70B模型是一个具有相当大规模的语言模型。70B(700亿参数)的量级在开源领域是非常突出的。相比许多现有的开源模型,它在参数数量上占据优势,这通常意味着它有更强的表示能力。2.架......
  • 基于扣子双语博客AI智能体
    一、扣子AI智能体简介在扣子平台,用户可以通过零代码或低代码的方式快速搭建基于AI大模型的各类智能体应用(被称为Bot),并将它们部署到其他网站平台上,也可以通过API将扣子平台的智能体与现有系统集成。这些智能体可以是各种类型的聊天机器人,不仅限于简单的对话功能。通过扣子的插件、......
  • 《用Hautech.ai实现模特换装:一步步教你如何操作》
    用Hautech.ai实现模特换装:一步步教你如何操作在这个科技飞速发展的时代,人工智能为我们的生活带来了许多便利。今天,我将为你详细介绍如何使用Hautech.ai这款强大的工具来实现模特换装。什么是Hautech.ai?Hautech.ai 是一款基于人工智能的在线平台,旨在帮助用户轻松实现模特换......
  • 足球预测大小球及让球-AI智能大数据算法软件:教你如何准确预测足球赛事
    一、引言在足球领域,预测比赛结果一直是球迷和专业人士关注的焦点。而有些人能在足球预测领域混的风生水起,更多的人则是难以准确分析足球比赛,这种现象的原因在于数据信息的不对等,足球预测归根结底是基于数据信息的推论,普通人没有专业的分析团队,缺乏合适的预测工具,往往就难以准......