【轮子】带约束的岭回归



2019年10月19日    Author:Guofei

文章归类: 开源    文章编号:

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2019/10/19/constrained_regression.html


前言

1. 为何是岭回归

实战中,有可能碰见这种情况,几个数据特征是相关的。如果不使用二阶惩罚项,小属性趋势容易“叠加”到大属性上,从而小属性完全失效。
例如,要做一个手机的价格的预测模型,CPU和内存很可能是高度相关的。普通的线性回归容易把价格“归类”到某一个属性上。

2. 为何带约束

实战中,往往碰到这种情况,数据中的长尾属性很多。例如,某些属性是稀有属性,涉及到的记录数比较少。
尽管总的数据量很大,但稀有属性的数据量却可能不大。
因此需要人为给定一些排序(所谓的先验专家知识)

3. 与其他模型的对比

  • 线性模型:训练集上优秀,测试集上极差,因为过拟合现象。
  • Lasso:训练集测试集均好于此模型,但一方面对稀有属性过拟合,另一方面不符合业务认知。

造轮子

带约束的岭回归

$C=\mid\mid Xw-y\mid\mid_2^2+\alpha \mid\mid w\mid\mid_2^2$
s.t.$w\in \Sigma$

下面把这个最优化问题转化为二次规划问题

1. 损失函数部分

损失函数是 $J=(\hat Y-Y)^T(\hat Y-Y)+\alpha w^Tw$

先看第一项: $(\hat Y-Y)^T(\hat Y-Y)$ $=\hat Y^T \hat Y-\hat Y^TY-Y^T\hat Y+Y^TY$(矩阵乘积结合律) $=\hat Y^T \hat Y-\hat Y^TY-\hat Y^T Y+Y^TY$(因为是1*1矩阵,所以可以随意转置) $=\hat Y^T \hat Y-2 Y^T \hat Y+Y^TY$

再看第二项: $\alpha w^Tw=\alpha w^T I w$(其中$I$表示单位矩阵:对角线全为1的对角阵)

两项相加,并且考虑到 $Y^TY$ 是常数,在最优化中不考虑。
$J=\hat Y^T \hat Y-2 Y^T \hat Y+\alpha w^T I w$ $=w^TX^TXw-2Y^TXw+\alpha w^T Iw$ $=w^T(X^TX+\alpha I)w -2 (Y^TX)w$ $=2[0.5w^T(X^TX+\alpha I)w -(Y^TX)w]$(这就化为了二次规划的标准形式)

令$p=X^TX+\alpha I,q^T=-Y^Tx$, 得到二次型的标准形式: $\min\limits_w (1/2)w^T p w+q^Tw$

2. 约束部分

约束部分就按照标准形式写就行了,不需要公式转化。

3. 代码

alpha=0.1 # l2范数前面的系数。
from cvxopt import matrix, solvers
X, y = matrix(X), matrix(y)

# 最优化目标部分:
I = matrix(np.eye(num_features))
P = X.T * X + alpha * I
q = (-1.0 * y.T * X).T # 因为标准型输入的是q.T,所以还需要一次转置

# 约束部分:(Gw<h)
G = matrix(g).T # 注意一下,这里的g是list,需要转置。如果g是np.array,就不需要。
h = matrix([-0.01] * G.size[0])  # 这里按照类似“小于即可”,“小0.01”等实际需求去自定义
# A,b 等号约束同理

sv = solvers.qp(p, q, G, h)
sv['x'] # 解出系数

您的支持将鼓励我继续创作!