理论
问题
与一元线性回归基本类似,只是对变量进行了扩充,在表达式向量化之后可写成与一元线性回归相同的形式。
由于所含参数、下标(分量)较多,首先得形式化定义问题。
下式为多元线性回归数学模型,式中分别为自变量(特征),参数(权重)的向量值,(设向量长度为
):
%5ET%3B%5C%20w%20%3D%20(w_i%2C%20w_2%2C%5Ccdots%2Cw_m)%5ET%0A#card=math&code=x%3D%EF%BC%88x_1%2Cx_2%2C%5Ccdots%2Cx_m%29%5ET%3B%5C%20w%20%3D%20%28w_i%2C%20w_2%2C%5Ccdots%2Cw_m%29%5ET%0A)
设给定样本组数为,对于自变量和因变量的随机变量,设为
,单个样本为:
%2Ci%3D1%2C%5Ccdots%2Cn%0A#card=math&code=%28X_i%2C%20Y_i%29%2Ci%3D1%2C%5Ccdots%2Cn%0A)
单个样本的单个分量为(第个样本的第
个分量,之后的式子中
表示样本序号,
表示单个样本的分量值序号,
为单分量数据,即
):
损失(误差)函数定义如下:
%5E2%0A#card=math&code=L%20%3D%20%5Cfrac%7B1%7D%7B2%7DMSE%20%3D%20%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%28Y_i-X_iw%5ET%29%5E2%0A)
对上式子损失进行向量化(向量化思维非常重要,能极大简单求解过程,最右侧为范数):
%5ET(Y-Xw)%3D%5Cfrac%7B1%7D%7B2%7D%20%7C%7CY-Xa%7C%7C_2%0A#card=math&code=L%3D%5Cfrac%7B1%7D%7B2%7D%28Y-Xw%29%5ET%28Y-Xw%29%3D%5Cfrac%7B1%7D%7B2%7D%20%7C%7CY-Xa%7C%7C_2%0A)
注:
- 损失函数乘上二分之一没有特别意义,只是为了求导之后没有常系数
的完整矩阵(向量)结构如下:
%0A#card=math&code=Y%20%3D%20%28Y_1%2CY_2%2C%20%5Ccdots%2C%20Y_n%29%0A)
求解
对损失函数求导,令偏导为,解参数
:
%20%3D0%0A#card=math&code=%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20w%7D%20%3D%20X%5ET%28Y-Xw%29%20%3D0%0A)
%5E%7B-1%7DX%5ETY%0A#card=math&code=w%20%3D%20%28X%5ETX%29%5E%7B-1%7DX%5ETY%0A)
注:也可通过梯度下降进行求解
引伸(也可称为正则化手段)
Ridge Regression(岭回归、脊回归)
上面的求解结果中,X^TX可能不可逆,解决办法,给原始损失函数加上一个惩罚项(二范数):
%20%2B%20%5Cfrac%7B1%7D%7B2%7D%5Clambda%20w%5ETw%0A#card=math&code=L%20%3D%20%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%28Y_i-X_i%5ETw%29%20%2B%20%5Cfrac%7B1%7D%7B2%7D%5Clambda%20w%5ETw%0A)
则求偏导解得:
%5E%7B-1%7DXY%0A#card=math&code=w%20%3D%20%28X%5ETX%2B%5Clambda%20I_m%29%5E%7B-1%7DXY%0A)
其中X^TX为半正定矩阵, \lambda I_m为正定矩阵,两者相加为正定矩阵,可逆
Lasso
损失函数加上一范数(绝对值)的惩罚项
%2B%5Cfrac%7B1%7D%7B2%7D%5Clambda%20%7C%7Ca%7C%7C1%0A#card=math&code=L%20%3D%20%5Cfrac%7B1%7D%7B2%7D%5Csum%7Bi%3D1%7D%5En%28Y_i%20-%20X_i%5ETw%29%2B%5Cfrac%7B1%7D%7B2%7D%5Clambda%20%7C%7Ca%7C%7C_1%0A)
此时,所得参数的部分分量值为
,带来的好处:能消掉部分无关特征
Elastic Net
惩罚项既有一范数又有二范数(两者之和)。一范数能带来稀疏,二范数能带来计算便利和求导。此处知识点待了解。
实践
操作基本同一元线性回归,同一个API,毕竟LinearRegression
就是针对所有线性回归情况,样本读取和数据拆分略过。调用、fit、预测如下:
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, Y_train)
Y_pred = regressor.predict(X_test)