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的影響