线性回归与梯度下降法

276 阅读7分钟

1线性回归应用场景

  • 房价预测
  • 贷款额度预测
  • 销售额度预测

2什么是线性回归

利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间的关系进行建模。这种方法的核心在于确定变量之间的定量关系,从而可以对因变量进行预测或解释。

线性回归的公式可以表示为:y = w'x + e,其中y是因变量,x是自变量(可以是多个),w'是回归系数向量,e是误差项,通常假设它服从均值为0的正态分布。这个公式描述了因变量y如何随自变量x的变化而变化,其中回归系数w'反映了这种变化的强度和方向。

在线性回归中,根据自变量的数量,可以分为单变量线性回归分析和多元线性回归分析。在单变量线性回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示。而在多元线性回归分析中,则包括两个或两个以上的自变量,且因变量和自变量之间是线性关系。

2什么是线性回归

利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间的关系进行建模。这种方法的核心在于确定变量之间的定量关系,从而可以对因变量进行预测或解释。

线性回归的公式可以表示为:y = w'x + e,其中y是因变量,x是自变量(可以是多个),w'是回归系数向量,e是误差项,通常假设它服从均值为0的正态分布。这个公式描述了因变量y如何随自变量x的变化而变化,其中回归系数w'反映了这种变化的强度和方向。

在线性回归中,根据自变量的数量,可以分为单变量线性回归分析和多元线性回归分析。在单变量线性回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示。而在多元线性回归分析中,则包括两个或两个以上的自变量,且因变量和自变量之间是线性关系

image.png

image.png

3线性回归API

以Python中的scikit-learn库为例,LinearRegression是其中一个用于执行线性回归的类。这个类提供了许多方法和属性,使得用户可以轻松地拟合线性模型、预测新数据以及获取模型的参数。

以下是LinearRegression类的一些主要方法和属性:

  • fit(X, y[, sample_weight]):训练线性模型。X是训练数据的特征,y是对应的目标值。sample_weight是可选参数,用于指定每个样本的权重。
  • predict(X):使用训练好的模型对新的数据X进行预测,并返回预测值。
  • coef_:一个数组,表示线性模型的系数(斜率)。
  • intercept_:线性模型的截距。
  • score(X, y[, sample_weight]):返回模型的R^2得分,即模型对数据的拟合程度。 ``
from sklearn.linear_model import LinearRegression // 引入线性回归模块
# 1.获取数据(x是二维数组,代表一个学生的平时成绩,和期末成绩。y是总成绩,需要算出y与x的线性回归方程)
x = [[80, 86],
     [82, 80],
     [85, 78],
     [90, 90],
     [86, 82],
     [82, 90],
     [78, 80],
     [92, 94]]
y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4]
# 2.模型训练
# 2.1 实例化一个估计器
estimator = LinearRegression()

# 2.2 使用fit方法进行训练
estimator.fit(x, y)
# 打印对应的系数:
print("线性回归的系数是:\n", estimator.coef_)
print('线性回归的拟合程度',estimator.score(x,y))
# 打印的预测结果是:
print("输出预测结果:\n", estimator.predict([[100, 80]]))

image.png

4线性回归的损失和优化

4.1最小二乘法

计算完总损失后,可进一步求出总损失的平均值。求平均值的意义在与:当样本数不同的两个训练集进行对比时,总损失无法准确评估(样本数有差异),此时需要对总损失求平均值,该方法又称为最小二乘法。

 

y(i)为训练样本真实值,^y为线性模型预测值。 如何减少这个损失,使我们的预测更加准确? 我们采用 梯度下降法优化模型,使我们的模型更加接近真实值。

4.2梯度下降

梯度下降法(Gradient Descent)是一种优化算法,用于寻找最小化某个损失函数(或成本函数)的参数值。在机器学习和深度学习的模型中,损失函数用于衡量模型预测的准确性,而梯度下降法则用于通过迭代的方式逐步调整模型的参数,以最小化损失函数,从而提高模型的预测性能。

具体来说,梯度下降法的工作原理如下:

  1. 计算梯度:首先,计算损失函数在当前参数值处的梯度。梯度是一个向量,其方向指向损失函数增长最快的方向。因此,梯度的反方向就是损失函数减小的方向。
  2. 更新参数:然后,根据计算出的梯度,按照一定的学习率(learning rate)更新模型的参数。学习率是一个超参数,用于控制参数更新的步长。过大的学习率可能导致算法在最小值附近震荡而无法收敛,而过小的学习率则可能导致算法收敛速度过慢。
  3. 迭代优化:重复上述步骤,直到损失函数达到一个足够小的值,或者达到预设的最大迭代次数。在每次迭代中,模型都会根据当前损失函数的梯度调整其参数,以逐步逼近损失函数的最小值。

需要注意的是,梯度下降法并不总是能找到全局最小值,特别是在损失函数具有多个局部最小值的情况下。此外,梯度下降法的收敛速度也可能受到损失函数形状、学习率设置以及初始参数值等因素的影响。因此,在实际应用中,可能需要根据具体情况调整算法参数或采用其他优化策略来提高性能。 image.png

4.3梯度下降实例

image.png

image.png

image.png Θ(4)- Θ(3)小于精度0.01,停止迭代

5 skleran中的线性回归梯度下降API

使用SGDRegressor,它是随机梯度下降(Stochastic Gradient Descent, SGD)在回归问题上的一个实现。SGD 是一种迭代优化算法,用于在大型数据集上求解线性回归等问题。 以下是一些关键的参数:

  • loss:损失函数。对于回归问题,通常使用 'squared_loss'(均方误差)。
  • penalty:正则化项的类型,可以是 'l1''l2', 或 'none'。正则化有助于防止过拟合。
  • alpha:正则化强度的倒数。值越大,正则化越强。
  • learning_rate:学习率或学习率策略。可以是 'constant''invscaling''adaptive' 等。
  • eta0:初始学习率。当 learning_rate='constant' 时使用。
  • power_t:学习率衰减的指数,当使用 'invscaling' 学习率策略时。
  • max_iter:最大迭代次数。
  • tol:优化算法的收敛阈值。
  • shuffle:是否在每次迭代时打乱样本。
  • random_state:随机数生成器的种子或 RandomState 实例。

6使用SGDRegressor

from sklearn.linear_model import SGDRegressor  
from sklearn.model_selection import train_test_split  
from sklearn.datasets import make_regression  
from sklearn.metrics import mean_squared_error  
import numpy as np  
  
# 生成一个线性回归问题的模拟数据集  
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=42)  
  
# 将数据集划分为训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  
# 初始化 SGDRegressor 实例  
# 这里我们设置一些参数,但通常你需要通过交叉验证来选择最优参数  
sgd_reg = SGDRegressor(loss='squared_error',  # 损失函数  
                        penalty='l2',           # 正则化项类型  
                        alpha=0.001,            # 正则化强度  
                        learning_rate='invscaling',  # 学习率策略  
                        eta0=0.01,             # 初始学习率  
                        power_t=0.25,           # 学习率衰减的指数  
                        max_iter=1000,          # 最大迭代次数  
                        tol=1e-3,               # 收敛阈值  
                        random_state=42)        # 随机数生成器的种子  
  
# 使用训练数据拟合模型  
sgd_reg.fit(X_train, y_train)  
  
# 使用测试数据进行预测  
y_pred = sgd_reg.predict(X_test)  
  
# 计算均方误差(MSE)作为性能度量  
mse = mean_squared_error(y_test, y_pred)  
print(f"Mean Squared Error: {mse}")  
  
# 输出模型的系数和截距  
print("Coefficients: ", sgd_reg.coef_)  
print("Intercept: ", sgd_reg.intercept_)