Infi-chu:python
http://www.cnblogs.com/Infi-chu/算法
1、線性迴歸應用場景api
2、線性迴歸基本概念網絡
1.定義dom
線性迴歸(Linear regression)是利用迴歸方程(函數)對一個或多個自變量(特徵值)和因變量(目標值)之間關係進行建模的一種分析方式。機器學習
2.特色ide
只有一個自變量的狀況稱爲單變量回歸,多於一個自變量狀況的叫作多元迴歸。函數
3.公式性能
【注】學習
其中w,x能夠理解爲矩陣
eg.
原方程:
轉化爲矩陣:
從列的角度看:
4.應用舉例
特徵值與目標之間創建了一個關係,這個關係能夠理解爲線性模型。
5.線性模型:
【注】
單特徵與目標值的關係呈直線關係,或者兩個特徵與目標值呈現平面的關係。
【注】
3、線性迴歸API
1.API
sklearn.linear_model.LinearRegression()
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]])
4、求導
1.經常使用數學公式
2.運算法則
3.矩陣求導
5、線性迴歸的損失和優化
1.例子引入
房屋價格與真實的數據之間存在這樣的關係:
真實關係:真實房子價格 = 0.02×中心區域的距離 + 0.04×城市一氧化氮濃度 + (-0.12×自住房平均房價) + 0.254×城鎮犯罪率
再隨機指定一個關係:
隨機指定關係:預測房子價格 = 0.25×中心區域的距離 + 0.14×城市一氧化氮濃度 + 0.42×自住房平均房價 + 0.34×城鎮犯罪率
2.損失函數
定義:
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) |
6、 梯度降低方法
常見的梯度降低算法有:
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.補充:
如下這些算法主要用於深度學習優化
7、API
8、欠擬合&過擬合
1.定義
2.緣由&解決辦法
3.正則化
定義:
在解決迴歸過擬閤中,咱們選擇正則化。可是對於其餘機器學習算法如分類算法來講也會出現這樣的問題,除了一些算法自己做用以外(決策樹、神經網絡),咱們更多的也是去本身作特徵選擇,包括以前說的刪除、合併一些特徵。
解決:
在學習的時候,數據提供的特徵有些影響模型複雜度或者這個特徵的數據點異常較多,因此算法在學習的時候儘可能減小這個特徵的影響(甚至刪除某個特徵的影響),這就是正則化。
【注】
調整時候,算法並不知道某個特徵影響,而是去調整參數得出優化的結果。
正則化類別:
9、維災難
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個樣本。換句話說,所需的訓練實例數量隨着使用的維度數量呈指數增加。
10、正則化線性模型
1.Ridge Regression(領回歸,又名Tikhonov regularization)
嶺迴歸是線性迴歸的正則化版本,即在原來的線性迴歸的 cost function 中添加正則項(regularization term):
以達到在擬合數據的同時,使模型權重儘量小的目的,嶺迴歸代價函數:
即
α=0:嶺迴歸退化爲線性迴歸
2.Lasso Regression(Lasso 迴歸)
Lasso 迴歸是線性迴歸的另外一種正則化版本,正則項爲權值向量的ℓ1範數。
Lasso迴歸的代價函數 :
【注】
Lasso Regression 有一個很重要的性質是:傾向於徹底消除不重要的權重。
例如:當α 取值相對較大時,高階多項式退化爲二次甚至是線性:高階多項式特徵的權重被置爲0。
也就是說,Lasso Regression 可以自動進行特徵選擇,並輸出一個稀疏模型(只有少數特徵的權重是非零的)。
3.Elastic Net(彈性網絡)
彈性網絡在嶺迴歸和Lasso迴歸中進行了折中,經過 混合比(mix ratio) r 進行控制:
彈性網絡的代價函數 :
通常來講,咱們應避免使用樸素線性迴歸,而應對模型進行必定的正則化處理,那如何選擇正則化方法呢?
小結:
經常使用:嶺迴歸
假設只有少部分特徵是有用的:
api:
from sklearn.linear_model import Ridge, ElasticNet, Lasso
4.Early Stopping
Early Stopping 也是正則化迭代學習的方法之一。
其作法爲:在驗證錯誤率達到最小值的時候中止訓練。
11、線性迴歸的改進——領回歸
1.API
Ridge方法至關於SGDRegressor(penalty='l2', loss="squared_loss"),只不過SGDRegressor實現了一個普通的隨機梯度降低學習,推薦使用Ridge(實現了SAG)
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.正則化程度的變化對結果的影響
12、模型的保存&加載
1.API
from sklearn.externals import joblib
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)