day19_线性回归

📅 2026/7/5 3:10:20 👁️ 阅读次数 📝 编程学习
day19_线性回归

一、线性回归简介

1.定义

线性回归是一种用于回归任务的监督学习算法,用于表示标签与一个或多个特征之间的线性关系。

2.分类

  • 一元线性回归

公式:

目标值只与一个特征有关系,比如用身高来预测体重

  • 多元线性回归

公式:

目标值同时与多个特征有关系,比如用多个因素预测房价

二、线性回归问题求解

1.损失函数

在我们训练一个模型时,为了评估该模型的效果,我们需要一个评判标准来辅助我们判断。

  • 误差概念

我们用预测值y - 真实值y,就可以简单的计算出误差

  • 损失函数

损失函数就是用来衡量每个样本预测值和真实值效果的函数,常见的损失函数有以下几种

1)最小二乘法:误差平方和

2)均方误差:误差平方和取平均值

3)平均绝对误差:误差绝对值和取平均值

2.导数与矩阵

  • 导数

导数是微积分的核心概念,描述函数在某一点的瞬时变化率。

求导的本质,是看自变量 x 增加一个极小的增量后,函数值的变化量的比值,这个结果就是函数在该点的导数,几何意义是该点切线的斜率。

举个例子,设函数

此时,当趋近于0时,可以舍掉,因此最终导数的结果为

也就是说,假设x=1时,此时该位置的斜率=2*1=2。

那么,为什么我们要学习导数呢?

因为通过以上的推导,我们发现了一个导数的性质:

在函数可导的区间内

:x变大时,y随之变大(函数单调递增)

:x变大时,y反而变小(函数单调递减)

:该点函数不增也不减

也就是说,只要通过求导,我们就能知道,如果想要降低损失函数的值,针对某个参数w,我们需要调大还是调小。

  • 偏导数

以上的案例只包含一个变量x。然而,在实际应用中,我们往往会涉及到多个变量,这种我们成为多元函数。

此时,我们每次只把一个变量当做变量,其余变量当做常数来求导。这种导数,我们可以称为偏导数。

以二元导数为例:

对x的偏导数记作,表示当y固定时,f关于x的变化率。

对y的偏导数记作,表示当x固定时,f关于y的变化率

  • 矩阵

矩阵的相关知识比较多,没有办法详细展开讲,这里只能提一下公式里涉及到的部分

1)矩阵的转置

矩阵的转置就是将元素的行列对调,通过符号T来表示

2)矩阵的乘法(符号@)

两个矩阵相乘,矩阵A的列数必须与矩阵B的行数相等,相乘出来的矩阵行数是矩阵A的行数,矩阵B的列数。

3)单位阵

一种特殊的对角方阵,用符号E或I表示。特点是主对角线为1,其他的元素均为0

4)矩阵的逆

假设矩阵A与矩阵B,如果A@B = I单位矩阵,则B为A的逆矩阵,记作

3.主流的两类求解方法

  • 正规方程法

对于一组训练样本(X, y),其中X是一个m*(n+1)的矩阵,m是样本数量,n是特征数量,额外的一列用于偏置b。y是一个m维向量,用来表示目标值,此时正规方程可以形式化为:

表示矩阵X的转置,表示矩阵的逆矩阵

通过这个方程,我们可以直接算出最优的参数值

  • 梯度下降

如果把损失函数比作一座山,那么梯度下降算法,就是通过更新权重参数的方式,一步一步下山,一步一步找损失函数的最小值。

梯度下降公式:

其中是损失函数

α是每次调整的步长,我们称为学习率

讲人话的话,就是新的参数 = 旧参数 - 步长 * 梯度

  • 两者对比

正规方程法的优点是可以直接一步到位直接算出最优参数,缺点就是计算量大。并且,如果数据没有逆矩阵,还没办法直接算出来结果。

梯度下降的优点就是使用场景广,大部分情况下都可以使用梯度下降的方法找最优解。

三、回归模型评估方法

对比维度MAEMSERMSE
英文全称Mean Absolute ErrorMean Squared ErrorRoot Mean Squared Error
中文名称平均绝对误差均方误差均方根误差
计算公式
量纲关系与原始数据量纲一致量纲为原始数据的平方与原始数据量纲一致
异常值敏感性低,对异常值鲁棒性强高,平方会大幅放大异常值影响高,继承 MSE 对异常值的敏感性
数值直观性强,可直接理解为平均误差弱,平方值无直接业务含义强,误差大小可直接对标原始数据
优化特性导数不连续,梯度恒定导数连续,优化求解方便导数连续,优化性质同 MSE
核心优点鲁棒、结果直观、不受极端值过度影响数学性质友好,常用于模型损失函数兼顾优化便利性与直观性
核心缺点梯度无自适应,部分优化场景不便严重放大异常值,量纲不统一对异常值敏感,计算略复杂
典型适用场景数据含较多异常值、需稳健评估线性回归等模型默认损失函数主流回归模型效果评估、业务汇报

四、实操代码

from sklearn.linear_model import LinearRegression, SGDRegressor from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error, mean_absolute_error, root_mean_squared_error import pandas as pd import numpy as np # 1 获取数据 data_url = "http://lib.stat.cmu.edu/datasets/boston" raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None) data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) target = raw_df.values[1::2, 2] # 2 数据预处理 X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=42) # 3 特征工程 # 标准化 transfer = StandardScaler() x_train = transfer.fit_transform(X_train) x_test = transfer.transform(X_test) # 4 模型选择 lr_est = LinearRegression(fit_intercept=True) sgd_est = SGDRegressor(fit_intercept=True, max_iter=1000, loss='squared_error', eta0=0.01, random_state=42) # 5 模型训练 lr_est.fit(x_train, y_train) sgd_est.fit(x_train, y_train) # 6 模型评估 # 6-1 先预测再评估 y_predict_lr = lr_est.predict(x_test) y_predict_sgd = sgd_est.predict(x_test) # 6-2 score评估 print(f"score评估:{lr_est.score(x_test, y_test)}") print(f"score评估:{sgd_est.score(x_test, y_test)}") # 6-3 均方误差 print(f"均方误差:{mean_squared_error(y_test, y_predict_lr)}") print(f"均方误差:{mean_squared_error(y_test, y_predict_sgd)}") # 6-4 平均绝对误差 print(f"平均绝对误差:{mean_absolute_error(y_test, y_predict_lr)}") print(f"平均绝对误差:{mean_absolute_error(y_test, y_predict_sgd)}") # 6-5 均方根误差 print(f"均方根误差:{root_mean_squared_error(y_test, y_predict_lr)}") print(f"均方根误差:{root_mean_squared_error(y_test, y_predict_sgd)}")