线性回归模型是一种比较简单的、容易解释的回归预测方法。在实际应用中,可以用线性回归模型简单判断特征与目标值之间是否存在某种线性相关的关系。若存在,可以用多个线性模型去表示回归值;若不存在,即可以考虑特征与回归值之间的非线性关系(非线性关系可以考虑SVM的核函数映射方式或者神经网络中使用激活函数的方式等,将特征映射到更高维的空间或者表示出非线性的表达式,进行拟合出特征与回归值之间的一种表达形式。这里不做探讨,若有兴趣,请自行查阅相关知识,也可留言,看到即回复。)
1.基本形式
数据集:给定一个由n个属性(或特征),m个样本表示的数据集,其中表示第i个特征,y表示样本值。
线性模型就是一个通过属性的线性组合来进行预测的函数值,即:
(1)
一般向量的表示为:
(2)
其中.
2. 损失函数
线性回归预测,希望预测值与真实值之间的差距越小越好,可以用均方误差来评判模型的预测情况。设置均方误差函数为损失函数:
(3)
基于均方误差最小化进行模型求解参数的方法,称之为“最小化二乘法”。在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧式距离之和最小。
3.参数求解
求解参数“W”和"b"使损失函数最小化的过程,称之为线性回归模型的最下二乘法“参数估计(parameter estimation)” 。损失函数分别就参数“W”和"b"进行求偏导。
(4)
(5)
若该问题为凸优化问题,那么最优点在偏导数为0的点, 既有(4)和(5)为0,求解得到:
(6)
(7)
其中为x的均值。
将上述过程整理为向量形式:
其中,n列表示特征列,m行表示第m个样本,n+1列表示对应的回归值。回归值y可以表示为
于是将式子(3)整理为下式:
(8)
对式子(8)求偏导,并令其得到:
(9)
(10)
用最小二乘法求解参数的过程,涉及计算,当满秩(full-rank matrix)或为正定矩阵(positive definite matrix)时,令式子(9)为0,可得到:
(11)
(12)
此时得到的W估计值是无偏且有效的。线性回归模型为:
(13)
4.一般情况
一般情况下,式子(9)中总不是满秩或者正定矩阵。这种情况下,我们不能再继续使用最小乘估计求解参数的值。常用的解决此类问题的方法有:1)对特征列X或者回归值y进行对数处理,希望经过对数变换后的值,能够满足满秩或者为正定矩阵;2)对损失函数添加正则项L1或者L2,然后使用梯度下降的方法,迭代更新参数,得到损失函数最小得参数。迭代求解参数的过程,并不能得到最优的解,因为此时的估计参数W始终是有偏的。正因为无法得到最优的参数W和最小的损失函数,常采用次优的结果。这时候需要限制迭代次数或者损失函数的阈值,以停止模型一直训练。
对于2),添加正则项L1或者L2的线性回归,分别对应不同的名称:
线性回归添加正则项L1,称之为Lasso回归(Lasso-regression)。python中调用:
#加载Lasso模型算法库
from sklearn.linear_model import Lasso
# 创建Lasso回归模型的对象
reg = Lasso(alpha=0.1)
# 利用训练集训练Lasso回归模型
reg.fit([[0, 0], [1, 1]], [0, 1])
"""
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
normalize=False, positive=False, precompute=False, random_state=None,
selection='cyclic', tol=0.0001, warm_start=False)
"""
# 使用测试集做预测
reg.predict([[1, 1]])
线性回归添加正则项L2,称之为岭回归(Ridge regression)。python中调用:
#加载线性模型算法库
from sklearn.linear_model import Ridge
# 创建岭回归模型的对象
reg = Ridge(alpha=.5)
# 利用训练集训练岭回归模型
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
#输出各个系数
reg.coef_
reg.intercept_
线性回归添加正则项L1和L2,称之为Elastic Net回归。python中调用:
#加载ElasticNet模型算法库
from sklearn.linear_model import ElasticNet
#加载数据集
from sklearn.datasets import make_regression
X, y = make_regression(n_features=2, random_state=0)
#创建ElasticNet回归模型的对象
regr = ElasticNet(random_state=0)
# 利用训练集训练ElasticNet回归模型
regr.fit(X, y)
print(regr.coef_)
print(regr.intercept_)
print(regr.predict([[0, 0]]))
线性回归模型比较简单,限制条件较多,但是却是一个简单容易判断数据与回归值关系的方法。而且很多非线性回归的方法也在此基础上,得到了发展。例如,添加核函数,将特征X映射到更高维的空间,使得在此空间中,特征与回归值之间满足某种线性关系。比较突出的例子为:SVM中添加多项式核函数和高斯核函数,将非线性的问题转化为线性问题进行解决。线性回归,一般可以用于预测粮食产量和价格之间的关系等。
参考文献:
周志华《机器学习》