sklearn - 岭回归(Ridge)和套索回归(Lasso)

一: 拟合

(一): 过拟合与欠拟合

机器学习中一个重要的话题便是模型的泛化能力,泛化能力强的模型才是好模型,对于训练好的模型,若在训练集表现差,不必说在测试集表现同样会很差,这可能是欠拟合导致;若模型在训练集表现非常好,却在测试集上差强人意,则这便是过拟合导致的; 过拟合与欠拟合也可以用 Bias 与 Variance 的角度来解释,欠拟合会导致高 Bias; 过拟合会导致高 Variance ,所以模型需要在 Bias 与 Variance 之间做出一个权衡

Bias 即为模型的期望输出与其真实输出之间的差异

Variance 刻画了不同训练集得到的模型的输出与这些模型期望输出的差异

一般在模型效果差的第一个想法是增多数据,其实增多数据并不一定会有更好的结果,因为欠拟合时增多数据往往导致效果更差,而过拟合时增多数据会导致 Gap 的减小,效果不会好太多,所以当模型效果很差时,应该检查模型是否处于欠拟合或者过拟合的状态,而不要一味的增多数据量,关于过拟合与欠拟合,这里给出几个解决方法。

(二): 常用解决办法

(1)解决欠拟合的方法:

1、增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间;

2、尝试非线性模型,比如核SVM 、决策树、DNN等模型;

3、如果有正则项可以较小正则项参数 \lambda;

4、Boosting ,Boosting 往往会有较小的 Bias,比如 Gradient Boosting 等.

(2)解决过拟合的方法:

1、交叉检验,通过交叉检验得到较优的模型参数;

2、特征选择,减少特征数或使用较少的特征组合,对于按区间离散化的特征,增大划分的区间;

3、正则化,常用的有 L1、L2 正则。而且 L1正则还可以自动进行特征选择;

4、如果有正则项则可以考虑增大正则项参数 lambda;

5、增加训练数据可以有限的避免过拟合;

6、Bagging ,将多个弱学习器Bagging 一下效果会好很多,比如随机森林等.

二: Ridge回归 - 岭回归

1: Ridge回归 - 梯度下降(在线性回归后加上L2正则项-解决过拟合问题)

损失函数:
J(w) = \min\limits_w||Xw-y||_2^2 + \alpha||w||_2^2

\frac{1}{m}表示m个样本求平均:
J(w) = \frac{1}{m}\sum_{i=1}^m(||X_iw-y_i||_2^2 + \alpha||w||_2^2)

J(w) = \frac{1}{m}[(Xw-y)^T(Xw-y)+\alpha w^Tw]

求解梯度(导数):
J'(w) = \frac{2}{m}[X^T(Xw-y)+\alpha w]

\nabla_wJ(w) = \frac{2}{m} [X^T(Xw - y) +\alpha w]

更新w:
w = w-\epsilon \nabla_wJ(w)

w = w -\frac{2}{m}\epsilon[X^T(Xw-y)+\alpha w]

w = w -\frac{2\epsilon}{m} X^T(Xw-y)-\frac{2\alpha\epsilon}{m} w

w = [w -\frac{2\epsilon}{m} X^T(Xw-y)]-\frac{2\alpha\epsilon}{m} w

如上公式, 中括号内的公式是线性回归的更新规则, 也就是说岭回归就是在 线性回归的基础上多减了一项,\frac{2\alpha\epsilon}{m} w 其中:

\alpha >= 0缩放强度

\epsilon>=0步幅

m>0样本数量

当w是<font color = red>正数</font>时:\frac{2\epsilon\alpha}{m}w 为正数,此时岭回归就相当于在线性回归的基础上减去一个正数, 所以系数w变小

当w是负数时:\frac{2\epsilon\alpha}{m}w 为负数,此时岭回归就相当于在线性回归的基础上减去一个负数, 所以系数w的绝对值变小

正则项:w变小的好处:防止过拟合

岭回归适用范围:

方程完全共线性(方程内有方程是其他方程的倍数,相当于重复方程):

  • x+ 2y + 22 = 9
  • 2x +4y + 42 = 18

岭回归适用于数据中存在共线性的情况(非满秩矩阵)

2: Ridge回归正规方程推导:

损失函数:
J(w) = \min\limits_w||Xw-y||_2^2 + \alpha||w||_2^2

J(w)=(Xw-y)^T(Xw-y)+\alpha w^Tw

求导:
\nabla_wJ(w)=2X^TXw-2X^Ty+2\alpha w
令导数为0:
2X^TXw-2X^Ty+2\alpha w=0

X^TXw-X^Ty+\alpha Iw=0

(X^TX+\alpha I)w-X^Ty=0

(X^TX+\alpha I)w=X^Ty

(X^TX+\alpha I)^{-1}(X^TX+\alpha I)w=(X^TX+\alpha I)^{-1}X^Ty

推导得出w:
w=(X^TX+\alpha I)^{-1}X^Ty

3: Ridge回归和线性回归对比

import numpy as np
from sklearn.linear_model import LinearRegression, Ridge, Lasso
# 将数据一分为二
from sklearn.model_selection import train_test_split
# 均方误差
from sklearn.metrics import mean_squared_error
import pandas as pd


# 加载数据
# 加载训练数据
# train = pd.read_table('./zhengqi_train.txt') 和下面一行的效果相同
train = pd.read_csv('./zhengqi_train.txt', sep = '\t')
train
# 加载测试数据
test = pd.read_table('./zhengqi_test.txt')
test


# 将训练数据分乘特征值和目标值
# 特征, 影响目标值的因素
X = train.iloc[:, :-1]
# 目标值
y = train['target']

# 算法评估, 将上面的数据分成两份,一部分用来训练, 一部分用来测试
X_train, X_validation, y_train, y_validation = train_test_split(X, y, test_size = 0.2)


# 使用普通线性回归模型
linear = LinearRegression()
linear.fit(X_train, y_train)
y_ = linear.predict(X_validation)
mean_squared_error(y_validation,y_)   # 均方误差
'''0.11713370444738197'''

# 使用线性模型预测测试数据
y_commit = linear.predict(test)
# 保存数据到本地
s = pd.Series(y_commit)
s.to_csv('./linear_result.txt', index=False, header = False)


# 使用岭回归模型
ridge = Ridge(alpha=256)   # alpha值
ridge.fit(X_train, y_train)
y_ = ridge.predict(X_validation)
mean_squared_error(y_validation,y_)
'''0.13427749653218798'''

y_commit = ridge.predict(test)
pd.Series(y_commit).to_csv('./ridge_result.txt', index=False, header = False)

将生成的数据上传到阿里天池,与实际数据对比,计算均方误差时, 使用岭回归模型得到的数据比使用线性回归模型得到的数据的均方误差要小,说明对该组数据,岭回归效果更好

三: lasso回归 - 套索回归

1: lasso回归 - 梯度下降(在线性回归后加上L1正则项-解决过拟合问题)

罗斯回归方程:
\min\limits_w \frac{1}{2n_{samples}}||Xw-y||_2^2+\alpha ||w||_1
方程转换:
J(w)=||Xw-y||_2^2+\alpha ||w||_1
向量的1范数: 取绝对值的最大值

由于求导时方程中不能有绝对值符号, 所以分情况讨论: w是正数或者为负数

求导:
\nabla_wJ(w)=2X^TXw-2X^Ty+\alpha sgn(w)
sgn(w)是符号表示函数: sgn(w)代表着w>0那么sgn(w)=+1;如果w<0那么sgn(W)=-1

梯度下降中系数w的更新规则:
w = w - \epsilon \nabla_wJ(w)

w = w - \epsilon(X^TXw-X^Ty)-\epsilon \alpha sgn(w)

w = [w - \epsilon(X^TXw-X^Ty)]-\epsilon \alpha sgn(w)

当w为正时候sgn(w) =+1,直接去掉减去入所以正的w变小了

当w为负时候sgn(w)=-1,负号变成了正号加上了入,负数w取向零

Lasso回归系数可以缩减到0,岭回归不可以

系数(权重)变成0了,说明:可有可无,属性不重要

2: lasso回归与岭回归和线性回归对比

import numpy as np
from sklearn.linear_model import LinearRegression, Ridge, Lasso
# 将数据一分为二
from sklearn.model_selection import train_test_split
# 均方误差
from sklearn.metrics import mean_squared_error
import pandas as pd


# 加载数据
# 加载训练数据
# train = pd.read_table('./zhengqi_train.txt') 和下面一行的效果相同
train = pd.read_csv('./zhengqi_train.txt', sep = '\t')
train
# 加载测试数据
test = pd.read_table('./zhengqi_test.txt')
test


# 将训练数据分乘特征值和目标值
# 特征, 影响目标值的因素
X = train.iloc[:, :-1]
# 目标值
y = train['target']

# 算法评估, 将上面的数据分成两份,一部分用来训练, 一部分用来测试
X_train, X_validation, y_train, y_validation = train_test_split(X, y, test_size = 0.2)


# 使用普通线性回归模型
linear = LinearRegression()
linear.fit(X_train, y_train)
y_ = linear.predict(X_validation)
mean_squared_error(y_validation,y_)   # 均方误差
'''0.11713370444738197'''

# 使用线性模型预测测试数据
y_commit = linear.predict(test)
# 保存数据到本地
s = pd.Series(y_commit)
s.to_csv('./linear_result.txt', index=False, header = False)


# 使用岭回归模型
ridge = Ridge(alpha=256)   # alpha值
ridge.fit(X_train, y_train)
y_ = ridge.predict(X_validation)
mean_squared_error(y_validation,y_)
'''0.13427749653218798'''

y_commit = ridge.predict(test)
pd.Series(y_commit).to_csv('./ridge_result.txt', index=False, header = False)



# 使用lasso回归模型
lasso = Lasso(alpha=256)
lasso.fit(X_train, y_train)
y_ = lasso.predict(X_validation)
mean_squared_error(y_validation,y_)
'''0.9351911263395224'''

y_commit = lasso.predict(test)
pd.Series(y_commit).to_csv('./lasso_result.txt', index=False, header = False)

将生成的数据上传到阿里天池,与实际数据对比,计算均方误差时, 使用lasso回归模型得到的数据比使用岭回归模型和线性回归模型得到的数据的均方误差要小,说明对该组数据,lasso回归效果最好

套索回归适用于稀松矩阵(大部分系数是0)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 之前总结的线性回归都是在特征集每个特征项数为1的情况下进行求解,即y=θ0 * X0 + θ1 * X1 + .....
    Chuck_Hu阅读 3,222评论 2 4
  • 一、回归介绍 监督学习指的是有目标变量或预测目标的机器学习方法。回归与分类的不同,就在于其目标变量是连续数值型,最...
    nobodyyang阅读 905评论 0 1
  • 什么是回归分析? 回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(预测器)之间的关系。这种技术通...
    众易阅读 6,223评论 0 1
  • 转载:原文链接:7 Types of Regression Techniques you should know!...
    米兰的故事阅读 20,593评论 0 6
  • 她是他爱过的第一个女孩,在十八岁的少年时。周末的时候,一起去看场电影,黑暗中把她柔软的手指,轻轻地放在自己的手心里...
    Jack_devil阅读 430评论 1 3