1. 概念
线性回归:利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间的关系进行建模的分析方式。
线性回归要求解需要:
- 数据:特征x + 目标y,y连续
- 线性方程式:一元、多元
- 损失函数种类:MAE、MSE、RMSE
- 优化方法:正规方程法(求导、求偏导)、梯度下降法
- 过拟合、欠拟合调整:
- 过拟合:减少特征;增加样本量;L1、L2正则化
- 欠拟合:增加特征
1.1 一元线性回归
1个目标值,1个特征值
公式:,k是权重,b是偏置
1.2 多元线性回归
1个目标值,n个特征值
公式:,
是权重,
是偏置;
,
,
。
2. API
# 包 from sklearn.linear_model import LinearRegression from sklearn.linear_model import SGDRegressor from sklean.metrics import mean_absolute_error, mean_squared_error, root_mean_squared_error # 1. 模型训练(正规方程/梯度下降 二选一) estimator = LinearRegression(fit_intercept = True) # 正规方程 estimator = SGDRegressor(fit_intercept = True, learning_rate = "constant", eta0 = 0.01) # 梯度下降 estimator.fit(x_train,y_train) # 2. 模型预测 y_pre = estimator.predict(x_test) print(f"预测值为:{y_pre}") print(f"权重系数为:{estimator.coef_}") print(f"偏置为:{estimator.intercept_}") # 3. 模型评估 mse = mean_squared_error(y_test, y_pre) mae = mean_absolute_error(y_test, y_pre) rmse = root_mean_squared_error(y_test,y_pre)3. 损失函数
误差=预测值-真实值
损失函数(代价函数/成本函数/目标函数):衡量每个样本预测值与真实值效果的函数。找到损失函数的最小值,就找到了线性回归的最优拟合(得到的权重就是最优解)。
要想一条直线更好地拟合所有点:
- 引入损失函数
- 通过一个优化方法,求
最小值,得到
的最优解
损失函数分类:
- 最小二乘法:误差平方和
- 均方误差(Mean-Square Error, MSE)
- 平均绝对误差(Mean Absolute Error, MAE)
- 均方根误差(Root Mean Absolute Error, RMSE),MSE开根号
4. 优化方法
| 正规方程法 | 梯度下降法 |
|---|---|
|
|
4.1 正规方程法(求导、求偏导)
4.1.1 原理
设线性回归模型:
损失函数(这里用最小二乘损失):
目标:找到使得
最小。
是关于
的二次凸函数,二次项半正定,全局只有一个极小值 = 全局最小值;
- 多元可微凸函数取最小值的充要条件:梯度 = 0 向量;
- 对损失函数求梯度,令梯度等于 0,直接解出最优
,这个方程就是正规方程(Normal Equation)。
损失函数取最小值时的参数解析解:
存在的问题:
- 如果运算量过大,可能造成内存溢出
- 该方法需要假设
的逆矩阵存在,如果不存在(即
不是正定矩阵,即
不是列满秩矩阵,即特征之间存在多重共线性),则存在无穷多组
使得
最小,一般用岭回归加正则项来达成目标。
4.1.2 一元线性回归
将损失函数求导,如
:
对b求偏导:
令:
对k求偏导:
令,带入
:
4.1.3 多元线性回归
4.1.4 API
from sklearn.linear_model import LinearRegression estimator = LinearRegression(fit_intercept=True) # 含偏置,默认True属性:
- LinearRegression.coef_:回归系数
- LinearRegression.intercept_:偏置
4.2 梯度下降法
4.2.1 原理
沿梯度下降的方向求解极小值。
步骤:
- 输入:初始化位置S,每步距离为
(学习率),输出:从S到达山底
- S为任意位置
- 在S环顾四周,如果四周都比S高,则返回S,终止;否则继续下一个步骤
- 在S环顾四周,寻找坡度最抖的方向,令其为x方向
- 沿x方向往下走,长度为
,到达新的位置S
- 重复上述步骤,直到收敛
梯度:
- 单变量函数:梯度是某一点切线斜率(某一点导数),方向为函数增长最快的方向
- 多变量函数:某一个点的偏导,方向为偏导分量的方向
梯度下降:
- 循环迭代求当前点的梯度,更新当前的权重参数。下个点=当前点-学习率*损失函数求偏导:
- 学习率
(步长):一般为0.001~0.01
4.2.2 梯度下降算法分类
- 全梯度下降算法 FGD (Full Gradient Desent)
- 每次迭代时,使用全部样本的梯度值
- 训练速度慢
- 随机梯度下降算法 SGD
- 每次迭代时,随机选择使用1个样本梯度值
- 简单、高效、不稳定
- 小批量梯度下降算法 mini-batch
- 每次迭代时,在m个样本中随机选择使用x个样本梯度值(1<x<m)
- x=1,即为SGD
- x=m,即为FGD
- 结合了FG的心细和SG的胆大,目前使用最多
- 随机平均梯度下降算法 SAG
- 每次迭代时,随机选择1个样本的梯度值和以往样本的梯度值的均值
- 训练初期表现不佳,优化速度慢
4.2.3 单变量梯度下降
4.2.4 多变量梯度下降
数据说明:
- 样本:8条
- 特征:3个,每月工资、存款余额、房产面积
- 标签:1个,授信额度
假设函数:
将b换成,其中
:
其中:,
.
损失函数(最小二乘):
梯度下降公式:
其中,为第j个特征的第s次迭代权重,
为学习率,
为损失函数
对
的偏导数(梯度)。
则更新梯度下降公式为:
设置初始位置(s=0):,
,则:
其中,时:
以此类推,一直算到,即可求出
的值,得到
的第1次迭代位置,然后重复上述步骤,直到收敛,得到最优
。
其他的也是同样的计算方式,最终得到1个权重向量
,求解结束。
4.2.5 API
from sklearn.linear_model import SGDRegressor # 随机梯度下降算法 estimator = SGDRegressor( loss = "squared_loss", # 损失函数类型 fit_intercept = True, # 是否含偏置 learning_rate = "constant", # 学习率策略,默认为常数;也可以不断变小"invscaling" eta0 = 0.01 # 学习率大小 )属性:
- SGDRegressor.coef_:回归系数
- SGDRegressor.intercept_:偏置
5. 线性回归模型评估
衡量预测值与真实值之间的差距。(公式见本文:损失函数)
- 平均绝对误差 MAE
- 均方误差 MSE
- 给出平均误差
- 均方根误差 RMSE
- 计算公式中有平方项,误差可能会被放大,对异常值更敏感
- 一般情况下:MAE<RMSE
- 如果RMSE指标训练地非常低,说明模型对异常点(噪声)的拟合非常好,模型容易过拟合
以上指标值越小模型预测越准确。(一般用MAE、RMSE结合着看)
API:
from sklean.metrics import mean_absolute_error, mean_squared_error, root_mean_squared_error mae = mean_absolute_error(y_test,y_pre) mse = mean_squared_error(y_test,y_pre) rmse = root_mean_squared_error(y_test,y_pre)6. 过拟合、欠拟合
6.1 欠拟合
- 模型在训练集、测试集表现都不好
- 原因:模型过于简单
- 调整:增加特征(组合、泛化、相关性)、增加多项式特征项(二次、三次项),提高模型复杂度
6.1.1 模拟欠拟合
# 模拟欠拟合 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split # 1. 创造数据 np.random.seed(66) x = np.random.uniform(-3,3,size=100) y = 0.5*x**2 + x + 2 + np.random.normal(0,1,size=100) # 2. 数据预处理 X = x.shape(-1,1) # 3. 模型训练 estimator = LinearRegression() estimator.fit(X,y) # 4. 模型预测 y_pre = estimator.predict(X) # 5. 模型评估 mse = mean_squared_error(y, y_pre) print(f"均方误差:{mse}") # 6. 画图 plt.scatter(x,y) plt.plot(x,y_pre,color='red') plt.show()6.2 过拟合
- 模型在训练集表现好,测试集表现不好
- 原因:模型过于复杂,存在过多噪声
- 调整:重新清洗数据;减少特征;增加数据量;L1、L2正则化
- 正则化:模型训练时,数据中有些特征影响模型复杂度、或某个特征的异常值较多,所以尽量要较少这个特征的影响(甚至删除这个特征)
- 在损失函数中增加正则化项,可以消除异常点带来的权重值w过大/过小
6.2.1 L1正则化
其中,为惩罚系数,该值越大对
的惩罚力度就越大,该特征对整体的影响就越小。
- L1正则化会使权重趋向于0(可以等于0,一般会将高次方项系数变为0),使得某些特征失效,达到特征筛选的目的。
- L1正则化的线性回归模型是Lasso 回归。
from sklearn.linear_model import Lasso estimator = Lasso(alpha=0.01)6.2.2 L2正则化
其中,为惩罚系数,该值越大对
的惩罚力度就越大,该特征对整体的影响就越小。
- L2正则化会使权重趋向于0(一般不等于0,对高次方项系数影响较大),使得某些特征影响程度小,达到特征筛选的目的。
- L2正则化的线性回归模型是岭回归。
- 实际工作中,一般选择L2正则化
from sklearn.linear_model import Ridge estimator = Ridge(alpha=0.01)6.2.3 模拟过拟合
# 模拟过拟合 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split # 1. 创造数据 np.random.seed(66) x = np.random.uniform(-3,3,size=100) y = 0.5*x**2 + x + 2 + np.random.normal(0,1,size=100) # 2. 数据预处理 X = x.shape(-1,1) X2 = np.hstack([X, X**2,X**3,X**4,X**5,X**6,X**7,X**8,X**9,X**10]) # 3. 模型训练(下面estimator三选一) estimator = LinearRegression() # 正规方程法 estimator = Lasso(alpha=0.01) # L1正则化 estimator = Ridge(alpha=0.01) # L2正则化 estimator.fit(X2,y) # 4. 模型预测 y_pre = estimator.predict(X3) # 5. 模型评估 mse = mean_squared_error(y, y_pre) print(f"均方误差:{mse}") # 6. 画图 plt.scatter(x,y) plt.plot(np.sort(x),y_pre[np.argsort(x)],color='r') # x,y数据要排序 plt.show()案例汇总
波士顿房价预测
补充知识
A 标量、向量、矩阵、张量
- 标量scalar:一个独立存在的数,只有大小,没有方向
- 向量vector:一列顺序排列的元素,有大小有方向,默认是列向量
- 张三的数理化成绩:
- 张三的数理化成绩:
- 矩阵matrix:二维数组,pd.DataFrame
- 张三、李四的数理化成绩:
- 张三、李四的数理化成绩:
- 张量Tensor:高维数组,Numpy ndarray,基于向量和矩阵的推广
:2个3*4矩阵or3个2*4矩阵or4个2*3矩阵
A1 向量运算
- 向量的大小:向量的模。如向量(1,2,3),模长=
- 向量转置:
,
- 向量的基运算:
A2 范数Norm
是一个数学概念,具有长度的意义
对于向量:
- L1范数:向量中各个元素绝对值之和
- L2范数:向量的模,各个元素平方和开平方
- Lp范数:向量中每个元素p幂求和开p次根
A3 矩阵
- 矩阵转置:
,k为1个常数
- 矩阵加法:对应元素相加
- 矩阵乘法:A列数=B行数才能相乘,即
,
这样才能相乘,相乘后为
矩阵。
- 不满足交换律:
- 满足结合率:
- 矩阵与单位阵相乘等于它本身:
- 若
,则B为A的逆矩阵,记为
- 不满足交换律:
如:,
,
- 方阵:行数=列数,
为方阵
- 对称方阵:
- 对称方阵:
- 单位阵:方阵,对角线为1,其余为0
B 导数
B1 导数概念
函数某一个点求切线就是导数。(瞬时速度变化率)
导数=0的位置是函数的极值点
偏导:如函数对
的偏导记为
,将
视为常数,对
求导数。各分量上求偏导,形成一个向量
,即为z的导数。