Infi-chu:
http://www.cnblogs.com/Infi-chu/
一、線性回歸應用場景
- 房價預測
- 銷售額度預測
- 貸款預測
二、線性回歸基本概念
1.定義
線性回歸(Linear regression)是利用回歸方程(函數)對一個或多個自變量(特征值)和因變量(目標值)之間關系進行建模的一種分析方式。
2.特點
只有一個自變量的情況稱為單變量回歸,多於一個自變量情況的叫做多元回歸。
3.公式
【注】
其中w,x可以理解為矩陣
eg.
原方程:
轉化為矩陣:
從列的角度看:
4.應用舉例
- 期末成績:0.7×考試成績+0.3×平時成績
- 房子價格 = 0.02×中心區域的距離 + 0.04×城市一氧化氮濃度 + (-0.12×自住房平均房價) + 0.254×城鎮犯罪率
特征值與目標之間建立了一個關系,這個關系可以理解為線性模型。
5.線性模型:
- 線性關系
- 單變量線性關系
- 多變量線性關系
【注】
單特征與目標值的關系呈直線關系,或者兩個特征與目標值呈現平面的關系。
- 單變量線性關系
- 非線性關系
【注】
如果是非線性關系,那么回歸方程可以理解為:w1x1^1+w2x2^2+w3x3^2
三、線性回歸API
1.API
sklearn.linear_model.LinearRegression()
- LinearRegression.coef_:回歸系數
2.例子
步驟:
- 獲取數據集
- 數據基本處理
- 特征工程
- 機器學習
- 模型評估
編寫程序:
# 導入模塊 from sklearn.linear_model import LinearRegression # 構建數據集 x = [[80, 86], [82, 80], [85, 78], [90, 90], [86, 82], [82, 90], [78, 80], [92, 94]] y = [84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4] # 機器學習--》模型訓練 # 實例化API estimator = LinearRegression() # 使用fit方法進行訓練 estimator.fit(x,y) estimator.coef_ estimator.predict([[100, 80]])
四、求導
1.常用數學公式
2.運算法則
3.矩陣求導
五、線性回歸的損失和優化
1.例子引入
房屋價格與真實的數據之間存在這樣的關系:
真實關系:真實房子價格 = 0.02×中心區域的距離 + 0.04×城市一氧化氮濃度 + (-0.12×自住房平均房價) + 0.254×城鎮犯罪率
再隨機指定一個關系:
隨機指定關系:預測房子價格 = 0.25×中心區域的距離 + 0.14×城市一氧化氮濃度 + 0.42×自住房平均房價 + 0.34×城鎮犯罪率
2.損失函數
定義:
- yi為第i個訓練樣本的真實值
- h(xi)為第i個訓練樣本特征值組合預測函數
- 又稱最小二乘法
3.正規方程
公式:
【注】
理解:X為特征值矩陣,y為目標值矩陣。直接求導,最后得出結果。
缺點:當特征過多過復雜時,求解速度太慢。
eg.
推導(一):
將矩陣函數轉化為矩陣寫法:
其中y是真實值矩陣,X是特征值矩陣,w是權重矩陣
對其求解關於w的最小值,已知y,X均已知二次函數直接求導,導數為0的位置,即為最小值。
【注】
式(1)到式(2)推導過程中, X是一個m行n列的矩陣,並不能保證其有逆矩陣,但是右乘XT把其變成一個方陣,保證其有逆矩陣。
式(5)到式(6)推導過程中,和上類似。
4.梯度下降
引例:
梯度下降法的基本思想可以類比為一個下山的過程。
假設這樣一個場景:一個人被困在山上,需要從山上下來(i.e. 找到山的最低點,也就是山谷)。但此時山上的濃霧很大,導致可視度很低。因此,下山的路徑就無法確定,他必須利用自己周圍的信息去找到下山的路徑。這個時候,他就可以利用梯度下降算法來幫助自己下山。具體來說就是,以他當前的所處的位置為基准,尋找這個位置最陡峭的地方,然后朝着山的高度下降的地方走,(同理,如果我們的目標是上山,也就是爬到山頂,那么此時應該是朝着最陡峭的方向往上走)。然后每走一段距離,都反復采用同一個方法,最后就能成功的抵達山谷。
梯度下降的基本過程就和下山的場景很類似。
首先,我們有一個可微分的函數。這個函數就代表着一座山。
我們的目標就是找到這個函數的最小值,也就是山底。
根據之前的場景假設,最快的下山的方式就是找到當前位置最陡峭的方向,然后沿着此方向向下走,對應到函數中,就是找到給定點的梯度 ,然后朝着梯度相反的方向,就能讓函數值下降的最快!因為梯度的方向就是函數之變化最快的方向。 所以,我們重復利用這個方法,反復求取梯度,最后就能到達局部的最小值,這就類似於我們下山的過程。而求取梯度就確定了最陡峭的方向,也就是場景中測量方向的手段。
定義:
梯度是微積分中一個很重要的概念
在單變量的函數中,梯度其實就是函數的微分,代表着函數在某個給定點的切線的斜率
在多變量函數中,梯度是一個向量,向量有方向,梯度的方向就指出了函數在給定點的上升最快的方向
這也就說明了為什么我們需要千方百計的求取梯度!我們需要到達山底,就需要在每一步觀測到此時最陡峭的地方,梯度就恰巧告訴了我們這個方向。梯度的方向是函數在給定點上升最快的方向,那么梯度的反方向就是函數在給定點下降最快的方向,這正是我們所需要的。所以我們只要沿着梯度的反方向一直走,就能走到局部的最低點!
eg.單變量函數的梯度下降
我們假設有一個單變量的函數 :J(θ) = θ2
函數的微分:J、(θ) = 2θ
初始化,起點為: θ0 = 1
學習率:α = 0.4
我們開始進行梯度下降的迭代計算過程:
經過四次的運算,也就是走了四步,基本就抵達了函數的最低點,也就是山底
eg.多變量函數的梯度下降
我們假設有一個目標函數 ::J(θ) = θ12 + θ22
現在要通過梯度下降法計算這個函數的最小值。我們通過觀察就能發現最小值其實就是 (0,0)點。但是接下 來,我們會從梯度下降算法開始一步步計算到這個最小值! 我們假設初始的起點為: θ0 = (1, 3)
初始的學習率為:α = 0.1
函數的梯度為:▽:J(θ) =< 2θ1 ,2θ2>
進行多次迭代:
已經基本靠近函數的最小值點
公式:
α是含義
α在梯度下降算法中被稱作為學習率或者步長,意味着我們可以通過α來控制每一步走的距離,以保證不要步子跨的太大扯着蛋,哈哈,其實就是不要走太快,錯過了最低點。同時也要保證不要走的太慢,導致太陽下山了,還沒有走到山下。所以α的選擇在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的話,可能導致遲遲走不到最低點,太大的話,會導致錯過最低點!
為什么梯度要乘以一個負號
梯度前加一個負號,就意味着朝着梯度相反的方向前進!我們在前文提到,梯度的方向實際就是函數在此點上升最快的方向!而我們需要朝着下降最快的方向走,自然就是負的梯度的方向,所以此處需要加上負號
我們通過兩個圖更好理解梯度下降的過程
所以有了梯度下降這樣一個優化算法,回歸就有了"自動學習"的能力
- 梯度下降和正規方程的對比
梯度下降 | 正規方程 |
---|---|
需要選擇學習率 | 不需要 |
需要迭代求解 | 一次運算得出 |
特征數量較大可以使用 | 需要計算方程,時間復雜度高O(n3) |
- 選擇:
- 小規模數據:
- LinearRegression(不能解決擬合問題)
- 嶺回歸
- 大規模數據:SGDRegressor
- 小規模數據:
六、 梯度下降方法
常見的梯度下降算法有:
- 全梯度下降算法(Full gradient descent)
- 隨機梯度下降算法(Stochastic gradient descent)
- 隨機平均梯度下降算法(Stochastic average gradient descent)
- 小批量梯度下降算法(Mini-batch gradient descent)
1.全梯度下降算法(FG)
計算訓練集所有樣本誤差,對其求和再取平均值作為目標函數。
權重向量沿其梯度相反的方向移動,從而使當前目標函數減少得最多。
因為在執行每次更新時,我們需要在整個數據集上計算所有的梯度,所以批梯度下降法的速度會很慢,同時,批梯度下降法無法處理超出內存容量限制的數據集。
批梯度下降法同樣也不能在線更新模型,即在運行的過程中,不能增加新的樣本。
其是在整個訓練數據集上計算損失函數關於參數θ的梯度:
2.隨機梯度下降算法(SG)
由於FG每迭代更新一次權重都需要計算所有樣本誤差,而實際問題中經常有上億的訓練樣本,故效率偏低,且容易陷入局部最優解,因此提出了隨機梯度下降算法。
其每輪計算的目標函數不再是全體樣本誤差,而僅是單個樣本誤差,即每次只代入計算一個樣本目標函數的梯度來更新權重,再取下一個樣本重復此過程,直到損失函數值停止下降或損失函數值小於某個可以容忍的閾值。
此過程簡單,高效,通常可以較好地避免更新迭代收斂到局部最優解。其迭代形式為:
每次只使用一個樣本迭代,若遇上噪聲則容易陷入局部最優解。
【注】
x(i)表示一條訓練樣本的特征值,y(i)表示一條訓練樣本的標簽值
3.小批量梯度下降算法(mini-bantch)
小批量梯度下降算法是FG和SG的折中方案,在一定程度上兼顧了以上兩種方法的優點。
每次從訓練樣本集上隨機抽取一個小樣本集,在抽出來的小樣本集上采用FG迭代更新權重。
被抽出的小樣本集所含樣本點的個數稱為batch_size,通常設置為2的冪次方,更有利於GPU加速處理。
特別的,若batch_size=1,則變成了SG;若batch_size=n,則變成了FG.其迭代形式為:
4.隨機平均梯度下降算法(SAG)
在SG方法中,雖然避開了運算成本大的問題,但對於大數據訓練而言,SG效果常不盡如人意,因為每一輪梯度更新都完全與上一輪的數據和梯度無關。
隨機平均梯度算法克服了這個問題,在內存中為每一個樣本都維護一個舊的梯度,隨機選擇第i個樣本來更新此樣本的梯度,其他樣本的梯度保持不變,然后求得所有梯度的平均值,進而更新了參數。
如此,每一輪更新僅需計算一個樣本的梯度,計算成本等同於SG,但收斂速度快得多。
5.對比
數據集共有15081條記錄,包括“性別”“年齡”“受教育情況”“每周工作時常”等14個特征,數據標記列顯示“年薪是否大於50000美元”。我們將數據集的80%作為訓練集,剩下的20%作為測試集,使用邏輯回歸建立預測模型,根據數據點的14個特征預測其數據標記(收入情況)。
以下6幅圖反映了模型優化過程中四種梯度算法的性能差異:
在圖1和圖2中,橫坐標代表有效迭代次數,縱坐標代表平均損失函數值。圖1反映了前25次有效迭代過程中平均損失函數值的變化情況,為了便於觀察,圖2放大了第10次到25次的迭代情況。
從圖1中可以看到,四種梯度算法下,平均損失函數值隨迭代次數的增加而減少。FG的迭代效率始終領先,能在較少的迭代次數下取得較低的平均損失函數值。FG與SAG的圖像較平滑,這是因為這兩種算法在進行梯度更新時都結合了之前的梯度;SG與mini-batch的圖像曲折明顯,這是因為這兩種算法在每輪更新梯度時都隨機抽取一個或若干樣本進行計算,並沒有考慮到之前的梯度。
從圖2中可以看到雖然四條折現的縱坐標雖然都趨近於0,但SG和FG較早,mini-batch最晚。這說明如果想使用mini-batch獲得最優參數,必須對其進行較其他三種梯度算法更多頻次的迭代。
在圖3,4,5,6中,橫坐標表示時間,縱坐標表示平均損失函數值。
從圖3中可以看出使用四種算法將平均損失函數值從0.7降到0.1最多只需要2.5s,由於本文程序在初始化梯度時將梯度設為了零,故前期的優化效果格外明顯。其中SG在前期的表現最好,僅1.75s便將損失函值降到了0.1,雖然SG無法像FG那樣達到線性收斂,但在處理大規模機器學習問題時,為了節約時間成本和存儲成本,可在訓練的一開始先使用SG,后期考慮到收斂性和精度可改用其他算法。
從圖4,5,6可以看出,隨着平均損失函數值的不斷減小,SG的性能逐漸反超FG,FG的優化效率最慢,即達到相同平均損失函數值時FG所需要的時間最久。
結論:
(1)FG方法由於它每輪更新都要使用全體數據集,故花費的時間成本最多,內存存儲最大。
(2)SAG在訓練初期表現不佳,優化速度較慢。這是因為我們常將初始梯度設為0,而SAG每輪梯度更新都結合了上一輪梯度值。
(3)綜合考慮迭代次數和運行時間,SG表現性能都很好,能在訓練初期快速擺脫初始梯度值,快速將平均損失函數降到很低。但要注意,在使用SG方法時要慎重選擇步長,否則容易錯過最優解。
(4)mini-batch結合了SG的“膽大”和FG的“心細”,從6幅圖像來看,它的表現也正好居於SG和FG二者之間。在目前的機器學習領域,mini-batch是使用最多的梯度下降算法,正是因為它避開了FG運算效率低成本大和SG收斂效果不穩定的缺點。
6.補充:
以下這些算法主要用於深度學習優化
- 動量法
- 其實動量法(SGD with monentum)就是SAG的姐妹版
- SAG是對過去K次的梯度求平均值
- SGD with monentum 是對過去所有的梯度求加權平均
- Nesterov加速梯度下降法
- 類似於一個智能球,在重新遇到斜率上升時候,能夠知道減速
- Adagrad
- 讓學習率使用參數
- 對於出現次數較少的特征,我們對其采用更大的學習率,對於出現次數較多的特征,我們對其采用較小的學習率。
- Adadelta
- Adadelta是Adagrad的一種擴展算法,以處理Adagrad學習速率單調遞減的問題。
- RMSProp
- 其結合了梯度平方的指數移動平均數來調節學習率的變化。
- 能夠在不穩定(Non-Stationary)的目標函數情況下進行很好地收斂。
- Adam
- 結合AdaGrad和RMSProp兩種優化算法的優點。
- 是一種自適應的學習率算法
七、API
- sklearn.linear_model.LinearRegression(fit_intercept=True)
- 通過正規方程優化
- fit_intercept:是否計算偏置
- LinearRegression.coef_:回歸系數
- LinearRegression.intercept_:偏置
- sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
- SGDRegressor類實現了隨機梯度下降學習,它支持不同的loss函數和正則化懲罰項來擬合線性回歸模型。
- loss:損失類型
- loss=”squared_loss”: 普通最小二乘法
- fit_intercept:是否計算偏置
- learning_rate : string, optional
- 學習率填充
- 'constant': eta = eta0
- 'optimal': eta = 1.0 / (alpha * (t + t0)) [default]
- 'invscaling': eta = eta0 / pow(t, power_t)
- power_t=0.25:存在父類當中
- 對於一個常數值的學習率來說,可以使用learning_rate=’constant’ ,並使用eta0來指定學習率。
- SGDRegressor.coef_:回歸系數
- SGDRegressor.intercept_:偏置
八、欠擬合&過擬合
1.定義
- 過擬合:一個假設在訓練數據上能夠獲得比其他假設更好的擬合, 但是在測試數據集上卻不能很好地擬合數據,此時認為這個假設出現了過擬合的現象。(模型過於復雜)
- 欠擬合:一個假設在訓練數據上不能獲得更好的擬合,並且在測試數據集上也不能很好地擬合數據,此時認為這個假設出現了欠擬合的現象。(模型過於簡單)
2.原因&解決辦法
- 欠擬合原因以及解決辦法
- 原因:學習到數據的特征過少
- 解決辦法:
- 1)添加其他特征項,有時候我們模型出現欠擬合的時候是因為特征項不夠導致的,可以添加其他特征項來很好地解決。例如,“組合”、“泛化”、“相關性”三類特征是特征添加的重要手段,無論在什么場景,都可以照葫蘆畫瓢,總會得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作為特征添加的首選項。
- 2)添加多項式特征,這個在機器學習算法里面用的很普遍,例如將線性模型通過添加二次項或者三次項使模型泛化能力更強。
- 過擬合原因以及解決辦法
- 原因:原始特征過多,存在一些嘈雜特征, 模型過於復雜是因為模型嘗試去兼顧各個測試數據點
- 解決辦法:
- 重新清洗數據,導致過擬合的一個原因也有可能是數據不純導致的,如果出現了過擬合就需要我們重新清洗數據。
- 增大數據的訓練量,還有一個原因就是我們用於訓練的數據量太小導致的,訓練數據占總數據的比例過小。
- 正則化
- 減少特征維度,防止維災難
3.正則化
定義:
在解決回歸過擬合中,我們選擇正則化。但是對於其他機器學習算法如分類算法來說也會出現這樣的問題,除了一些算法本身作用之外(決策樹、神經網絡),我們更多的也是去自己做特征選擇,包括之前說的刪除、合並一些特征。
解決:
在學習的時候,數據提供的特征有些影響模型復雜度或者這個特征的數據點異常較多,所以算法在學習的時候盡量減少這個特征的影響(甚至刪除某個特征的影響),這就是正則化。
【注】
調整時候,算法並不知道某個特征影響,而是去調整參數得出優化的結果。
正則化類別:
- L2正則化
- 作用:可以使得其中一些W的都很小,都接近於0,削弱某個特征的影響
- 優點:越小的參數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象
- Ridge回歸
- L1正則化
- 作用:可以使得其中一些W的值直接為0,刪除這個特征的影響
- LASSO回歸
九、維災難
1.定義
隨着維度的增加,分類器性能逐步上升,到達某點之后,其性能便逐漸下降。
2.維數災難&過擬合
我們假設貓和狗圖片的數量是有限的(樣本數量總是有限的),假設有10張圖片,接下來我們就用這僅有的10張圖片來訓練我們的分類器。
增加一個特征,比如綠色,這樣特征維數擴展到了2維:
增加一個特征后,我們依然無法找到一條簡單的直線將它們有效分類
再增加一個特征,比如藍色,擴展到3維特征空間:
在3維特征空間中,我們很容易找到一個分類平面,能夠在訓練集上有效的將貓和狗進行分類:
在高維空間中,我們似乎能得到更優的分類器性能。
從1維到3維,給我們的感覺是:維數越高,分類性能越優。然而,維數過高將導致一定的問題:在一維特征空間下,我們假設一個維度的寬度為5個單位,這樣樣本密度為10/5=2;在2維特征空間下,10個樣本所分布的空間大小25,這樣樣本密度為10/25=0.4;在3維特征空間下,10個樣本分布的空間大小為125,樣本密度就為10/125=0.08.
如果繼續增加特征數量,隨着維度的增加,樣本將變得越來越稀疏,在這種情況下,也更容易找到一個超平面將目標分開。然而,如果我們將高維空間向低維空間投影,高維空間隱藏的問題將會顯現出來:
過多的特征導致的過擬合現象:訓練集上表現良好,但是對新數據缺乏泛化能力。
高維空間訓練形成的線性分類器,相當於在低維空間的一個復雜的非線性分類器,這種分類器過多的強調了訓練集的准確率甚至於對一些錯誤/異常的數據也進行了學習,而正確的數據卻無法覆蓋整個特征空間。為此,這樣得到的分類器在對新數據進行預測時將會出現錯誤。這種現象稱之為過擬合,同時也是維災難的直接體現。
簡單的線性分類器在訓練數據上的表現不如非線性分類器,但由於線性分類器的學習過程中對噪聲沒有對非線性分類器敏感,因此對新數據具備更優的泛化能力。換句話說,通過使用更少的特征,避免了維數災難的發生(也即避免了高維情況下的過擬合)
由於高維而帶來的數據稀疏性問題:假設有一個特征,它的取值范圍D在0到1之間均勻分布,並且對狗和貓來說其值都是唯一的,我們現在利用這個特征來設計分類器。如果我們的訓練數據覆蓋了取值范圍的20%(e.g 0到0.2),那么所使用的訓練數據就占總樣本量的20%。上升到二維情況下,覆蓋二維特征空間20%的面積,則需要在每個維度上取得45%的取值范圍。在三維情況下,要覆蓋特征空間20%的體積,則需要在每個維度上取得58%的取值范圍...在維度接近一定程度時,要取得同樣的訓練樣本數量,則幾乎要在每個維度上取得接近100%的取值范圍,或者增加總樣本數量,但樣本數量也總是有限的。
如果一直增加特征維數,由於樣本分布越來越稀疏,如果要避免過擬合的出現,就不得不持續增加樣本數量。
數據在高維空間的中心比在邊緣區域具備更大的稀疏性,數據更傾向於分布在空間的邊緣區域:
不屬於單位圓的訓練樣本比搜索空間的中心更接近搜索空間的角點。這些樣本很難分類,因為它們的特征值差別很大(例如,單位正方形的對角的樣本)。
一個有趣的問題是,當我們增加特征空間的維度時,圓(超球面)的體積如何相對於正方形(超立方體)的體積發生變化。尺寸d的單位超立方體的體積總是1 ^ d = 1.尺寸d和半徑0.5的內切超球體的體積可以計算為:
在高維空間中,大多數訓練數據駐留在定義特征空間的超立方體的角落中。如前所述,特征空間角落中的實例比圍繞超球體質心的實例難以分類。
在高維空間中,大多數訓練數據駐留在定義特征空間的超立方體的角落中。如前所述,特征空間角落中的實例比圍繞超球體質心的實例難以分類:
事實證明,許多事物在高維空間中表現得非常不同。 例如,如果你選擇一個單位平方(1×1平方)的隨機點,它將只有大約0.4%的機會位於小於0.001的邊界(換句話說,隨機點將沿任何維度“極端”這是非常不可能的)。 但是在一個10000維單位超立方體(1×1×1立方體,有1萬個1)中,這個概率大於99.999999%。 高維超立方體中的大部分點都非常靠近邊界。更難區分的是:如果你在一個單位正方形中隨機抽取兩個點,這兩個點之間的距離平均約為0.52。如果在單位三維立方體中選取兩個隨機點,則平均距離將大致為0.66。但是在一個100萬維的超立方體中隨機抽取兩點呢?那么平均距離將是大約408.25(大約1,000,000 / 6)!
非常違反直覺:當兩個點位於相同的單位超立方體內時,兩點如何分離?這個事實意味着高維數據集有可能非常稀疏:大多數訓練實例可能彼此遠離。當然,這也意味着一個新實例可能離任何訓練實例都很遠,這使得預測的可信度表現得比在低維度數據中要來的差。訓練集的維度越多,過度擬合的風險就越大。
理論上講,維度災難的一個解決方案可能是增加訓練集的大小以達到足夠密度的訓練實例。 不幸的是,在實踐中,達到給定密度所需的訓練實例的數量隨着維度的數量呈指數增長。 如果只有100個特征(比MNIST問題少得多),那么為了使訓練實例的平均值在0.1以內,需要比可觀察宇宙中的原子更多的訓練實例,假設它們在所有維度上均勻分布。
對於8維超立方體,大約98%的數據集中在其256個角上。結果,當特征空間的維度達到無窮大時,從采樣點到質心的最小和最大歐幾里得距離的差與最小距離本身只比趨於零:
距離測量開始失去其在高維空間中測量的有效性,由於分類器取決於這些距離測量,因此在較低維空間中分類通常更容易,其中較少特征用於描述感興趣對象。
如果理論無限數量的訓練樣本可用,則維度的詛咒不適用,我們可以簡單地使用無數個特征來獲得完美的分類。訓練數據的大小越小,應使用的功能就越少。如果N個訓練樣本足以覆蓋單位區間大小的1D特征空間,則需要N ^ 2個樣本來覆蓋具有相同密度的2D特征空間,並且在3D特征空間中需要N ^ 3個樣本。換句話說,所需的訓練實例數量隨着使用的維度數量呈指數增長。
十、正則化線性模型
- Ridge Regression 嶺回歸
- Lasso 回歸
- Elastic Net 彈性網絡
- Early stopping
1.Ridge Regression(領回歸,又名Tikhonov regularization)
嶺回歸是線性回歸的正則化版本,即在原來的線性回歸的 cost function 中添加正則項(regularization term):
以達到在擬合數據的同時,使模型權重盡可能小的目的,嶺回歸代價函數:
即
α=0:嶺回歸退化為線性回歸
2.Lasso Regression(Lasso 回歸)
Lasso 回歸是線性回歸的另一種正則化版本,正則項為權值向量的ℓ1范數。
Lasso回歸的代價函數 :
【注】
- Lasso Regression 的代價函數在 θi=0處是不可導的.
- 解決方法:在θi=0處用一個次梯度向量(subgradient vector)代替梯度,如下式
- Lasso Regression 的次梯度向量
Lasso Regression 有一個很重要的性質是:傾向於完全消除不重要的權重。
例如:當α 取值相對較大時,高階多項式退化為二次甚至是線性:高階多項式特征的權重被置為0。
也就是說,Lasso Regression 能夠自動進行特征選擇,並輸出一個稀疏模型(只有少數特征的權重是非零的)。
3.Elastic Net(彈性網絡)
彈性網絡在嶺回歸和Lasso回歸中進行了折中,通過 混合比(mix ratio) r 進行控制:
- r=0:彈性網絡變為嶺回歸
- r=1:彈性網絡便為Lasso回歸
彈性網絡的代價函數 :
一般來說,我們應避免使用朴素線性回歸,而應對模型進行一定的正則化處理,那如何選擇正則化方法呢?
小結:
-
常用:嶺回歸
-
假設只有少部分特征是有用的:
- 彈性網絡
- Lasso
- 一般來說,彈性網絡的使用更為廣泛。因為在特征維度高於訓練樣本數,或者特征是強相關的情況下,Lasso回歸的表現不太穩定。
-
api:
from sklearn.linear_model import Ridge, ElasticNet, Lasso
4.Early Stopping
Early Stopping 也是正則化迭代學習的方法之一。
其做法為:在驗證錯誤率達到最小值的時候停止訓練。
十一、線性回歸的改進——領回歸
1.API
- sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)
- 具有l2正則化的線性回歸
- alpha:正則化力度,也叫 λ
- λ取值:0~1 1~10
- solver:會根據數據自動選擇優化方法
- sag:如果數據集、特征都比較大,選擇該隨機梯度下降優化
- normalize:數據是否進行標准化
- normalize=False:可以在fit之前調用preprocessing.StandardScaler標准化數據
- Ridge.coef_:回歸權重
- Ridge.intercept_:回歸偏置
Ridge方法相當於SGDRegressor(penalty='l2', loss="squared_loss"),只不過SGDRegressor實現了一個普通的隨機梯度下降學習,推薦使用Ridge(實現了SAG)
- sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)
- 具有l2正則化的線性回歸,可以進行交叉驗證
- coef_:回歸系數
class _BaseRidgeCV(LinearModel): def __init__(self, alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False,scoring=None, cv=None, gcv_mode=None, store_cv_values=False):
2.正則化程度的變化對結果的影響
- 正則化力度越大,權重系數會越小
- 正則化力度越小,權重系數會越大
十二、模型的保存&加載
1.API
from sklearn.externals import joblib
- 保存:joblib.dump(estimator, 'test.pkl')
- 加載:estimator = joblib.load('test.pkl')
2.線性回歸的模型保存&加載例子
def load_dump_demo(): """ 線性回歸:嶺回歸 :return: """ # 1.獲取數據 data = load_boston() # 2.數據集划分 x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22) # 3.特征工程-標准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.fit_transform(x_test) # 4.機器學習-線性回歸(嶺回歸) # # 4.1 模型訓練 # estimator = Ridge(alpha=1) # estimator.fit(x_train, y_train) # # # 4.2 模型保存 # joblib.dump(estimator, "./data/test.pkl") # 4.3 模型加載 estimator = joblib.load("./data/test.pkl") # 5.模型評估 # 5.1 獲取系數等值 y_predict = estimator.predict(x_test) print("預測值為:\n", y_predict) print("模型中的系數為:\n", estimator.coef_) print("模型中的偏置為:\n", estimator.intercept_) # 5.2 評價 # 均方誤差 error = mean_squared_error(y_test, y_predict) print("誤差為:\n", error)