Sklearn 用户手册(四): 回归一

华丽丽的迈入具体的算法章节了。

线性回归

也就是用一条直线去尽可能的拟合一堆数据点,当然真实世界中,我们都知道这几乎做不到。但至少可以找一条直线使得它和数据点尽可能的接近。所以我们就把每一个数据点到直线的距离的平方和求出来。如果某条直线能够使得这个距离最小,那就是最优的,于是就有了下面的式子:

minω||Xωy||22

其中 ||Xωy||22 又被称为该模型中的损失函数

from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
#读取系数
print clf.coef_

然而,平常的最小二乘法对模型的解释项之间的独立性依赖很高。如果这些解释项之间是相关的,也就是变量矩阵X的列向量之间是近似线性相关的,会令模型对于随机误差极其敏感,从而产生高方差。这就是多重共线性问题。

sklearn中对最小二乘模型使用奇异值分解来求解。如果变量矩阵X是(n, p)维的,则算法的复杂度为 O(np2)

岭回归

岭回归就是在一般的最小二乘法的基础上加上一个残差平方和的惩罚项。

minω||Xωy||22+α||ω||22

这里的 α 是惩罚因子, α 越大,对 ω 的限制也就越大,在存在共线性的问题中可以有效的保证系数的稳定性。

from sklearn import linear_model
#与普通的线性回归相比,多了一个alpha参数
clf = linear_model.Ridge(alpha = .5)
clf.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
print clf.coef_
print clf.intercept_

可以通过RidgeCV帮助选择合适的alpha值,原理和GridSearchCV相似,只是默认使用了留一交叉验证:

from sklearn import linear_model
clf = linear_model.RidgeCV(alpha = [0.1, 1.0, 10.0])
clf.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
print clf.alpha_

Lasso

Lasso主要是用来减少特征值的,它可以让系数矩阵更稀疏。从数学的角度,就是在最小二乘的基础上加上了L1范数

minω12nsamples||Xωy||22+α||ω||1

clf = linear_model.Lasso(alpha = 0.1)
clf.fit([[0, 0], [1, 1]], [0, 1])
print clf.predict([[1, 1]])

这里的Lasso方法使用坐标下降法来求解。还有一种使系数矩阵稀疏来达到特征选择的目的的方法是Randomized sparse models。

同样Lasso也有一个LassoCV方法来帮助选择alpha的值。另外还有基于最小角回归方法的LassoLarsCV.

如果是一个高维的又具有很多共线性的数据集,LassoCV会更适合。但LassoLarsCV能够更好的挖掘alpha参数的相关值。并且如果样本量跟观察值比起来太少的话,用LassoLarsCV会更快。

弹性网

ElasticNet 是岭回归与Lasso回归的一个综合,即在最小化损失函数时把L1和L2范数都考虑在内,并通过l1_ratio参数来调节.
ElasticNet和Lasso的区别就在于,当存在多个相关的特征时,Lasso一般是随机的选择一个,一方面选择的特征不一定最好,另一方面也会有信息损失。而ElasticNet会在几个特征中做权衡。

minω12nsamples||Xωy||22+αρ||ω||1+α(1ρ)2||ω||22

ElasticNet方法可以帮助选择 α ρ

多任务的Lasso模型

通常,我们把通过特征模型分析出来一个标签y称为一个任务,多任务也就是对每一个样本的特征能够得出多个标签。这时候得出的y是个(n_samples, n_tasks)的二维矩阵。也就是多元Lasso分析。不太明白,先略。

最小角回归

最小角回归(LARS)是一个用于处理高维数据的算法,它有以下优点:

  • 当维度远大于数据点的数量时,计算效率相对而言会很高
  • 计算效率和前向算法一样快,同时又有和最小二乘法一样的最坏计算复杂度
  • 它会产生分段计算路径,这在调试模型的时候非常有用
  • 当两个变量在模型中的变化几乎同步时,那他们系数也会有几乎相同的速率变化,这是非常符合我们的直观的,因此模型会很稳定
  • 可以很容易的通过一些设置转变为Lasso等方法

同时LARS也有它的一些缺点:它依赖于不断对残差去重新拟合,因此受噪声数据的影响会很大。可以参考the Efron et al.(2004) Annals of Statistics article.

sklearn中用LARS算法实现lasso模型的是LassoLars。该算法会给出随着正则化参数的变化时系数变化的完整路径。可以通过lars_path来检索路径。LARS算法的具体实现可以参考Least Angle Regression

import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn import datasets

diabetes = datasets.load_diabetes()
X = diabetes.data
y = diabetes.target

print("Computing regularization path using the LARS ...")
alphas, _, coefs = linear_model.lars_path(X, y, method='lassso', verbose=True)
#归一化
xx = np.sum(np.abs(coefs.T), axis=1)
xx /= xx[-1]
plt.plot(xx, coefs.T)
ymin, ymax = plt.ylim()
plt.vlines(xx, ymin, ymax, linestyle='dashed')
plt.xlabel('|coef|/max|coef|')
plt.ylabel('Coefficients')
plt.title('LASSO Path')
plt.axis('tight')
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值