本文是一篇以算法基本原理的基本介绍以及python代码实现为主,涵盖少量数学推导的极简化机器学习整理笔记,适合扫盲。
算法背景:解决回归问题的经典模型,可拓展为岭回归、lasso回归,广义线性模型。
自变量非随机、互相独立;误差独立同分布于均值为0的正态分布。
不妨设线性回归方程为:
Y = X T β Y = X^T \beta \\ Y=XTβ
其中 Y = ( y 1 , y 2 , … , y N ) ′ Y=(y_1, y_2,\dots,y_N)' Y=(y1,y2,…,yN)′ , X X X 为 p × N p\times N p×N 矩阵,系数 β = ( β 1 , β 1 , … , β p ) ′ \beta = (\beta_1,\beta_1,\dots,\beta_p)' β=(β1,β1,…,βp)′ .
该方程的损失函数可表示为:
L = ( Y − X ′ β ) ′ ( Y − X ′ β ) = Y ′ Y − Y ′ X ′ β − β ′ X Y + β ′ X X ′ β \begin{aligned} L &= (Y-X' \beta)' (Y-X' \beta) \\ &= Y' Y - Y'X' \beta - \beta' X Y + \beta' X X' \beta \\ \end{aligned} L=(Y−X′β)′(Y−X′β)=Y′Y−Y′X′β−β′XY+β′XX′β
该损失函数可以由最小二乘法求解得到:
β ^ = arg min L ⇒ ∂ L ∂ β ^ = 0 ⇒ − 2 X Y + 2 X X ′ β ^ = 0 ⇒ β ^ = ( X X ′ ) − 1 X Y \hat\beta = \arg \min L \\ \Rightarrow \frac {\partial L}{\partial \hat \beta} = 0 \\ \Rightarrow -2XY + 2XX' \hat\beta = 0 \\ \Rightarrow \hat\beta = (XX')^{-1}XY β^=argminL⇒∂β^∂L=0⇒−2XY+2XX′β^=0⇒β^=(XX′)−1XY
【注意】在 X X ′ XX' XX′ 满秩即可逆时,上述方程有唯一解,否则(维度高、样本少)存在多组使得损失函数达到最小的解,需要引入正则项选择最优解。
线代常用求导公式:
(1)
∂ ( x ′ a ) ∂ x = ∂ ( x ′ a ) ′ ∂ x = ∂ ( a ′ x ) ∂ x = a \frac {\partial (x'a)}{\partial x} = \frac {\partial (x'a)'}{\partial x} = \frac {\partial (a'x)}{\partial x} = a ∂x∂(x′a)=∂x∂(x′a)′=∂x∂(a′x)=a
(2)
∂ ( x ′ x ) ∂ x = 2 x \frac {\partial (x'x)}{\partial x} = 2x ∂x∂(x′x)=2x
(3)
∂ ( x ′ A x ) ∂ x = A x + A ′ x \frac {\partial (x'Ax)}{\partial x} = Ax + A'x ∂x∂(x′Ax)=Ax+A′x
决定系数 R 2 R^2 R2
R 2 = 1 − ∑ ( y i − y ^ i ) 2 ∑ ( y i − y ˉ ) 2 R^2=1-\frac {\sum(y_i-\hat y_i)^2}{\sum(y_i-\bar y)^2} R2=1−∑(yi−yˉ)2∑(yi−y^i)2
对于上述公式等号右边第二项,分母分子同除以N,可以视为MSE/ D(Y) ,分母为Y的方差可以视为对预测误差的惩罚。
R 2 R^2 R2 衡量了X和Y之间的线性关系,越接近0越弱,越接近1越强。
均方误差 MSE
M S E = 1 N ∑ ( y i − y ^ i ) 2 MSE=\frac 1N \sum(y_i-\hat y_i)^2 MSE=N1∑(yi−y^i)2
常用于回归问题,作为评价指标,量纲为误差的平方,对度量、异常值敏感。
RMSE与MAE
R M S E = M S E M A E = 1 N ∑ ∣ y i − y ^ i ∣ RMSE=\sqrt {MSE}\\ MAE=\frac 1N\sum |y_i-\hat y_i| RMSE=MSEMAE=N1∑∣yi−y^i∣
量纲相同,适合对量纲、异常值不敏感的数据。
可以通过假设检验的方法,检验变量是否显著(当系数为0时,该变量则无法对y的取值造成影响。):
H 0 : β i = 0 , H 1 : β i ≠ 0 H_0:\beta_i = 0, \quad H_1:\beta_i\ne0 H0:βi=0,H1:βi=0
通常使用t统计量检验求解该假设检验:
t i = β ^ i SE ( β ^ i ) t_i=\frac{\hat \beta_i}{\text{SE}(\hat \beta_i)} ti=SE(β^i)β^i
其中 SE ( β ^ i ) 2 = σ 2 / ∑ ( x i − x ˉ ) 2 \text{SE}(\hat \beta_i)^2 = \sigma^2/\sum(x_i-\bar x)^2 SE(β^i)2=σ2/∑(xi−xˉ)2.
计算得到 t i t_i ti 后根据自由度 N − 1 N-1 N−1 使用双尾检验求得 p p p 值,当 p p p 值小于显著性水平时,则认为该变量显著。
p = 2 P ( T n − 1 ≥ ∣ t i ∣ ) p=2P(T_{n-1}\ge |t_i|) p=2P(Tn−1≥∣ti∣)
多重共线性指的是自变量中存在两个或多个自变量高度相关,造成的后果是:
回归系数的正负号可能会产生倒置。在经济学中一个回归系数的正负号往往就意味着完全相反的经济意义,如果出现这样的情况,就会使得决策者做出错误的决策方向。
回归分析|笔记整理(9)——带约束的线性回归,多重共线性 - 学弱猹的文章 - 知乎 https://zhuanlan.zhihu.com/p/50792150
由于共线性降低了回归系数估计的准确性,它会导致 β ^ \hat\beta β^ 的标准误变大,从而导致 t 统计量下降,使得在显著性检验中某个变量被检验出显著的概率减小了。
【发觉多重共线性的常用方法】:
相关系数矩阵,相关系数高的两个,或多个变量可能存在多重共线性;
方差膨胀因子 :
V I F ( β j ) = 1 1 − R X j 2 VIF(\beta_j)=\frac 1{1-R^2_{X_j}} VIF(βj)=1−RXj21
其中 R X j 2 R^2_{X_j} RXj2 为 X j X_j Xj 对剩余自变量的决定系数,一般地VIF大于5或10,则认为存在多重共线性。
【解决多重共线性办法】:
方便起见,使用sklearn.datasets自带的boston数据集模拟回归问题。
import numpy as np
from sklearn.datasets import load_boston
# 读取boston数据
X,y = load_boston(return_X_y=True)
# 添加偏置项
X = np.concatenate((np.ones(X.shape[0]).reshape((-1,1)), X), axis=1)
# 计算系数
beta = np.matrix(X.T@X).I @ X.T @ y.T
# 拟合线性模型
y_hat = np.array(beta @ X.T)[0]
# 计算mse
print('mse:', np.mean((y-y_hat)**2))
# mse: 21.894831181729206
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 使用sklearn训练模型
lr = LinearRegression().fit(X,y)
# 拟合模型并计算mse
print('mse:', mean_squared_error(lr.predict(X), y))
# mse: 21.894831181729206
西瓜书、《统计学习导论基于R应用》、概率论与数理统计教材、https://www.zhihu.com/column/c_119426147 学弱猹的知乎专栏。