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的转置,
表示矩阵
的逆矩阵
通过这个方程,我们可以直接算出最优的参数值
- 梯度下降
如果把损失函数比作一座山,那么梯度下降算法,就是通过更新权重参数的方式,一步一步下山,一步一步找损失函数的最小值。
梯度下降公式:
其中是损失函数
α是每次调整的步长,我们称为学习率
讲人话的话,就是新的参数 = 旧参数 - 步长 * 梯度
- 两者对比
正规方程法的优点是可以直接一步到位直接算出最优参数,缺点就是计算量大。并且,如果数据没有逆矩阵,还没办法直接算出来结果。
梯度下降的优点就是使用场景广,大部分情况下都可以使用梯度下降的方法找最优解。
三、回归模型评估方法
| 对比维度 | MAE | MSE | RMSE |
|---|---|---|---|
| 英文全称 | Mean Absolute Error | Mean Squared Error | Root 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)}")