小孩子也能看懂的线性回归算法

介绍

线性回归是数据科学中的基础算法,在预测连续结果方面发挥着关键作用。本文深入探讨了线性回归,涵盖了其原理、应用以及在真实数据集上的Python实现。本文介绍了简单线性回归和多重线性回归的重要性、局限性和实际用例,为初学者和实践者提供了全面的资源。跟随我们一起探索线性回归的复杂性,深入了解其工作原理并进行实际应用。

线性回归是什么

线性回归通过假设自变量和因变量之间存在线性关系来预测两个变量之间的关系。它寻求最优直线,以最小化预测值与实际值之间的平方差之和。在经济学和金融等各个领域应用广泛,该方法分析并预测数据趋势。它可以扩展到涉及多个自变量的多元线性回归,以及逻辑回归,适用于二分类问题。

简单线性回归

在简单线性回归中,有一个自变量和一个因变量。该模型估计最佳拟合直线的斜率和截距,它表示两者之间的关系。斜率表示每单位自变量变化对应的因变量变化,而截距表示当自变量为零时因变量的预测值。

线性回归是机器学习中用于预测分析的一种简单的统计回归方法。线性回归显示了自变量(预测器)即X轴与因变量(输出)即Y轴之间的线性关系,称为线性回归。如果有一个输入变量X(自变量),这样的线性回归称为简单线性回归

上面的图表展示了输出(y)和预测变量(X)之间的线性关系。蓝色线被称为最佳拟合直线。根据给定的数据点,我们尝试绘制一条最能匹配这些点的线。

简单线性回归的计算

简单线性回归的方程表达式:

其中是因变量,是截距,是斜率,是自变量

算法通过上述方程解释了自变量和因变量的线性关系,

线性回归如何确定最佳拟合线呢?线性回归算法的目标是获得的最佳值,以找到最佳拟合线。最佳拟合线是一条具有最小误差的线,意味着预测值和实际值之间的误差应该最小。

残差(Residuals)

线性回归中,预测值(predicted)与观测值的差值称为残差,残差的本质是模型的随机误差(Random Error),是必然存在且不可学习的参数。

上图蓝色点表示观测值,红色点表示预测值。

最优拟合线是什么

简单来说,最佳拟合线是一条最好地符合给定散点图的线。在数学上,最佳拟合线是通过最小化残差平方和(RSS)来获得的。

线性回归的损失函数

损失函数有助于计算出参数和的值,从而为离散数据点提供最佳拟合线。

在线性回归中,通常使用均方误差(MSE)作为损失函数,均方差等于预测值和 观测值的平方误差的平均值。

我们使用简单线性方程 y=mx+b 来计算 MSE:

通过梯度下降法最小化损失函数,得到对应参数的值。

线性回归的梯度下降算法

梯度下降算法是一种优化算法,通过迭代和的值使损失函数(目标函数)达到极小值。

回归模型通过优化梯度下降算法更新线性系数,随机初始化线性系数,然后迭代更新以达到最小损失函数。

如上图,横坐标是线性回归系数,纵坐标是损失函数,蓝色点通过梯度下降算法进行更新,最后达到最优值(Optimal value)。

通过梯度下降算法,我们需要选择合适的学习率参数。

若学习率太大,损失函数有可能快速达到最优值,也有可能迭代很多次也达不到最优值,如下图:

若学习率太小,则需要更多的迭代次数达到最优值。

参数更新公式推导

为了更新参数,我们计算损失函数对参数的偏导,损失函数记为J,推导如下:

假设学习率为,梯度下降法更新参数,有:

我们需要最小化代价函数 J,实现这一目标的其中一种方法是批量梯度下降算法。在批量梯度下降中,数值在每次迭代中更新。

线性回归的评价标准

我们可以使用多种评价指标度量当前的模型性能,最常用的指标包括:

  • 决定系数(coefficient of determination)或R方(R2)
  • 均方根误差(RSME)或残差标准误差((RSE))
决定系数或R方

R方指标,也称为R-Square,是一种用于评估回归模型拟合程度的统计量。,它的值范围在0~1之间,数值越大表示拟合效果越好。

数学表达式:

其中RSS表示残差平方和(Residual sum of Square),TSS表示总偏差平方和(Total Sum of Squares),总偏差平方和简称总平方和。

如下图R方数值与线性拟合效果,R方越大,拟合效果越好。

  • 残差平方和(RSS)的含义是衡量实际观测值和模型预测值的差异,具体来说,残差平方和是每个样本的观测值与对应预测值之差的平方和。

数学表达式:

  • 总平方和(TSS)的含义是衡量样本的分散程度,具体来说,总偏差平方和事每个样本观测值与平均值之差的平方和,其中平均值是样本观测值的平均。

数学表达式:

为了更直观理解,可视化RRS和TSS的定义:

其中,和分别表示观测样本,所有观测样本的平均值和预测样本。

均方根误差

均方根误差是残差方差的平方根,表示模型对数据的绝对拟合程度,即观测值与预测值的接近程度。在数学上可以表示为:

为了使这个估计量无偏,我们需将残差平方和除以自由度(n-2),而不是模型中数据点的总数。这个术语被称为残差标准误差(RSE),在数学上可以表示为:

R方比RSME更好。因为均方根误差的值取决于变量的单位(即它不是一个归一化的度量),它可以随着变量单位的改变而改变。

线性回归的一些假设

线性回归是一种参数化方法,这意味着它对数据进行分析时做出了一些假设。为了成功进行回归分析,验证以下假设是至关重要的,下面所介绍的残差的含义是观测值和预测值差值。

  • 残差是线性模型,需要假设因变量和自变量之间存在线性关系。如下图前两张图片存在线性关系,后一张图片不存在线性关系
  • 残差项之间是相互独立的,即残差项是随机分布的,与观测变量无相关关系。如下图第一张图片的残差项是相互独立的,后一张图片不满足假设

  • 残差是正态分布,即残差是符合均值为0或接近0的正态分布,我们基于这种先验,可以判断当前的拟合直线是否为最优直线,判断方法是累加所有数据点的残差项是否为0或接近0。如果残差项不是正态分布,表明数据存在一些异常数据点,必须仔细检查数据点以训练更好的模型。下图第一张图片的残差是正态分布,后一张图片的残差不是正态分布,不满足假设

  • 残差的方差是相等的,这种现象被称为同方差性。误差项的方差非恒定称为异方差性。通常,非恒定方差出现在存在异常值或极端杠杆值的情况下。下图第一张图片的方差是恒定性,后一张图片的方差是非恒定性,不满足假设

线性回归的假设检验

若你在数据上拟合了一条直线,你需要问自己:“这条直线是否对数据有显著拟合?”或者“系数是否能解释

绘制数据的方差。这里我们需要对系数进行假设检验,零假设和备择假设为:

其中是零假设,是备择假设,备择假设与零假设是互斥的。

我们通常使用t-检验验证上述假设,检验统计量如下:

t检验通过零假设计算t统计量的观测值,同时依据t统计量所服从的分布计算其对应的概率P值。若概率P值小于等于α,拒绝原假设;否则,不能拒绝原假设。通常设置

多元线性回归

多元线性回归是一种了解单个因变量与多个自变量之间关系的方法。

多元线性回归的公式与简单线性回归类似,唯一的区别是,现在不再只有一个变量,而是针对所有使用的变量都有 值,公式如下所示:

多元线性回归的一些考虑

上节介绍简单线性回归所做的四个假设对于多元线性回归仍然成立,多元线性回归还需考虑额外的因素。

  • 过拟合:当向模型添加越来越多的变量时,模型可能变得过于复杂,并且通常最终会记住训练集中的所有数据点,这种现象称为模型的过拟合,导致高训练准确率和非常低的测试准确率。

  • 多重过线性:多重共线性是指多元线性回归模型中,可能存在一些相关的变量,即一个特征可以是其他一个或几个特征的线性组合。如果存在多重共线性,求损失函数时矩阵会不可逆,导致求出结果会与实际不同,有所偏差。

  • 特征选择:随着更多变量的存在,从给定特征池中选择最佳的预测变量集合成为建立相关性更强且更好模型的重要任务。

多重共线性检测

由于多重共线性很难确定哪个变量实际上对响应变量的预测起作用,它会导致错误地得出关于自变量对目标变量影响的结论。尽管它不会影响预测的精确度,但是正确地检测和处理模型中存在的多重共线性是至关重要的,因为随机地从模型中删除任何这些相关变量会导致系数值急剧波动,甚至改变符号。

可以使用以下方法检测多重共线性。

  • 成对相关性:检查不同独立变量之间的成对相关性可以在检测多重共线性方面提供有用的见解。
  • 方差膨胀因子(VIF):成对相关性可能并不总是有用,因为可能只有一个变量无法完全解释其他变量,但某些变量的组合可能能够做到这一点。因此,为了检查变量之间的这种关系,可以使用VIF。VIF基本上解释了一个独立变量与所有其他独立变量之间的关系,VIF由以下公式给出:

上述公式的i表示第i个变量被其余独立变量的线性组合,即第i个变量是因变量,剩余变量为自变量

R方的推导:

其中表示预测值,表示观测值,表示观测样本的平均值

通常情况下,当VIF<10,说明不存在多重共线性;当10<=VIF<100,存在较强的多重共线性,当VIF>=100,存在严重多重共线性

线性回归的过拟合和欠拟合

我们总会遇到这种情况:模型在训练数据上表现良好,但在测试数据上却表现不佳的情况。在对数据集进行模型训练时,过拟合和欠拟合是人们面临的最常见问题。

在了解过拟合和欠拟合之前,必须先了解偏差和方差。可参考文章链接一文清晰搞懂机器学习模型的偏差和方差

偏差

偏差是衡量模型在未来未见数据上可能的准确性指标。假设有足够的训练数据,复杂模型可以进行准确的预测。而过于简单的模型则很可能在预测方面表现糟糕。简而言之,偏差是由训练数据造成的误差。

通常线性算法具有较高的偏差,这使它们学习速度快、易于理解,但总体而言,灵活性较差,这意味着预测复杂问题的准确率较低。

方差

方差是模型对训练数据的敏感性,它量化了当输入数据发生变化时模型的反应程度。理想情况下,模型在不同的训练数据集之间不应该有太大的变化,这意味着算法能够很好地捕捉输入和输出变量之间的潜在隐藏模式。

理想情况下,模型的方差应该较低,这意味着模型在改变训练数据后不会发生剧烈变化(它是可泛化的)。如果方差较高,即使在训练数据集发生微小变化时,模型也会发生剧烈变化。

让我们了解什么是偏差-方差折中(bias-variance tradeoff)。

偏差-方差折中(Bias Variance Tradeoff)

在追求模型的最佳性能时,我们需要保持偏差和方差的平衡。在机器学习领域,偏差和方差之间存在一定的反向相关性。如下图:

  • 提高模型复杂度时,偏差会降低,方差会增加
  • 降低模型复杂度时,偏差会增加,方差会减小

在实践中,由于底层目标函数的未知性质,计算精确的偏差和方差项是具有挑战性的。

现在,让我们深入了解过拟合和欠拟合的细节。

过拟合

模型学习到数据中的每一个模式和噪声,以至于影响模型在未来未见数据集上的性能时,就被称为过拟合。模型非常好地拟合了数据,以至于将数据中的噪声误认为是模式。

当模型具有较低的偏差和较高的方差时,它会记住数据并导致过拟合。过拟合导致模型变得特定而不是通用。这通常会导致高训练精度和非常低的测试精度。

检测到过拟合是有用的,但它并没有解决实际问题。有几种方法可以预防过拟合,如下所述:

  • 交叉验证
  • 如果训练数据太少,则添加更多相关且干净的数据
  • 如果训练数据太大,则进行一些特征选择并移除不必要的特征
  • 正则化降低模型复杂度

欠拟合

欠拟合通常没有过拟合那么多被讨论。当模型无法从训练数据集中学习,也无法泛化测试数据集时,就被称为欠拟合,这种问题很容易通过性能指标来检测。

当模型具有较高的偏差和较低的方差时,它最终不能泛化数据,从而导致欠拟合。它无法从数据中找到隐藏的基本模式,这通常会导致训练精度低且测试精度非常低。防止欠拟合的方法如下:

  • 提高模型复杂度
  • 增加训练数据的特征数量
  • 从数据中去除噪声

线性回归代码实战

本节介绍如何用python实现线性回归,我们采用广告销售渠道数据为例,数据下载方法请参考文末。

广告销售渠道数据如下图:

广告销售渠道包括电视(TV)、广播(Radio)和报纸(Newspaper),作为模型的自变量。

销售额(Sales)是需要预测的目标变量,我们的目标是创建一个预测模型,根据在不同平台上用于营销的支出金额来预测销售额。

我们直接开始动手编码完成这个预测任务。如果您不熟悉Python,也不要感到气馁。事实上,学习的最佳方式就是动手解决问题。

第一步:导入Python库

我们使用Jupyter notebook编写代码,我们导入下面几个重要的库

  • Numpy,数值计算库
  • pandas,数据读取和存储库
  • Matplotlib.pyplot,用于绘制数据

导入Python库代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#忽略警告
import warnings 
warnings.filterwarnings('ignore')

最后一行代码的含义是忽视不必要的警告。

第二步:加载数据

我们现在将数据导入到一个 DataFrame 中,DataFrame 是 Python 中的一种数据类型,最简单的理解方式是它以表格形式存储所有数据。

advertising = pd.read_csv( "advertising.csv" )
advertising.head()

代码最后一行的含义是显示前5行数据:

第三步:数据可视化

让我们在一个图中绘制目标变量与预测变量的散点图,以便直观地理解。同时,绘制所有变量(包括自变量和因变量)的热力图。

# seaborn可视化库
import seaborn as sns
# 绘制自变量和因变量的所有散点图
sns.pairplot(advertising, x_vars=['TV''Newspaper','Radio' ], y_vars = 'Sales', size = 4, kind = 'scatter' )
plt.show()
# 绘制热力图以发现所有变量的相关性
sns.heatmap(advertising.corr(), cmap = 'YlGnBu', annot = True )
plt.show()

散点图:

热力图:

从散点图和热力图中,我们可以观察到“销售额”和“电视广告投放”之间的相关性比其他变量更高,因为它们在散点图中呈现出线性模式,并且相关系数为0.9。

你可以继续尝试不同的可视化方法,从数据中发现有趣的见解。

第四步:线性回归模型训练

由于电视广告投放和销售额之间的相关性较高,我们将对这些变量执行单变量的简单线性回归。我们可以使用sklearn或statsmodels来训练线性回归模型。这里使用statmodels。我们首先将特征变量TV作为自变量X,将响应变量Sales作为因变量y

X = advertising[ 'TV' ]
y = advertising[ 'Sales' ]

分配变量后,您需要将变量分割为训练集和测试集,通过从sklearn.model_selection库导入train_test_split来执行此操作。通常,将数据的70%保留在训练数据集中,其余30%保留在测试数据集中是一种良好的做法。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split( X, y, train_size = 0.7, test_size = 0.3, random_state = 100 )

通过上述代码,您可以将数据拆分为训练集和测试集,使用以下代码检查训练集和测试集的形状:

print( X_train.shape )
print( X_test.shape )
print( y_train.shape )
print( y_test.shape )

# 输出
(140,)
(60,)
(140,)
(60,)

导入statmodels库,以执行线性回归。

import statsmodels.api as sm

默认情况下,statsmodels库在数据集上拟合通过原点的直线。但是,为了有一个截距,您需要手动使用statsmodels的add_constant属性。一旦您向X_train数据集添加了常数,您就可以继续使用statsmodels的OLS(普通最小二乘)属性来拟合回归线,如下所示:

# 添加参数截距intercept
X_train_sm = sm.add_constant(X_train)
# OLS拟合直线
lr = sm.OLS(y_train, X_train_sm).fit()

查看模型参数:

lr.params

# 输出
const    6.948683
TV       0.054546
dtype: float64

6.948是截距,0.0545是线性回归模型变量TV的斜率。

使用下面代码,查看模型的评价指标。

print(lr.summary())

输出:

lr.summary()代码提供了线性回归模型训练的摘要,以下是摘要中的一些关键统计数据:

  • TV的系数为0.054,p值非常低,表明系数在统计上是显著的,因此这种关联并非偶然的。
  • R-平方为0.816,意味着81.6%的“销售额”方差可以通过“电视”解释,这是一个相当不错的R-平方值。
  • F-统计量的p值非常低(实际上很低),这意味着模型拟合在统计上是显著的,并且解释的方差不是偶然的。
第5步:线性回归模型预测

我们已经在训练数据集简单地拟合了回归线,本节介绍如何使用训练模型预测测试数据集。因此,您首先需要像对X_train进行操作一样,为X_test数据添加一个常数,然后您可以简单地使用拟合的回归线预测对应于X_test的y值。

# X_test添加常数
X_test_sm = sm.add_constant(X_test)
# 预测y值
y_pred = lr.predict(X_test_sm)

下面代码显示预测的值:

y_pred.head()


为了检查模型在测试数据上的预测效果,我们将使用sklearn库的一些评估指标

#导入评估指标的包
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
# 均方根(RMSE)
print( "RMSE: ",np.sqrt( mean_squared_error( y_test, y_pred)))
# R方
print("R-squared: ",r2_score(y_test, y_pred))

评估指标均方根和R方的输出:

我们在训练集和测试集上都得到了不错的分数。

除了statsmodels之外,还有另一个包名为sklearn,可以用来执行线性回归。我们将使用sklearn中的linear_model库来构建模型。由于我们已经执行了训练-测试拆分,因此我们不需要再次执行它。

不过,有一个小步骤我们需要添加。当只有一个特征时,我们需要添加一个额外的列,以便成功执行线性回归拟合。以下是代码:

X_train_lm = X_train_lm.values.reshape(-1,1)
X_test_lm = X_test_lm.values.reshape(-1,1)

print(X_train_lm.shape)
print(X_train_lm.shape)

模型训练:

from sklearn.linear_model import LinearRegression
# 构建模块
lr = LinearRegression()
#Fit the model using lr.fit()
lr.fit( X_train_lm , y_train_lm )

获取模型截距和斜率:

# 截距
print( lr.intercept_ )
# 斜率
print( lr.coef_ )

结论

线性回归是数据科学中的基石,为预测连续结果提供了一个强大的框架。本文详细介绍了

线性回归的算法原理、参数更新方法、变量可视化、评价指标和模型训练以及推理等内容,很适合机器学习初学者的一篇文章。

本文介绍的数据集获取方法,扫码下方二维码并在公众号后台回复20240410

相关推荐

  • 西工大等提出大模型多智能体框架CRSEC,揭开AI社会的社交奥秘
  • 拷打大模型!首个基于弱智吧贴文的大模型谬误理解评测基准
  • 【社会招聘】快手大模型中心_大模型算法专家
  • 大厂数仓模型设计及工具模板
  • 时间序列 AI 技术与大模型:蚂蚁集团的实践与应用探索
  • 万亿数据的电商平台,如何做存储?
  • XAI有什么用?探索LLM时代利用可解释性的10种策略
  • Meta宣布全新训推一体加速器:完全集成PyTorch 2,性能3倍提升
  • 为什么要纯C语言手搓GPT-2,Karpathy回应网友质疑
  • 史上首位阿贝尔奖、图灵奖双得主!2023图灵奖授予随机性大佬Avi Wigderson
  • 若通过验证可颠覆美国后量子密码设计,清华陈一镭预印论文破解格密码
  • 长文本杀不死RAG:SQL+向量驱动大模型和大数据新范式,MyScale AI数据库正式开源
  • 更好、更安全、更不依赖OpenAI,微软的AI新动向,推出大模型安全工具Azure AI
  • 编程的“Devin AI 时代”,软件开发者的喜与忧
  • 从AIGC到AGI,为什么我们需要更多的“技术信仰派”?
  • 「大模型+强化学习」最新综述!港中文深圳130余篇论文:详解四条主流技术路线
  • 量子计算可靠性提升800倍!微软开启2级弹性量子计算新时代
  • 史上首次,AI超越人类奥赛金牌得主!吴方法加持,30题做出27道破纪录
  • 2023年图灵奖揭晓!普林斯顿数学教授,成史上首位阿贝尔奖双料获奖者
  • 国内首款AI音乐大模型一曲封神!核心技术业内首公开,爆改霉霉周杰伦效果惊艳