当
XTX
可逆,线性回归的参数
θ
的解析解可表示为
为了保证 XTX 可逆,一般会加入 λ 扰动 ① ,保证回归公式一定有意义,加入 λ 扰动后的解析式如下, I 表示单位阵:
加入
λ
扰动,也是为了防止模型过拟合(over-fitting)
②
的一种方式。
解决过拟合问题最常用的方法有正则化与交叉验证。
正则化
模型的正则化(regularization)表示在目标函数中增加度量线性回归复杂度的惩罚因子,在所有可能选择的模型中,能够很好的解释已知数据且简单的才是最好的模型,正则化的作用政在于选择关于训练集的平均损失与模型复杂度同时较小的模型。
线性回归常见的正则项取法有参数向量的 L1 范式(LASSO), L2 范式(Ridge)或将 L1 范式和 L2 范式做一个加权(Elastic Net)。
如果给定一个指标的话,比如R方损失、均方误差等,Ridge的效果一般比LASSO性能指标更好,LASSO的好处在于可以做稀疏化处理,更适合做特征选择。Elastic Net则兼顾二者的优点。
λ
为调节训练样本平均损失与模型复杂度之间关系的系数 ,
ρ
为调节
L1
正则与
L2
正则之间关系的系数,这两个超参数一般在训练数据前给定取值范围,通过交叉验证选择最优参数。Ridge回归的参数解析解即为:
交叉验证
交叉验证(cross validation)的基本思想是重复使用数据
如果样本充足,可随机的将数据集分为3种,训练集、验证集和测试集,训练集用于训练模型,验证集用于模型的选择,测试集用于最终对学习方法的评估,在学习到不同复杂度的模型中,选择在验证集预测误差最小的模型
当数据不充足,将数据切分成训练集与测试集,在训练集上训练模型,在测试集上评价各个模型的测试误差,选出测试误差最小的模型。
交叉验证中最常用的是S折交叉验证,随机的将数据切分为
S
个互不相交的大小相同的子集,留一个子集做测试集,其余做训练集,将这一过程对可能的S种选择重复进行,最后选出
交叉验证多用于模型的调参环节,选择在训练集中预测效果最好的超参数,利用python实现也很方便,如下:
model = Lasso()
#sklearn库中已实现,import后可之间调用
alpha_can = np.logspace(-3, 2, 10)
#给定0.001~100之间等比递增的10个候选alpha值
lasso_model = GridSearchCV(model, param_grid={'alpha':alpha_can}, cv=5)
#网格搜索最优超参数,参数为alpha的5折交叉验证,默认是3折。
附录
①对方阵A与非零向量
u
,若有
所以对任意实数 λ>0 , XTX+λI 正定,从而可逆。
②过拟合:当学习时选择的模型所包含的参数过多,有时会出现模型对已知带标签的数据预测的很好,但是对未知数据预测的很差。相应的欠拟合表示模型在训练集的拟合效果就不好。