线性回归是数据科学中的基础算法,在预测连续结果方面发挥着关键作用。本文深入探讨了线性回归,涵盖了其原理、应用以及在真实数据集上的Python实现。本文介绍了简单线性回归和多重线性回归的重要性、局限性和实际用例,为初学者和实践者提供了全面的资源。跟随我们一起探索线性回归的复杂性,深入了解其工作原理并进行实际应用。
线性回归通过假设自变量和因变量之间存在线性关系来预测两个变量之间的关系。它寻求最优直线,以最小化预测值与实际值之间的平方差之和。在经济学和金融等各个领域应用广泛,该方法分析并预测数据趋势。它可以扩展到涉及多个自变量的多元线性回归,以及逻辑回归,适用于二分类问题。
在简单线性回归中,有一个自变量和一个因变量。该模型估计最佳拟合直线的斜率和截距,它表示两者之间的关系。斜率表示每单位自变量变化对应的因变量变化,而截距表示当自变量为零时因变量的预测值。
线性回归是机器学习中用于预测分析的一种简单的统计回归方法。线性回归显示了自变量(预测器)即X轴与因变量(输出)即Y轴之间的线性关系,称为线性回归。如果有一个输入变量X(自变量),这样的线性回归称为简单线性回归。
上面的图表展示了输出(y)和预测变量(X)之间的线性关系。蓝色线被称为最佳拟合直线。根据给定的数据点,我们尝试绘制一条最能匹配这些点的线。
简单线性回归的方程表达式:
其中是因变量,是截距,是斜率,是自变量。
算法通过上述方程解释了自变量和因变量的线性关系,
线性回归如何确定最佳拟合线呢?线性回归算法的目标是获得和的最佳值,以找到最佳拟合线。最佳拟合线是一条具有最小误差的线,意味着预测值和实际值之间的误差应该最小。
线性回归中,预测值(predicted)与观测值的差值称为残差,残差的本质是模型的随机误差(Random Error),是必然存在且不可学习的参数。
上图蓝色点表示观测值,红色点表示预测值。
简单来说,最佳拟合线是一条最好地符合给定散点图的线。在数学上,最佳拟合线是通过最小化残差平方和(RSS)来获得的。
损失函数有助于计算出参数和的值,从而为离散数据点提供最佳拟合线。
在线性回归中,通常使用均方误差(MSE)作为损失函数,均方差等于预测值和 观测值的平方误差的平均值。
我们使用简单线性方程 y=mx+b 来计算 MSE:
通过梯度下降法最小化损失函数,得到对应参数和的值。
梯度下降算法是一种优化算法,通过迭代和的值使损失函数(目标函数)达到极小值。
回归模型通过优化梯度下降算法更新线性系数,随机初始化线性系数,然后迭代更新以达到最小损失函数。
如上图,横坐标是线性回归系数,纵坐标是损失函数,蓝色点通过梯度下降算法进行更新,最后达到最优值(Optimal value)。
通过梯度下降算法,我们需要选择合适的学习率参数。
若学习率太大,损失函数有可能快速达到最优值,也有可能迭代很多次也达不到最优值,如下图:
若学习率太小,则需要更多的迭代次数达到最优值。
为了更新参数和,我们计算损失函数对参数的偏导,损失函数记为J
,推导如下:
假设学习率为,梯度下降法更新参数,有:
我们需要最小化代价函数 J,实现这一目标的其中一种方法是批量梯度下降算法。在批量梯度下降中,数值在每次迭代中更新。
我们可以使用多种评价指标度量当前的模型性能,最常用的指标包括:
R方指标,也称为R-Square,是一种用于评估回归模型拟合程度的统计量。,它的值范围在0~1之间,数值越大表示拟合效果越好。
数学表达式:
其中RSS表示残差平方和(Residual sum of Square),TSS表示总偏差平方和(Total Sum of Squares),总偏差平方和简称总平方和。
如下图R方数值与线性拟合效果,R方越大,拟合效果越好。
数学表达式:
数学表达式:
为了更直观理解,可视化RRS和TSS的定义:
其中,和分别表示观测样本,所有观测样本的平均值和预测样本。
均方根误差是残差方差的平方根,表示模型对数据的绝对拟合程度,即观测值与预测值的接近程度。在数学上可以表示为:
为了使这个估计量无偏,我们需将残差平方和除以自由度(n-2),而不是模型中数据点的总数。这个术语被称为残差标准误差(RSE),在数学上可以表示为:
R方比RSME更好。因为均方根误差的值取决于变量的单位(即它不是一个归一化的度量),它可以随着变量单位的改变而改变。
线性回归是一种参数化方法,这意味着它对数据进行分析时做出了一些假设。为了成功进行回归分析,验证以下假设是至关重要的,下面所介绍的残差的含义是观测值和预测值差值。
残差项之间是相互独立的,即残差项是随机分布的,与观测变量无相关关系。如下图第一张图片的残差项是相互独立的,后一张图片不满足假设
残差是正态分布,即残差是符合均值为0或接近0的正态分布,我们基于这种先验,可以判断当前的拟合直线是否为最优直线,判断方法是累加所有数据点的残差项是否为0或接近0。如果残差项不是正态分布,表明数据存在一些异常数据点,必须仔细检查数据点以训练更好的模型。下图第一张图片的残差是正态分布,后一张图片的残差不是正态分布,不满足假设
残差的方差是相等的,这种现象被称为同方差性。误差项的方差非恒定称为异方差性。通常,非恒定方差出现在存在异常值或极端杠杆值的情况下。下图第一张图片的方差是恒定性,后一张图片的方差是非恒定性,不满足假设
若你在数据上拟合了一条直线,你需要问自己:“这条直线是否对数据有显著拟合?”或者“系数是否能解释
绘制数据的方差。这里我们需要对系数进行假设检验,零假设和备择假设为:
其中是零假设,是备择假设,备择假设与零假设是互斥的。
我们通常使用t-检验验证上述假设,检验统计量如下:
t检验通过零假设计算t统计量的观测值,同时依据t统计量所服从的分布计算其对应的概率P值。若概率P值小于等于α,拒绝原假设;否则,不能拒绝原假设。通常设置
多元线性回归是一种了解单个因变量与多个自变量之间关系的方法。
多元线性回归的公式与简单线性回归类似,唯一的区别是,现在不再只有一个变量,而是针对所有使用的变量都有 值,公式如下所示:
上节介绍简单线性回归所做的四个假设对于多元线性回归仍然成立,多元线性回归还需考虑额外的因素。
过拟合:当向模型添加越来越多的变量时,模型可能变得过于复杂,并且通常最终会记住训练集中的所有数据点,这种现象称为模型的过拟合,导致高训练准确率和非常低的测试准确率。
多重过线性:多重共线性是指多元线性回归模型中,可能存在一些相关的变量,即一个特征可以是其他一个或几个特征的线性组合。如果存在多重共线性,求损失函数时矩阵会不可逆,导致求出结果会与实际不同,有所偏差。
特征选择:随着更多变量的存在,从给定特征池中选择最佳的预测变量集合成为建立相关性更强且更好模型的重要任务。
由于多重共线性很难确定哪个变量实际上对响应变量的预测起作用,它会导致错误地得出关于自变量对目标变量影响的结论。尽管它不会影响预测的精确度,但是正确地检测和处理模型中存在的多重共线性是至关重要的,因为随机地从模型中删除任何这些相关变量会导致系数值急剧波动,甚至改变符号。
可以使用以下方法检测多重共线性。
上述公式的i表示第i个变量被其余独立变量的线性组合,即第i个变量是因变量,剩余变量为自变量
R方的推导:
其中表示预测值,表示观测值,表示观测样本的平均值
通常情况下,当VIF<10,说明不存在多重共线性;当10<=VIF<100,存在较强的多重共线性,当VIF>=100,存在严重多重共线性
我们总会遇到这种情况:模型在训练数据上表现良好,但在测试数据上却表现不佳的情况。在对数据集进行模型训练时,过拟合和欠拟合是人们面临的最常见问题。
在了解过拟合和欠拟合之前,必须先了解偏差和方差。可参考文章链接一文清晰搞懂机器学习模型的偏差和方差
偏差是衡量模型在未来未见数据上可能的准确性指标。假设有足够的训练数据,复杂模型可以进行准确的预测。而过于简单的模型则很可能在预测方面表现糟糕。简而言之,偏差是由训练数据造成的误差。
通常线性算法具有较高的偏差,这使它们学习速度快、易于理解,但总体而言,灵活性较差,这意味着预测复杂问题的准确率较低。
方差是模型对训练数据的敏感性,它量化了当输入数据发生变化时模型的反应程度。理想情况下,模型在不同的训练数据集之间不应该有太大的变化,这意味着算法能够很好地捕捉输入和输出变量之间的潜在隐藏模式。
理想情况下,模型的方差应该较低,这意味着模型在改变训练数据后不会发生剧烈变化(它是可泛化的)。如果方差较高,即使在训练数据集发生微小变化时,模型也会发生剧烈变化。
让我们了解什么是偏差-方差折中(bias-variance tradeoff)。
在追求模型的最佳性能时,我们需要保持偏差和方差的平衡。在机器学习领域,偏差和方差之间存在一定的反向相关性。如下图:
在实践中,由于底层目标函数的未知性质,计算精确的偏差和方差项是具有挑战性的。
现在,让我们深入了解过拟合和欠拟合的细节。
模型学习到数据中的每一个模式和噪声,以至于影响模型在未来未见数据集上的性能时,就被称为过拟合。模型非常好地拟合了数据,以至于将数据中的噪声误认为是模式。
当模型具有较低的偏差和较高的方差时,它会记住数据并导致过拟合。过拟合导致模型变得特定而不是通用。这通常会导致高训练精度和非常低的测试精度。
检测到过拟合是有用的,但它并没有解决实际问题。有几种方法可以预防过拟合,如下所述:
欠拟合通常没有过拟合那么多被讨论。当模型无法从训练数据集中学习,也无法泛化测试数据集时,就被称为欠拟合,这种问题很容易通过性能指标来检测。
当模型具有较高的偏差和较低的方差时,它最终不能泛化数据,从而导致欠拟合。它无法从数据中找到隐藏的基本模式,这通常会导致训练精度低且测试精度非常低。防止欠拟合的方法如下:
本节介绍如何用python实现线性回归,我们采用广告销售渠道数据为例,数据下载方法请参考文末。
广告销售渠道数据如下图:
广告销售渠道包括电视(TV)、广播(Radio)和报纸(Newspaper),作为模型的自变量。
销售额(Sales)是需要预测的目标变量,我们的目标是创建一个预测模型,根据在不同平台上用于营销的支出金额来预测销售额。
我们直接开始动手编码完成这个预测任务。如果您不熟悉Python,也不要感到气馁。事实上,学习的最佳方式就是动手解决问题。
我们使用Jupyter notebook编写代码,我们导入下面几个重要的库
导入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()代码提供了线性回归模型训练的摘要,以下是摘要中的一些关键统计数据:
我们已经在训练数据集简单地拟合了回归线,本节介绍如何使用训练模型预测测试数据集。因此,您首先需要像对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