1.1。 广义线性模型
以下是一组用于回归的方法,其中目标值预期是输入变量的线性组合。 在数学概念中,如果 是预测值。
在整个模块中,我们指定矢量 作为 coef_和 作为 intercept_。
要使用广义线性模型执行分类,请参阅Logistic回归。
LinearRegression:
拟合具有系数 的线性模型,以最小化数据集中观察到的响应之间的残差平方
和通过线性近似预测的响应。 在数学上它解决了一个形式的问题:
LinearRegression
将采用其拟合方法数组X,y并将线性模型的系数w存储在其coef_成员中:
>>> from sklearn import linear_model >>> reg = linear_model.LinearRegression() >>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2]) LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False) >>> reg.coef_ array([ 0.5, 0.5])然而,普通最小二乘的系数估计依赖于模型项的独立性。 当术语相关并且设计矩阵X的列具有近似线性相关性时,设计矩阵变得接近于单数,并且因此最小二乘估计对观察到的响应中的随机误差变得高度敏感,产生大的方差 。 例如,当没有实验设计收集数据时,可能会出现这种多重共线性的情况。
Examples:
- Linear Regression Example(原网站的其中的一个例子)
1.1.1.1。 普通最小二乘法复杂度
>>> from sklearn import linear_model >>> reg = linear_model.Ridge (alpha = .5) >>> reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1]) Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None, normalize=False, random_state=None, solver='auto', tol=0.001) >>> reg.coef_ array([ 0.34545455, 0.34545455]) >>> reg.intercept_ 0.13636...
Examples:
- Plot Ridge coefficients as a function of the regularization
- Classification of text documents using sparse features
1.1.2.1. 岭回归复杂度
这个方法和 普通最小二乘法 复杂度一样(同阶).
1.1.2.2. 设置正则化参数: 广义交叉验证
RidgeCV
实现了带缺省 参数的交叉验证的岭回归模型.这个对象和 GridSearchCV 除了它默认为广义交叉验证(GCV),其他工作方式一样。 下面是一种高效的交叉验证方式-留一交叉验证(leave-one-out):
>>> from sklearn import linear_model
>>> clf = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])
>>> clf.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None,
normalize=False)
>>> clf.alpha_
0.1
References
- “Notes on Regularized Least Squares”, Rifkin & Lippert (technical report, course slides).
1.1.3. Lasso
Lasso
是一种估计稀疏线性模型的方法.由于它倾向具有少量参数值的情况,对于给定解决方案是相关情况下,有效的减少了变量数量。 因此,Lasso及其变种是压缩感知(压缩采样)的基础。在约束条件下,它可以回复一组非零精确的权重系数(参考Compressive sensing: tomography reconstruction with L1 prior (Lasso)).
用数学形式表达,Lasso 包含一个使用 先验作为正则化因子的线性模型。其目标函数是最小化:
lasso 解决带 罚项的最小平方和,其中 是一个常量, 是参数向量的 -norm
Lasso
类实现使用了坐标下降法(一种非梯度优化算法) 来拟合系数.参考另一种实现 Least Angle Regression最小角回归
>>> from sklearn import linear_model
>>> clf = linear_model.Lasso(alpha = 0.1)
>>> clf.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)
>>> clf.predict([[1, 1]])
array([ 0.8])
函数 lasso_path
对于lower-level任务非常有用。它能够通过搜索所有可能的路径上的值来计算系数.
Examples:
Note
Feature selection with Lasso
As the Lasso regression yields sparse models, it can thus be used to perform feature selection, as detailed in 基于L1的特征选择(L1-based feature selection).
Note
Randomized sparsity
For feature selection or sparse recovery, it may be interesting to use 随机稀疏模型(Randomized sparse models).
1.1.3.1. 设置正则化参数
alpha
参数控制估计的系数的稀疏程度。
1.1.3.1.1. 使用交叉验证
scikit-learn 暴露以下两个类 LassoCV
和 LassoLarsCV
可以设置 Lasso alpha
参数. LassoCV
基于下面解释的算法 Least Angle Regression最小角回归
对于含有很多共线性的高维的数据集,LassoCV
是最合适不过了。然而,LassoLarsCV
在寻找 alpha 参数更相关的值时更具有优势, 并且如果样本相比于观测的数量时,通常比 LassoCV
更快.
1.1.3.1.2. 基于模型选择的信息约束
LassoLarsIC
建议使用Akaike information criterion (AIC) 和 Bayes Information criterion (BIC)。 由于在计算:math:alpha 过程中,当使用k-折交叉验证的时候,正则化路径只计算1次而不是k+1次,所以在计算上代价非常小。 然而,这种约束需要一个合适的对于解的自由度的估计(可参考矩阵的解的自由度),这可以从大量的样本(渐进结果)导出并且 假设模型是正确的。例如,数据实际上是有该模型产生的,但是当问题是病态条件时这种数据可能会有问题(参考病态矩阵,条件数等概念),比如 特征维数大于样本数.(小样本问题)
1.1.4. 弹性网络
ElasticNet
是一种使用L1和L2先验作为正则化矩阵的线性回归模型.这种组合用于只有很少的权重非零的稀疏模型,比如:class:Lasso, 但是又能保持:class:Ridge 的正则化属性.我们可以使用 l1_ratio
参数来调节L1和L2的凸组合(一类特殊的线性组合)。
当多个特征和另一个特征相关的时候弹性网络非常有用。Lasso 倾向于随机选择其中一个,而弹性网络更倾向于选择两个.
在实践中,Lasso 和 Ridge 之间权衡的一个优势是它允许在循环过程(Under rotate)中继承 Ridge 的稳定性.
弹性网络的目标函数是最小化:
ElasticNetCV
可以通过交叉验证来用来设置参数 alpha
() 和 l1_ratio
()
1.1.5. Multi-task Lasso回归
MultiTaskLasso
是一种估计多元回归系数的线性模型, y
是一个2D数组,形式为(n_samples,n_tasks). 其限制条件是和其他回归问题一样,是选择的特征,同样称为 tasks.
接下来的图示比较了通过使用一个简单的Lasso或者MultiTaskLasso得到的W中非零的位置。 Lasso 估计量分散着非零值而MultiTaskLasso所有的列全部是非零的。
Fitting a time-series model, imposing that any active feature be active at all times.
数学表达上,它包含了一个使用 先验作为正则化因子。其目标函数是最小化:
where;
MultiTaskLasso
类的实现使用了坐标下降算法来拟合系数。
1.1.6. Least Angle Regression最小角回归
最小角回归是针对高维数据的回归算法,由Bradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani开发。
- LARS的优势如下:
-
- 当 p >> n 时计算是非常高效的。(比如当维数远大于点数)
- 它和前向选择计算速度差不多一样块,并且和普通最小二乘复杂度一样。
- 它生成一个完整的分段线性的解的路径,这对于交叉验证或者类似的尝试来调整模型是有效的。
- 如果两个变量的相应总是相同,那么它们的系数应该有近似相同的增长速率。因此这算法和直觉判断一样,并且增长总是稳定的。
- 这个算法对于其他评估模型来说很容易被修改来产生解,和Lasso差不多。(待修改)
- It is easily modified to produce solutions for other estimators, like the Lasso.
LARS方法的缺点包括:
- 因为LARS是基于剩余误差多次迭代拟合,所以对噪声的影响比较敏感。这个问题在 Efron et al. (2004) Annals of Statistics article这篇文章中讨论部分详细谈论了。
1.1.7. LARS Lasso
LassoLars
是一个使用LARS算法实现的lasso模型。和基于坐标下降的实现不同的是,它产生的是精确的解,和一个函数标准系数一样是精确线性的。 which is piecewise linear as a function of the norm of its coefficients.(待修正)
>>> from sklearn import linear_model
>>> clf = linear_model.LassoLars(alpha=.1)
>>> clf.fit([[0, 0], [1, 1]], [0, 1])
LassoLars(alpha=0.1, copy_X=True, eps=..., fit_intercept=True,
fit_path=True, max_iter=500, normalize=True, positive=False,
precompute='auto', verbose=False)
>>> clf.coef_
array([ 0.717157..., 0. ])
Examples:
The Lars algorithm provides the full path of the coefficients along the regularization parameter almost for free, thus a common operation consist of retrieving the path with function lars_path
1.1.7.1. Mathematical formulation
这个算法和逐步回归很相似,但是除了在每一步包含变量之外,估计的参数沿着每一个对应的残差的对角方向增长。(待校正)。 并不是给出一个向量结果,而是在LARS的解中包含了一个曲线,用来表示每个参数向量的L1-norm 值的解, 所有系数路径存在 coef_path_
数组中,大小为(n_features,max_features+1),其中第一列总是0.
References:
- Original Algorithm is detailed in the paper Least Angle Regression by Hastie et al.
1.1.8. Orthogonal Matching Pursuit (OMP) 正交匹配跟踪
OrthogonalMatchingPursuit
and orthogonal_mp
实现了一个用来逼近在非零系数的个数上加约束的线性模型的拟合的OMP算法(比如L 0 pseudo-norm)
和 Least Angle Regression最小角回归 一样,作为一个前向特征选择方法,OMP可以用一个固定非零的数来逼近最优的解向量:
或者说正交匹配算法可以针对一个特殊的误差而不是一个特殊的非零系数的个数,这一过程可以表达为:
OMP是基于贪婪算法,包括在每一步原子(归一化的向量)与当前残差高度相关。它类似于简单 匹配追踪(MP)方法,但更好的,在每一次迭代中,通过使用的在前一个选择的字典元素的空间的正交投影重新计算残差。 参考 * http://chunqiu.blog.ustc.edu.cn/?p=634 *
Examples:
References:
1.1.9. 贝叶斯回归
可以在估计过程中使用贝叶斯回归技术包含正则化参数:正则化参数不是硬编码设置的而是手动调节适合数据的值
可以通过在模型的超参数上引入 uninformative priors
`Ridge Regression`_ 中 使用的正则化项等价于在一个参数为 且精度为 的高斯先验下寻找 一个最大的后验的解。而且并不是手动设置 lambda ,而是有可能把它看做一个随机变量来从从数据中估计。
为了获得一个完整的概率模型,输出 假设为关于 的高斯分布
Alpha 同样被看做是随机变量,需要从数据中来估计
贝叶斯回归的优势:
- 根据数据调节参数
- 在估计过程中包含正则化参数
贝叶斯回归劣势:
- 模型的推理比较耗时
References
- 关于贝叶斯方法一个非常好的说明可以参考 C. Bishop: Pattern Recognition and Machine learning (经典的PRML书籍)
- 而原始的算法在 Bayesian learning for neural networks by Radford M. Neal 中有详细描述。
1.1.9.1. 贝叶斯岭回归
BayesianRidge
对上述的回归问题估计了一个概率模型。先验参数 由下面的球形高斯给出:
先验参数 和 的选择满足 gamma distributions ,即高斯函数精度的共轭先验
生成的模型称为 Bayesian Ridge Regression ,和经典的 Ridge
类似。 参数 , 以及 在模型的拟合中被共同估计。 其他的参数是 和 的gamma 先验的参数。(待校正) 这些通常被选择为 non-informative*(参考贝叶斯无信息先验)。参数统计通过最大化 *marginal log likelihood.
By default .
Bayesian Ridge Regression is used for regression:
>>> from sklearn import linear_model
>>> X = [[0., 0.], [1., 1.], [2., 2.], [3., 3.]]
>>> Y = [0., 1., 2., 3.]
>>> clf = linear_model.BayesianRidge()
>>> clf.fit(X, Y)
BayesianRidge(alpha_1=1e-06, alpha_2=1e-06, compute_score=False, copy_X=True,
fit_intercept=True, lambda_1=1e-06, lambda_2=1e-06, n_iter=300,
normalize=False, tol=0.001, verbose=False)
After being fitted, the model can then be used to predict new values:
>>> clf.predict ([[1, 0.]])
array([ 0.50000013])
The weights of the model can be access:
>>> clf.coef_
array([ 0.49999993, 0.49999993])
由于贝叶斯框架,权重的发现同 普通最小二乘法 略有不同。然而Bayesian Ridge Regression 对于病态问题更具有鲁棒性。
Examples:
References
- More details can be found in the article Bayesian Interpolation by MacKay, David J. C.
1.1.9.2. Automatic Relevance Determination - ARD
ARDRegression
和 `Bayesian Ridge Regression`_ 非常相似,但是主要针对稀疏权重 [1] [2] 。 ARDRegression
提出一个不同于 的先验,通过弱化高斯分布为球形的假设。
相反, 的分布假设为一个平行轴的椭圆高斯分布。(同axis-alignen)
也就是说,每个权重 来自于一个中心在0点,精度为 的高斯分布:
with .
同 `Bayesian Ridge Regression`_ 形成对比, 每一维都有一个标准差 , 所有 的先验选择 和 由给定超参数 和 的gamma分布一样。
References:
[1] | Christopher M. Bishop: Pattern Recognition and Machine Learning, Chapter 7.2.1 |
[2] | David Wipf and Srikantan Nagarajan: A new view of automatic relevance determination. |
1.1.10. 逻辑回归
逻辑回归形如其名,是一个线性分类模型而不是回归模型。逻辑回归在文献中也称为logit回归、最大熵分类(MaxEnt) 或者 log-linear classifier。 在这个模型中,描述单次可能结果输出概率使用 logistic function 来建模。
scikit-learn中逻辑回归的实现为 LogisticRegression
类。它可以拟合含L2或者L1正则化项的多类逻辑回归问题。
作为一个优化问题,二分类L2 通过下方的代价函数来惩罚逻辑回归:
类似的,L1 正则化逻辑回归解决下述的优化问题:
LogisticRegression
中的实现是solver “liblinear” (一个扩展的C++ library,LIBLINEAR), “newton-cg”, “lbfgs” and “sag”。
“lbfgs” 和 “newton-cg” 只支持L2罚项,并且对于一些高维数据收敛非常快。L1罚项产生稀疏预测的权重。
“liblinear” 使用了基于Liblinear的坐标下降法(CD)。对于F1罚项, sklearn.svm.l1_min_c
允许计算C的下界以获得一个非”null” 的 模型(所有特征权重为0)。这依赖于非常棒的一个库 LIBLINEAR library ,用在scikit-learn中。 然而,CD算法在liblinear中的实现无法学习一个真正的多维(多类)的模型。反而,最优问题被分解为 “one-vs-rest” 多个二分类问题来解决多分类。 由于底层是这样实现的,所以使用了该库的 LogisticRegression
类就可以作为多类分类器了。
LogisticRegression
使用 “lbfgs” 或者 “newton-cg” 程序 来设置 multi_class 为 “multinomial”,则该类学习 了一个真正的多类逻辑回归模型,也就是说这种概率估计应该比默认 “one-vs-rest” 设置要更加准确。但是 “lbfgs”, “newton-cg” 和 “sag” 程序无法优化 含L1罚项的模型,所以”multinomial” 的设置无法学习稀疏模型。
“sag” 程序使用了随机平均梯度下降( Stochastic Average Gradient descent [3])。它无法解决多分类问题,而且对于含L2罚项的模型有局限性。 然而在超大数据集下计算要比其他程序快很多,当样本数量和特征数量都非常大的时候。
简单概括下,可以按照以下规则来选择solver:
Case | Solver |
---|---|
Small dataset or L1 penalty | “liblinear” |
Multinomial loss | “lbfgs” or newton-cg” |
Large dataset | “sag” |
对于超大数据集,你同样可以考虑使用带log损失的 SGDClassifier
与线性的区别: 当fit_intercept = False和fit coef_(或)要预测的数据为零时,LogisticRegression与solver = liblinear或LinearSVC和外部liblinear库之间获得的分数可能有差异。 这是因为对于具有decision_function为零的样本,LogisticRegression和LinearSVC预测负类,而liblinear预测正类。 请注意,具有fit_intercept = False并具有许多带有decision_function为零的样本的模型可能是一个不合适的模型,建议您设置fit_intercept = True并增加intercept_scaling。 当fit_intercept = False和fit coef_(或)要预测的数据为零时,LogisticRegression与solver = liblinear或LinearSVC和外部liblinear库之间获得的分数可能有差异。 这是因为对于具有decision_function为零的样本,LogisticRegression和LinearSVC预测负类,而liblinear预测正类。 请注意,具有fit_intercept = False并具有许多带有decision_function为零的样本的模型可能是一个不合适的模型,建议您设置fit_intercept = True并增加intercept_scaling。
注意使用稀疏逻辑回归的特征选择
具有L1惩罚的逻辑回归产生稀疏模型,因此可以用于执行特征选择,如详细描述的
LogisticRegressionCV
实现了一个内建的交叉验证来寻找最优的参数C的逻辑回归模型。”newton-cg”,”sag” 和 ”lbfgs” 程序在高维稠密数据上计算更快,原因在于warm-starting.对于多类问题,如果 multi_class 选项设置为 “ovr” ,那么最优的C从每个类别中获得,如果 multi_class 选项设置为 ”multinomial” ,那么最优的C通过最小化交叉熵损失得到。