From: http://sklearn.lzjqsdd.com/modules/linear_model.html#ordinary-least-squareshtml
# 须要明白如下所有内容,花些时间。python
只涉及上述常见的、我的相关的算法。git
Ref: https://www.youtube.com/watch?v=ipb2MhSRGdwgithub
基本上都是解不存在的超定方程组。所以,须要退一步,将参数求解问题,转化为求最小偏差问题,求出一个最接近的解,这就是一个松弛求解。算法
在回归问题中,线性最小二乘是最广泛的求最小偏差的形式。它的损失函数就是二乘损失。以下公式**(1)**所示:api
根据使用的正则化类型的不一样,回归算法也会有不一样。app
ridge
回归使用L2
正则化,lasso
回归使用L1
正则化。
证实:https://my.oschina.net/keyven/blog/526010dom
一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,函数
经过放弃最小二乘法的无偏性,以损失部分信息、下降精度为代价得到回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。post
原理:https://wenku.baidu.com/view/52e4e7f7f61fb7360b4c6523.html
岭迹分析:k的选择;变量的选择
Lasso
是一种估计稀疏线性模型的方法.因为它倾向具备少许参数值的状况,对于给定解决方案是相关状况下,有效的减小了变量数量。 所以,Lasso及其变种是压缩感知(压缩采样)的基础。
Ref: 用正则化(Regularization)来解决过拟合
1)控制特征的数目,能够经过特征组合,或者模型选择算法 (参考“岭回归” - 变量的筛选)
2)Regularization,保持全部特征,可是减少每一个特征的参数向量θ的大小,使其对分类y所作的共享很小(Ridge and Lasso的特色所在)
选择参数非零的特征便可。但由于L0正则化很难求解,是个NP难问题,所以通常采用L1正则化。
L1正则化是L0正则化的最优凸近似,比L0容易求解,而且也能够实现稀疏的效果。
L1正则化在实际中每每替代L0正则化,来防止过拟合。在江湖中也人称Lasso。
L1正则化之因此能够防止过拟合,是由于L1范数就是各个参数的绝对值相加获得的
参数值大小和模型复杂度是成正比的。所以复杂的模型,其L1范数就大,最终致使损失函数就大,说明这个模型就不够好。
L2正则化能够防止过拟合的缘由和L1正则化同样,只是形式不太同样。
L2范数是各参数的平方和再求平方根,咱们让L2范数的正则项最小,可使W的每一个元素都很小,都接近于0。
但与L1范数不同的是,它不会使每一个元素为0,而只是接近于0。越小的参数说明模型越简单,越简单的模型越不容易产生过拟合现象。
L2正则化江湖人称Ridge,也称“岭回归”
可见,规则化符合奥卡姆剃刀(Occam's razor)原理。
咱们考虑两维的状况,在(w1, w2)平面上能够画出目标函数的等高线,而约束条件则成为平面上半径为C的一个 norm ball 。等高线与 norm ball 首次相交的地方就是最优解:
能够看到,L1-ball 与L2-ball 的不一样就在于L1在和每一个坐标轴相交的地方都有“角”出现,有很大的概率等高线会和L1-ball在四个角,也就是坐标轴上相遇,坐标轴上就能够产生稀疏,由于某一维能够表示为0。而等高线与L2-ball在坐标轴上相遇的几率就比较小了。
总结:L1会趋向于产生少许的特征,而其余的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。Lasso在特征选择时候很是有用,而Ridge就只是一种规则化而已。在全部特征中只有少数特征起重要做用的状况下,选择Lasso比较合适,由于它能自动选择特征。而若是全部特征中,大部分特征都能起做用,并且起的做用很平均,那么使用Ridge也许更合适。
Ref: 统计学习那些事
Ref: https://cloud.github.com/downloads/cosname/editor/Learning_from_sparsity.pdf
因为篇幅有限,我就以Lasso和Boosting为主线讲讲本身的体会。故事还得从90年代提及。我以为90年代是这个领域发展的一个黄金年代,由于两种绝世武功都在这个时候横空出世,他们是SVM和Boosted Trees。
SVM
先说SVM。你们对SVM的基本原理广泛表述为,
甚至有部分学者认为SVM能够克服维数灾难(curse of dimensionality)。若是这样理解SVM的基本原理,我以为尚未看到问题的本质。
由于这个见解不能解释下面的事实:
SVM在高维空间里构建分类器后,为何这个分类器不会对原空间的数据集Overfitting呢?
要理解SVM的成功,我以为能够考虑如下几个方面:
Boosted Trees
再说Boosted Trees。它基本的想法是经过对弱分类器的组合来构造一个强分类器。
所谓“弱”就是比随机猜要好一点点;“强”就是强啦。这个想法能够追溯到由Leslie Valiant教授(2010年图灵奖得主)在80年代提出的probably approximately correct learning (PAC learning) 理论。不过很长一段时间都没有一个切实可行的办法来实现这个理想。细节决定成败,再好的理论也须要有效的算法来执行。终于功夫不负有心人, Schapire在1996年提出一个有效的算法真正实现了这个夙愿,它的名字叫AdaBoost。
AdaBoost把多个不一样的决策树用一种非随机的方式组合起来,表现出惊人的性能!
我估计当时Breiman和Friedman确定高兴坏了,由于眼看着他们提出的CART正在被SVM比下去的时候,AdaBoost让决策树起死回生!Breiman不由自主地在他的论文里赞赏AdaBoost是最好的现货方法(off-the-shelf,即“拿下了就能够用”的意思)。
Breiman and Friedman
其实在90年代末的时候,你们对AdaBoost为何有如此神奇的性能疑惑不解。
1999年,Friedman的一篇技术报告 “Additive logistic regression: a statistical view of boosting” 解释了大部分的疑惑(没有解释AdaBoost为何不容易Overfitting,这个问题好像至今尚未定论),即搞清楚了AdaBoost在优化什么指标以及如何优化的。
基于此,Friedman提出了他的GBM(Gradient Boosting Machine,也叫MART或者TreeNet)。几乎在同时,Breiman另辟蹊径,结合他的Bagging (Bootstrap aggregating) 提出了Random Forest (今天微软的Kinect里面就采用了Random Forest,相关论文Real-time Human Pose Recognition in Parts from Single Depth Images是CVPR2011的best paper)。
有一个关于Gradient Boosting细节不得不提。Friedman在作实验的时候发现:
把一棵新生成的决策树,记为f_m,加到当前模型以前,在这棵决策树前乘以一个小的数,即v×f_m(好比v=0.01),再加入到当前模型中,每每大大提升模型的准确度。他把这个叫作“Shrinkage”。(与Lasso的关系)
接下来,Hastie,Tibshirani和Friedman进一步发现(我发现大师们都是亲自动手写程序作实验的),若是把具备Shrinkage的Gradient Boosting应用到线性回归中时,获得的Solution Path与Lasso的Solution Path惊人地类似(如图所示)!他们把这一结果写在了ESL的初版里,并推测这两者存在着某种紧密的联系,但精确的数学关系他们当时也不清楚。Tibshirani说他们还请教了斯坦福的优化大师(我估计是Stephen Boyd,凸优化的做者),但仍是没有找到答案。
后来Tibshirani找到本身的恩师Efron。Tibshirani在“The Science of Bradley Efron”这本书的序言里写道,“He sat down and pretty much single-handedly solved the problem. Along the way, he developed a new algorithm, ‘least angle regression,’ which is interesting in its own right, and sheds great statistical insight on the Lasso.”我就不逐字逐句翻译了,大意是:Efron独自摆平了这个问题,与此同时发明了“Least angle regression (LAR)”。
Efron and Tibshirani
Efron结论是:Lasso和Boosting的确有很紧密的数学联系,它们均可以经过修改LAR获得。更使人惊叹的是LAR具备很是明确的几何意义。因而,Tibshirani在序言中还有一句,“In this work, Brad shows his great mathematical power–not the twentieth century, abstract kind of math, but the old-fashioned kind: geometric insight and analysis.”读Prof Efron的文章,能够感觉到古典几何学与现代统计学的结合之美(推荐你们读读Efron教授2010年的一本新书Large-Scale Inference,但愿之后有机会再写写这方面的体会)!总之,Efron的这篇文章是现代统计学的里程碑,它结束了一个时代,开启了另外一个时代。
这里,想补充说明一下Lasso的身世,它的全称是The Least Absolute Shrinkage and Selection Operator,读音不是[‘læso]而是[læ’su:],有中文翻译为“套索”,我的以为这个翻译很差,太远离它原本的含义,不如就用Lasso。Tibshrani本身说他的Lasso是受到Breiman的Non-Negative Garrote(NNG)的启发。 Lasso把NNG的两步合并为一步,即L1-norm regularization。Lasso的巨大优点在于它所构造的模型是Sparse的,由于它会自动地选择不多一部分变量构造模型。如今,Lasso已经家喻户晓了,可是Lasso出生后的头两年却不多有人问津。后来Tibshirani本身回忆时说,多是由下面几个缘由形成的:
1. 速度问题:当时计算机求解Lasso的速度太慢;
2. 理解问题:你们对Lasso模型的性质理解不够(直到Efron的LAR出来后你们才搞明白);
3. 需求问题:当时尚未遇到太多高维数据分析的问题,对Sparsity的需求彷佛不足。
Lasso的遭遇彷佛在阐释咱们已经熟知的一些道理:
1.千里马常有,而伯乐不常有(没有Efron的LAR,Lasso可能很难有这么大的影响力)。
2.时势造英雄(高维数据分析的问题愈来愈多,好比Bioinformatics领域)。
3.金子老是会闪光的。
LAR把Lasso (L1-norm regularization)和Boosting真正的联系起来,如同打通了任督二脉(数学细节能够参考本人的一个小结,固然最好仍是亲自拜读Efron的原著)。LAR结束了一个晦涩的时代:
在LAR以前,有关Sparsity的模型几乎都是一个黑箱,它们的数学性质(更不要谈古典的几何性质了)几乎都是缺失。
LAR开启了一个光明的时代:有关Sparsity的好文章如雨后春笋般地涌现,好比Candes和Tao的 Dantzig Selector。伯克利大学的Bin Yu教授称“Lasso, Boosting and Dantzig are three cousins”。近年来兴起的 Compressed sensing 压缩感知(Candes & Tao, Donoho)也与LAR一脉相承,只是更增强调L1-norm regularization其余方面的数学性质,好比Exact Recovery。我以为这是一个问题的多个方面,
由此引发的关于Sparsity的研究,犹如黄河泛滥,一发不可收拾。好比Low-rank 逼近是把L1-norm从向量到矩阵的天然推广(如今流行的“用户推荐系统”用到的Collaborative filtering 协同过滤 的数学原理源于此)。有兴趣的童鞋能够参考我我的的小结。
还必须提到的是算法问题。我我的以为,一个好的模型,若是没有一个快速准确的算法做为支撑的话,它最后可能什么也不是。看看Lasso头几年的冷遇就知道了。LAR的成功除了它漂亮的几何性质以外,还有它的快速算法。
这一记录在2007年被Friedman的 Coordinate Descent(CD)坐标降低法 刷新,至今没人打破。Hastie教授趣称这个为“FFT(Friedman + Fortran + Tricks)”。由于CD对Generalized Lasso问题并不能一网打尽,许多凸优化解法应运而生,如Gradient Projection, Proximal methods,ADMM (Alternating Direction Method of Multipliers), (Split) Bregman methods,Nesterov’s method (一阶梯度法中最优的收敛速度,Candes 的不少软件包都根据这个方法设计) 等等。哪一个方法更好呢?这个就像问“谁的武功天下第一”同样。我只能回答“王重阳之后再也没有天下第一了,东邪西毒南帝北丐,他们各有各的所长,有的功夫是这我的擅长一些,而另外几门功夫又是另外一我的更擅长一些”。有关L1的算法可能还会大量涌现,正如优化大师Stephen Boyd所说(2010年9月28日):“God knows the last thing we need is another algorithm for the Lasso.”
附录:
(Jeff: 以上涉及的经常使用模型/算法要搞明白,固然最好的笔记总需写在纸上)
#!/usr/bin/python # -*- coding: utf-8 -*- """ ========================================================= Linear Regression Example ========================================================= This example uses the only the first feature of the `diabetes` dataset, in order to illustrate a two-dimensional plot of this regression technique. The straight line can be seen in the plot, showing how linear regression attempts to draw a straight line that will best minimize the residual sum of squares between the observed responses in the dataset, and the responses predicted by the linear approximation. The coefficients, the residual sum of squares and the variance score are also calculated. """ print(__doc__) # 打印上述自我介绍 # Code source: Jaques Grobler # License: BSD 3 clause import matplotlib.pyplot as plt import numpy as np from sklearn import datasets, linear_model # Load the diabetes dataset diabetes = datasets.load_diabetes() # 加载内置数据,matrix # Use only one feature diabetes_X = diabetes.data[:, np.newaxis, 2] # --> # Split the data into training/testing sets diabetes_X_train = diabetes_X[:-20] diabetes_X_test = diabetes_X[-20:] # Split the targets into training/testing sets diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:]
可见,newaxis将数据提升了维度:原来的单个元素,独立成了一维的数据。
diabetes = datasets.load_diabetes() diabetes Out[152]: {'data': array([[ 0.03807591, 0.05068012, 0.06169621, ..., -0.00259226, 0.01990842, -0.01764613], [-0.00188202, -0.04464164, -0.05147406, ..., -0.03949338, -0.06832974, -0.09220405], [ 0.08529891, 0.05068012, 0.04445121, ..., -0.00259226, 0.00286377, -0.02593034], ..., [ 0.04170844, 0.05068012, -0.01590626, ..., -0.01107952, -0.04687948, 0.01549073], [-0.04547248, -0.04464164, 0.03906215, ..., 0.02655962, 0.04452837, -0.02593034], [-0.04547248, -0.04464164, -0.0730303 , ..., -0.03949338, -0.00421986, 0.00306441]]), 'target': array([ 151., 75., 141., ..., 132., 220., 57.])} diabetes_X = diabetes.data[:, np.newaxis, 1] diabetes_X Out[156]: array([[ 0.05068012], [-0.04464164], [ 0.05068012], ..., [ 0.05068012], [-0.04464164], [-0.04464164]])
技巧:Cross-validation分割数据集
hao = [1, 2, 3, 4, 5] hao[:2] Out[166]: [1, 2] hao[:-2] Out[167]: [1, 2, 3] hao[:-3] Out[168]: [1, 2] hao[-3:] # 保证了test set有三个数据 Out[169]: [3, 4, 5]
# Create linear regression object
regr = linear_model.LinearRegression() # Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train) # The coefficients
print('Coefficients: \n', regr.coef_) # The mean square error
print("Residual sum of squares: %.2f"
% np.mean((regr.predict(diabetes_X_test) - diabetes_y_test) ** 2)) # Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % regr.score(diabetes_X_test, diabetes_y_test))
# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test, color='black') plt.plot(diabetes_X_test, regr.predict(diabetes_X_test), color='blue', linewidth=3) plt.xticks(()) plt.yticks(()) plt.show()
""" =========================================================== Plot Ridge coefficients as a function of the regularization =========================================================== Shows the effect of collinearity in the coefficients of an estimator. .. currentmodule:: sklearn.linear_model :class:`Ridge` Regression is the estimator used in this example. Each color represents a different feature of the coefficient vector, and this is displayed as a function of the regularization parameter. At the end of the path, as alpha tends toward zero and the solution tends towards the ordinary least squares, coefficients exhibit big oscillations. """
# Author: Fabian Pedregosa -- <fabian.pedregosa@inria.fr> # License: BSD 3 clause
print(__doc__) import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model # X is the 10x10 Hilbert matrix
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis]) y = np.ones(10) ############################################################################### # Compute paths
n_alphas = 200 alphas = np.logspace(-10, -2, n_alphas) # 很是好的体现变化细节的技巧 clf = linear_model.Ridge(fit_intercept=False) coefs = [] for a in alphas: clf.set_params(alpha=a) clf.fit(X, y) coefs.append(clf.coef_) # 不是一个参数,而是持续获得一组参数 ############################################################################### # Display results
ax = plt.gca() ax.set_color_cycle(['b', 'r', 'g', 'c', 'k', 'y', 'm']) ax.plot(alphas, coefs) ax.set_xscale('log') ax.set_xlim(ax.get_xlim()[::-1]) # reverse axis
plt.xlabel('alpha') plt.ylabel('weights') plt.title('Ridge coefficients as a function of the regularization') plt.axis('tight') plt.show()
根据Ridge trace图,开始alpha的选取,以及变量的选取问题。固然,这其中也体现了其仍遗留的缺陷,以下。
鉴于其重要性,另起一章学习 [Scikit-learn] 1.1. Generalized Linear Models - Lasso Regression
Extended: 特征相关性对于DL的影响