目录
1 定义
2 损失函数(回归)
2.1 最小二乘函数(Least Squares Function)
2.2 均方误差(Mean Squared Error, MSE)
2.3 均方根误差(Root Mean Squared Error, RMSE)
2.4 平均绝对误差(Mean Absolute Error, MAE):
2.5 损失函数的选择
3 损失函数最优解的求解方法(权重向量和截距向量的求解)
3.1 正规方程法(Normal Equation Method)
3.2 梯度下降法(Gradient Descent)
3.2.1 梯度的概念
3.2.2 梯度下降的原理(步骤)
3.2.3 梯度下降注意事项
3.2.4 梯度下降算法的分类
4 线性回归的评估方法
4.1 均方误差(MSE)
4.2 均方根误差(RMSE)
4.3 平均绝对误差(Mean Absolute Error,MAE)
5 线性回归算法API
5.1 正规方程API
5.2 梯度下降API
6 线性回归的欠拟合和过拟合优化
6.1 欠拟合
6.2 过拟合
7 正则化
7.1 L1正则化(Lasso):
7.2 L2正则化(Ridge Regression 或 Tikhonov Regularization):
8 线性回归案例代码实现
1 定义
利用数理统计中的回归分析来确定两种或两种以上变量间相互依赖的定量关系。线性回归的基本假设是变量之间存在线性关系,这种关系可以用一条直线或一组直线来表示。
线性回归模型是一个数学方程,它描述了因变量与自变量之间的线性关系。这个方程通常可以表示为 y = w'x + b
,其中 y
是因变量,x
是自变量(可以是一个或多个),w
是权重(或称为回归系数),b
是截距项。这个方程就是我们要找的线性模型。
w:wight 权重 b:bias 偏置、截距
2 损失函数(回归)
损失函数(Loss Function)或成本函数(Cost Function)在机器学习和深度学习中起着至关重要的作用,它衡量了模型预测值与实际值之间的差异。这个差异被用来指导模型的训练过程,即模型参数的优化。
此处仅介绍回归问题中的损失函数
2.1 最小二乘函数(Least Squares Function)
最小二乘函数(Least Squares Function)是回归分析中常用的一种损失函数,它衡量了模型预测值与实际观测值之间的平方误差之和。最小二乘法的目标是找到使平方误差之和最小的模型参数。
最小二乘法本身并没有一个直接的公式,但它描述了一种原则或方法,即找到使得所有数据点到回归线或拟合线的垂直距离(误差)的平方和最小的直线或曲线。在线性回归的情况下,我们通常通过最小化预测值与实际值之间的差的平方和来求解模型的参数(如斜率和截距)。
2.2 均方误差(Mean Squared Error, MSE)
常用于回归问题。它计算预测值与真实值之间差的平方的平均值。
其中,yi 是真实值,y^i 是预测值,n 是样本数量。
2.3 均方根误差(Root Mean Squared Error, RMSE)
也是回归问题中常用的损失函数,是MSE的平方根。
2.4 平均绝对误差(Mean Absolute Error, MAE):
同样用于回归问题,它计算预测值与真实值之间差的绝对值的平均值。
2.5 损失函数的选择
选择合适的损失函数对于模型训练至关重要。不同的损失函数对异常值的敏感度、对模型优化的影响以及计算复杂性等方面都有所不同。因此,在选择损失函数时,需要综合考虑数据的性质、模型的类型以及问题的需求。
3 损失函数最优解的求解方法(权重向量和截距向量的求解)
3.1 正规方程法(Normal Equation Method)
正规方程法(Normal Equation Method)是一种用于求解线性回归模型参数(如斜率和截距)的直接方法。这种方法通过求解一个线性方程组来找到使得预测误差平方和最小的参数值。
假设我们有一个线性回归模型:
其中,是目标变量,是特征变量,是我们要找的模型参数。
给定一个包含 个样本的数据集 ,其中 是一个特征向量,我们可以将模型表示为矩阵形式:
其中,
为了找到使预测误差平方和最小的 ,我们可以使用正规方程法来求解以下方程:
解这个方程,我们可以得到:
这就是正规方程法的解。注意,这里假设 (X^TX) 是可逆的(即 (X^TX) 的行列式不为零)。如果 (X^TX) 不可逆(即存在多重共线性或特征数量大于样本数量),则无法直接使用正规方程法求解,此时可以考虑使用其他方法,如梯度下降法或岭回归(Ridge Regression)。
这个示例展示了如何使用正规方程法来求解一个简单的线性回归模型的参数。请注意,在实际应用中,当特征数量很大或样本数量很多时,正规方程法可能会变得非常慢或不可行,因为计算 的时间复杂度和空间复杂度都很高。在这种情况下,梯度下降法或其他优化算法可能是更好的选择。
3.2 梯度下降法(Gradient Descent)
梯度下降法(Gradient Descent)是一个一阶最优化算法,通常也称为最速下降法。其核心思想是:通过迭代的方式,不断地沿着函数在当前点的梯度(或者是近似梯度)的反方向移动,以逐步逼近函数的局部极小值。如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点,这个过程则被称为梯度上升法。
在机器学习和人工智能领域,梯度下降法常用于求解损失函数的最小值,以优化模型的参数。具体来说,可以通过梯度下降法来一步步地迭代求解,得到最小化的损失函数和模型参数值。
3.2.1 梯度的概念
梯度的概念可以用以下公式和描述来解释:
公式说明:
梯度是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值。也就是说,函数在该点处沿着这个方向(梯度的方向)变化最快,变化率也最大(梯度的模表示这个最大变化率)。
对于二元函数,其梯度可以表示为:
其中, 和 分别是函数 对 和 的偏导数。
几何意义:
梯度的几何意义是函数变化率最大的方向。沿着梯度向量的方向,更容易找到函数的最大值;反过来说,沿着梯度向量相反的方向,是梯度减少最快的方向,更容易找到函数的最小值。
梯度与等高线的关系是:梯度是曲面等高线的法向量,与曲面等高线切线方向垂直。
3.2.2 梯度下降的原理(步骤)
假设我们有一个函数,其中 是我们要优化的参数(通常是一个向量)。我们的目标是找到使 最小的 值。
梯度下降的核心思想是沿着函数的负梯度方向进行搜索,梯度是函数值上升最快的方向,所以负梯度方向是函数值下降最快的方向。
具体地,梯度下降算法的迭代过程可以表示为:
-
初始化参数 (可以是随机的,也可以是根据某种策略选择的)。
-
对于第 次迭代:
a. 计算函数 在当前点 的梯度 。梯度是一个向量,表示函数在各个方向上的偏导数。
b. 更新参数 (\theta):,其中 是学习率(步长),它决定了我们在梯度方向上迈出的步伐大小。
这个迭代过程会一直进行,直到满足某个停止条件,比如梯度向量的幅值接近0(表示已经到达一个极值点),或者连续两次迭代之间的函数值变化足够小(表示已经收敛到一个局部最小值)。
用数学公式表示,梯度下降算法可以写为:
其中, 是第 次迭代后的参数值,是学习率,是函数 在点处的梯度。
3.2.3 梯度下降注意事项
-
学习率(步长)的选择:学习率决定了参数更新的幅度。如果学习率过小,梯度下降的速度会很慢,需要更多的迭代次数才能收敛;如果学习率过大,可能会导致在梯度下降过程中跳过最优解,产生下降过程中的震荡,甚至梯度爆炸。因此,选择一个合适的学习率是非常重要的。在实际应用中,通常会使用固定的学习率或逐渐衰减的学习率。
-
特征的标准化/归一化:梯度下降对数据的尺度和分布是敏感的。如果数据的尺度差异很大,梯度下降可能会出现收敛缓慢的问题。因此,对数据进行预处理,如标准化或归一化,使数据在相同的尺度范围内,有助于加快算法的收敛速度。
-
鞍点和局部最优解:梯度下降法容易陷入局部最优解或鞍点中。鞍点是函数上的导数为零但不是局部极值的点,通常梯度为零的点是鞍点而非局部最小值。为了避免这种情况,可以尝试使用不同的初始化参数、调整学习率或使用更复杂的优化算法。
-
收敛性判断:在使用梯度下降算法时,需要设置合适的收敛条件来判断算法是否收敛。常见的收敛条件包括目标函数值的变化小于某个阈值、梯度向量的模小于某个阈值等。此外,还可以使用可视化工具来观察算法的训练过程,以便更好地指导模型训练。
-
初始化参数:参数的初始化对梯度下降算法的性能有很大影响。不同的初始化方法可能会导致算法收敛到不同的局部最优解。因此,在实际应用中,可以尝试使用不同的初始化方法,并观察其对算法性能的影响。
需要注意的是,梯度下降算法只能找到局部最小值,而不能保证找到全局最小值。
3.2.4 梯度下降算法的分类
-
批量梯度下降法(Batch Gradient Descent, BGD):
- 批量梯度下降法使用整个数据集来计算代价函数的梯度。在每次迭代中,它都会使用全部数据来计算梯度并更新参数。这种方法在处理大数据集时可能会非常慢,因为它需要计算所有样本的梯度。
- 优点:由于使用了整个数据集,因此能够更准确地找到梯度下降的方向。
- 缺点:计算量大,速度慢,并且很难处理不能载入内存的数据集。
-
随机梯度下降法(Stochastic Gradient Descent, SGD):
- 随机梯度下降法每次迭代只使用一个样本来计算梯度并更新参数。这种方法大大加快了收敛速度,并且非常适合在线学习场景,即当数据源源不断到来时,可以实时更新模型参数。
- 优点:速度快,适合大规模数据集和在线学习。
- 缺点:由于每次只使用一个样本,因此梯度下降的方向可能会受到噪声的影响,导致收敛不稳定。
-
小批量梯度下降法(Mini-Batch Gradient Descent, MBGD):
- 小批量梯度下降法结合了批量梯度下降法和随机梯度下降法的优点。在每次迭代中,它使用一小批样本来计算梯度并更新参数。这种方法既可以利用矩阵运算的并行性来加速计算,又可以减少噪声的影响,使收敛更加稳定。
- 优点:结合了BGD和SGD的优点,既稳定又高效。
- 缺点:对于某些复杂的问题,可能需要调整批量大小和学习率等超参数来获得最佳性能。
- 动量梯度下降法(Momentum Gradient Descent)
- 动量梯度下降法是一种对标准梯度下降法的优化,旨在加速训练过程并抑制振荡。其主要思想是在更新模型参数时,不仅考虑当前梯度,还考虑历史梯度的信息。通过引入一个动量项(或称为“速度”),该算法能够在正确的方向上加速前进,同时抑制在局部最小值附近的振荡。
- 具体来说,动量梯度下降法在每次迭代时,都会计算当前梯度,并将其与动量项(即上一步的速度)进行加权组合,得到新的速度。然后,使用新的速度来更新模型参数。这样,算法就能够更好地利用历史梯度的信息,加速收敛过程,并减少振荡。
- 动量梯度下降法的优点包括加速收敛、抑制振荡等。然而,其性能也受到动量项和学习率等超参数的影响,需要根据具体任务进行调整。
- Adam优化算法简要介绍
- Adam(Adaptive Moment Estimation)是一种自适应学习率的优化算法,它结合了动量法和自适应梯度算法的优点。Adam算法通过计算梯度的一阶矩估计和二阶矩估计,为不同的参数设计独立的自适应学习率。
-
具体来说,Adam算法在每次迭代时,都会计算当前梯度,并更新两个矩估计变量:一阶矩估计(类似于动量项)和二阶矩估计(类似于梯度的平方的累加)。然后,根据这两个矩估计变量来调整每个参数的学习率。通过这种方式,Adam算法能够在不同的参数上自适应地使用不同的学习率,从而更好地适应不同的问题和数据分布。
-
Adam算法的优点包括自适应学习率、易于实现和调优等。它已经成为深度学习中最常用的优化算法之一,并在许多任务上取得了优异的性能。然而,Adam算法也存在一些缺点,例如在某些情况下可能会收敛到次优解或导致训练不稳定等。因此,在使用Adam算法时,也需要根据具体任务和数据分布进行适当的调整和优化。
4 线性回归的评估方法
4.1 均方误差(MSE)
是预测值和真实值之差的平方和的期望值,可以抵消数据量的影响,不考虑样本本身的分布。MSE的值越小,说明预测模型描述实验数据的精确度越高。
API:
sklearn.metrics.mean_squared_error(y_true,y_predect)
4.2 均方根误差(RMSE)
是MSE的平方根,也是一种常用的评估指标。
API:
对MSE开方即可
4.3 平均绝对误差(Mean Absolute Error,MAE)
平均绝对误差(Mean Absolute Error,MAE)是一种衡量预测准确性的度量,它计算的是预测值与实际值之间绝对误差的平均值。
API:
sklearn.metrics.mean_absolute_error(y_true,y_predict)
5 线性回归算法API
5.1 正规方程API
# 实例化
estimator = sklearn.linear_model.LinearRegression()
#训练
estimator.fit(x_train,y_train)
5.2 梯度下降API
# 实例化
estimator = sklearn.linear_model.SGDRegressor(loss = 'squared_loss',max_iter=1000,learning_rate ='invscaling',eta0 = 0.01)
#训练
estimator.fit(x_train,y_train)
参数解释:
- loss:损失函数的类型。它决定了模型在训练过程中要最小化的目标函数。对于线性回归问题,通常使用平方损失(squared_loss)(最小二乘),即最小化预测值与实际值之间的平方差。
- penalty:正则化项的类型。正则化是一种防止模型过拟合的技术,它通过向损失函数中添加一个额外的项来实现。SGDRegressor支持两种正则化类型:“l2”和“elasticnet”。其中,“l2”是常用的L2正则化,也称为权重衰减或岭回归;“elasticnet”则是L1和L2正则化的混合。
- alpha:正则化项的强度。它决定了正则化项在损失函数中的权重。较大的alpha值会导致模型更加倾向于选择较小的权重,从而防止过拟合。
- l1_ratio:当使用“elasticnet”正则化时,这个参数指定了L1正则化项与L2正则化项之间的比例。例如,如果l1_ratio为0,则相当于只使用L2正则化;如果l1_ratio为1,则相当于只使用L1正则化;如果l1_ratio在0和1之间,则同时使用L1和L2正则化。
- fit_intercept:是否拟合截距项(偏置)。如果设置为True,则模型会包含一个额外的截距项;如果设置为False,则模型不包含截距项。
- learning_rate:学习率的策略。它决定了模型在训练过程中如何调整权重。SGDRegressor支持多种学习率策略,如“constant”(固定学习率)、“optimal”(根据估计的步长来选择学习率)、“invscaling”(随时间递减的学习率)等。
- eta0:初始学习率。当使用“constant”或“invscaling”学习率策略时,这个参数指定了初始学习率的大小。
- power_t:当使用“invscaling”学习率策略时,这个参数指定了学习率更新的指数。较大的power_t值会导致学习率更快地降低。
- max_iter:最大迭代次数。它限制了模型在训练过程中的迭代次数。当达到最大迭代次数时,模型将停止训练。
- tol:容忍度。当损失函数的值在连续两次迭代之间的变化小于tol时,模型将停止训练。这有助于防止模型在达到最优解之前过早停止训练。
6 线性回归的欠拟合和过拟合优化
6.1 欠拟合
原因:
算法过于简单,学到的特征比较少,
解决方案:
- 添加其他特征
- 添加多项式特征
6.2 过拟合
解决方案:
- 重新清洗数据,对于异常点、数据不纯的地方进行在清洗
- 增加训练的数据量
- 正则化
- 减小特征维度
7 正则化
正则化(Regularization)是机器学习中的一种技术,用于防止模型过拟合。过拟合是指模型在训练数据上表现良好,但在未见过的测试数据上表现较差的情况。正则化通过在损失函数中添加一个与模型复杂度相关的项来实现,这个项通常被称为正则化项或惩罚项。
7.1 L1正则化(Lasso):
在损失函数中添加模型权重(参数)的绝对值之和。
倾向于产生稀疏的权重,即许多权重为零。
适用于特征选择,因为它可以自动将不重要的特征的权重降为零。
公式:
对于L1正则化:
其中,Original Loss
是原始损失函数(如均方误差),w_i
是模型的权重,α
是惩罚系数,用于控制正则化项的强度。
7.2 L2正则化(Ridge Regression 或 Tikhonov Regularization):
在损失函数中添加模型权重(参数)的平方和。
倾向于产生较小的权重,而不是零权重。
它有助于平滑模型,避免过拟合。
对于L2正则化:
其中,Original Loss
是原始损失函数(如均方误差),w_i
是模型的权重,α
是惩罚系数,用于控制正则化项的强度。
惩罚系数 α
是一个超参数,需要通过交叉验证等方法进行调参。较大的 α
值将更加强调正则化项,使得模型更加简单,但也可能导致模型在训练数据上的性能下降(即欠拟合)。较小的 α
值则更加关注原始损失函数,可能导致模型复杂度增加,从而增加过拟合的风险。
在Scikit-learn中,SGDRegressor
和 Ridge
(L2正则化的线性回归)以及 Lasso
(L1正则化的线性回归)等模型都支持正则化。通过调整这些模型的参数,可以有效地控制模型的复杂度,从而防止过拟合。
8 线性回归案例代码实现
# 0 导包
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_absolute_error# 1 准备数据
bos_data = load_boston()
# 2 分割数据集
x_train,x_test,y_train,y_test = train_test_split(bos_data.data,bos_data.target,random_state=22)
# 3 特征预处理-标准化
transfor = StandardScaler()
# 3。1 训练集标准化
x_train = transfor.fit_transform(x_train)
# 3.2 测试集标准化
x_test = transfor.transform(x_test)
# 4 模型训练
# 使用L2正则化线性回归模型
lr = Ridge(alpha=0.1,fit_intercept=True)
# 训练模型
lr.fit(x_train,y_train)
# 打印相关系数和截距
print(lr.coef_)
print(lr.intercept_)
# 5 模型预测
y_predict = lr.predict(x_test)# 6 模型评估-适用MAE评估
print(mean_absolute_error(y_test, y_predict))