机器学习——线性回归算法图文详解
线性回归、损失函数、正规方程、梯度下降、批量梯度下降、随机梯度下降、小批量梯度下降、随机平均梯度下降、正则化、模型评估方法、随机平均梯度下降MAE、均方误差MSE、均方根误差RMSE、R-Squared、R²、R2、Adj. R²、L1正则化、Lasso回归、L2正则化、Ridge 岭回归
1. 什么是线性回归
线性回归(Linear regression)是利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。是一种用于预测连续变量的经典机器学习算法。它通过拟合一条直线(或超平面)来描述自变量和因变量之间的线性关系。
特点:只有一个自变量的情况称为单变量回归,多于一个自变量情况的叫做多元回归。
通用公式
h
(
w
)
=
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
.
.
.
+
b
=
w
T
x
+
b
h(w)=w{_1}x{_1}+w{_2}x{_2}+w{_3}x{_3}+...+b=w^Tx+b
h(w)=w1x1+w2x2+w3x3+...+b=wTx+b,
其中 w w w, x x x可以理解为矩阵: w = ( b w 1 w 2 ⋮ ) w= \begin{pmatrix} b \\ w{_1} \\ w{_2} \\ \vdots \end{pmatrix} w= bw1w2⋮ , x = ( 1 x 1 x 2 ⋮ ) x= \begin{pmatrix} 1 \\ x{_1} \\ x{_2}\\\vdots \end{pmatrix} x= 1x1x2⋮
线性回归用矩阵表示举例:
{ 1 × x 1 + x 2 = 2 0 × x 1 + x 2 = 2 2 × x 1 + x 2 = 3 \begin{cases}1 \times x{_1} + x{_2} = 2 \\ 0 \times x{_1} + x{_2} = 2 \\ 2 \times x{_1} + x{_2} = 3 \end{cases} ⎩ ⎨ ⎧1×x1+x2=20×x1+x2=22×x1+x2=3
写成矩阵形式:
那么怎么理解呢?我们来看几个例子
- 期末成绩:0.7×考试成绩+0.3×平时成绩
- 房子价格 = 0.02×中心区域的距离 + 0.04×城市一氧化氮浓度 + (-0.12×自住房平均房价) + 0.254×城镇犯罪率
上面两个例子, 我们看到特征值与目标值之间建立了一个关系,这个关系可以理解为线性模型 。
线性回归当中主要有两种模型, 一种是线性关系,另一种是非线性关系。
2. 损失函数
损失函数的概念:
- 用来衡量机器学习模型性能的函数
- 损失函数可以计算预测值与真实值之间的误差(用一个实数来表示),误差越小说明模型性能越好
损失函数的作用:
- 确定损失函数之后, 我们通过求解损失函数的极小值来确定机器学习模型中的参数
线性回归的目标是最小化预测值与实际值之间的误差。常用的损失函数是均方误差(Mean Squared Error, MSE),定义如下:
其中:
- y𝑖 为第 𝑖 个训练样本的真实值
- y ^ \widehat{y} y 𝑖 为是第 𝑖 个样本的预测值
- n 是样本数量。
MSE通过平方差的平均值来度量预测值与实际值之间的差异。
3. 正规方程
正规方程(Normal Equation)是一种解析求解线性回归模型参数的方法。通过对损失函数求导并设导数为零,可以直接求解最优参数。正规方程的公式如下:
其中:
- w 是参数向量。
- X 是特征矩阵,包含所有样本的特征。
- y 是目标值向量。
使用正规方程可以避免迭代
过程,直接得到最优解,但在特征数目非常大时,计算矩阵相乘求解时的代价较高
。
4. 梯度下降(Gradient Descent)
梯度下降(Gradient Descent)是一种迭代优化算法,通过不断更新参数,使损失函数逐步减小,最终收敛到最优解。梯度下降的更新公式为:
θ i + 1 = θ i − α ∂ ∂ θ i J ( θ ) \Large \theta_{i+1} = \theta_{i} - \alpha\frac{\partial}{\partial\theta_{i}}J(\theta) θi+1=θi−α∂θi∂J(θ)
- 1) α \alpha α是什么含义?
α
\alpha
α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,控制参数不要走太快,错过了使损失函数取最小值的点。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山下。所以α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!
- 2) 为什么梯度要乘以一个负号?
梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们在前文提到,梯度的方向实际就是函数在此点上升最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号
我们通过两个图更好理解梯度下降的过程
-
梯度下降法(gradient descent)是一个最优化算法,常用于机器学习和深度学习中用来递归性地逼近最小偏差模型
-
梯度下降法的计算过程就是沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值)
-
线性回归的回归系数可以通过梯度下降算法找到损失函数的极小值得到
-
梯度下降中,学习率(Learning rate)是一个很重要的参数,它决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度
梯度下降包括:
-
全梯度下降算法(FG):在进行梯度下降迭代时,所有样本均参与计算
-
随机梯度下降算法(SG):在进行梯度下降迭代时,每次迭代只选取一个样本进行计算
-
小批量梯度下降算法(mini-batch):在进行梯度下降迭代时,每次迭代只选取一部分样本进行计算
-
随机平均梯度下降算法(SAG): 每次迭代时, 随机选择一个样本的梯度值和以往样本的梯度值的均值
5. 回归问题评估
不同于类别预测,不能苛刻回归预测的数值结果要严格的和真实值一致。一般情况下,我们希望衡量预测值和真实值之间的差距。因此,可以通过多种测评函数进行评价。
评估线性回归模型的性能,常用以下指标:
-
均方误差(Mean Squared Error, MSE):
-
均方根误差(Root Mean Squared Error, RMSE):
-
平均绝对误差(Mean Absolute Error, MAE):
一般我们使用MAE 和 RMSE 这两个指标
MAE、RMSE的优点
- 都能反映出预测值和真实值之间的误差
- MAE反应的是“真实”的平均误差,RMSE会将误差大的数据点放大
MAE、RMSE的缺点
- MAE 不能体现出误差大的数据点。
- RMSE虽然会加放大大误差的数据点对指标的影响, 但是对异常数据比较敏感
R-Squared 和 Adj. R²
R² 指标表明模型与测试数据的拟合程度,但无法解释模型是否良好
某些情况下,当增加模型复杂程度(比如添加高次方项),R²值会变大,单独以R²作为评价指标,可能会导致过拟合
R² 对非线性模型没有意义
因此,同时使用R² 与 Adjusted R² 可以更好的对模型是否过拟合做出判断,但更靠谱的办法还是使用多组不同的测试数据对模型进行测试。
6. 正则化
正则化是防止模型过拟合的一种技术,通过在损失函数中加入正则化项来约束模型参数。常见的正则化方法有L1正则化(Lasso回归)和L2正则化(Ridge回归)。
在解决回归过拟合中,我们选择正则化。但是对于其他机器学习算法如分类算法来说也会出现这样的问题,除了一些算法本身作用之外(决策树、神经网络),我们更多的也是去自己做特征选择,包括之前说的删除、合并一些特征
L1正则化:Lasso回归
- 假设𝐿(𝑊)是未加正则项的损失,𝜆是一个超参,控制正则化项的大小。
- 则最终的损失函数: L = L ( ) + λ ∗ ∑ i = 1 n ∣ w i ∣ L=L()+ \lambda*\sum_{i=1}^{n}\lvert w_i\rvert L=L()+λ∗∑i=1n∣wi∣
作用:用来进行特征选择,主要原因在于L1正则化会使得较多的参数为0,从而产生稀疏解,可以将0对应的特征遗弃,进而用来选择特征。一定程度上L1正则也可以防止模型过拟合。
L2正则化:Ridge 岭回归
- 假设𝐿(𝑊)是未加正则项的损失,𝜆是一个超参,控制正则化项的大小。
- 则最终的损失函数: L = L ( W ) + λ ∗ ∑ i = 1 n w i 2 L=L(W)+ \lambda*\sum_{i=1}^{n}w_{i}^{2} L=L(W)+λ∗∑i=1nwi2
作用:主要用来防止模型过拟合,可以减小特征的权重
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
7. 可执行示例代码
以下是使用Python和scikit-learn库实现线性回归的示例代码:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 生成示例数据
np.random.seed(0)
X = np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估模型
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("均方误差 (MSE):", mse)
print("均方根误差 (RMSE):", rmse)
print("平均绝对误差 (MAE):", mae)
print("决定系数 (R²):", r2)
# 使用Ridge回归
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
ridge_pred = ridge.predict(X_test)
print("Ridge回归的R²:", r2_score(y_test, ridge_pred))
# 使用Lasso回归
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)
lasso_pred = lasso.predict(X_test)
print("Lasso回归的R²:", r2_score(y_test, lasso_pred))
8. 线性回归算法总结
线性回归是一种简单而有效的回归算法,适用于预测连续变量。通过合理的特征选择、正则化和模型评估,可以在许多实际问题中取得良好的表现。线性回归的主要优点包括易于实现和理解、计算效率高、适用于高维稀疏数据等,但在处理非线性关系和异常值时存在一定局限性。
特点
- 线性关系:假设自变量和因变量之间存在线性关系,即因变量可以通过自变量的线性组合来表示。
- 可解释性:模型简单,易于理解和解释。每个特征的回归系数表示该特征对目标变量的影响大小。
- 解析解和迭代解:可以通过正规方程直接求解参数,也可以使用梯度下降法进行迭代优化。
优点
- 易于实现和理解:算法简单,易于实现和解释,适合入门和教学。
- 计算效率高: 训练和预测过程计算效率高,适用于大规模数据集。
- 适用于高维稀疏数据:在处理高维稀疏数据(如文本分类中的词袋模型)时表现良好。
- 支持正则化: 可以通过L1正则化(Lasso回归)和L2正则化(Ridge回归)来防止过拟合。
缺点
- 线性假设:假设特征与目标变量之间存在线性关系,无法捕捉复杂的非线性关系。
- 对异常值敏感:对异常值较为敏感,异常值可能显著影响模型的拟合效果。
- 特征选择依赖:需要对特征进行筛选和工程,确保输入特征与目标变量之间有线性关系,否则模型性能可能较差。
- 无法处理多重共线性: 如果特征之间存在多重共线性(即特征高度相关),模型的回归系数可能变得不稳定。
关键
- 损失函数:使用均方误差(MSE)作为损失函数,衡量预测值与实际值之间的差异。
- 优化方法:可以使用正规方程直接求解最优参数,也可以使用梯度下降法进行迭代优化。
- 正则化: 通过L1正则化(Lasso回归)和L2正则化(Ridge回归)来防止过拟合。
- 评估方法:使用均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)和决定系数(R²)等指标评估模型性能。
过程
- 数据准备:收集和整理数据,确保数据质量,并进行必要的预处理(如处理缺失值、异常值等)。
- 特征工程:选择合适的特征,进行特征转换和扩展(如多项式特征、交互特征)。
- 模型训练:使用训练数据拟合线性回归模型,通过正规方程或梯度下降法求解模型参数。
- 模型评估:使用测试数据评估模型性能,计算评估指标(如MSE、RMSE、MAE、R²)。
- 正则化:根据需要选择合适的正则化方法(Lasso回归或Ridge回归)防止过拟合。
- 模型优化:根据评估结果和业务需求,调整模型参数和特征,进行模型优化。
- 模型部署:将训练好的模型部署到生产环境中,进行预测和应用。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)