機器學習實戰-基本算法總結2

機器學習基本算法總結

☞監督學習——迴歸

代碼在這,基於python3(原書代碼是python2)

這裏只是一個總結,原書已經講解很清楚了,不清楚的直接看代碼

目錄

==========================

一、預測數值型數據:迴歸

1.線性迴歸最佳擬合

———————————————————————————————————- 
- 優點:結果易於理解,計算上不復雜。
- 缺點:對非線性的數據擬合不好。
- 適用數據類型:數值型和標稱型數據。
———————————————————————————————————- 
———————————————————————————————————- 
- 訓練算法:找到迴歸係數。
- 測試算法:使用幻或者預測值和數據的擬合度,來分析模型的效果。
- 使用算法:使用迴歸,可以在給定輸入的時候預測出一個數值,這是對分類方法的提升,因爲這樣可以預測連續型數據而不僅僅是離散的類別標籤。
———————————————————————————————————- 

  前面講到的基本都是分類問題,分類問題的目標變量是標稱型數據,或者離散型數據。而回歸的目標變量爲連續型,也即是迴歸對連續型變量做出預測,最直接的辦法是依據輸入寫出一個目標值的計算公式,這樣,對於給定的輸入,利用該公式可以計算出相應的預測輸出。這個公式稱爲迴歸方程,而求迴歸方程顯然就是求該方程的迴歸係數,而一旦有了這些迴歸係數,再給定輸入,就可以將這些迴歸係數乘以輸入值,就得到了預測值。
  線性迴歸,簡單而言,就是將輸入項分別乘以一些常量,再將結果加起來得到輸出。假設輸入數據存放在矩陣x中,而回歸係數存放在向量w中,那麼對於給定的數據x1,預測結果將會通過y=xTw給出。那麼,如何才能夠找出最佳的迴歸係數向量w呢?採用最小化平方誤差來進行度量。

(1)(yixiTW)2,i=1,2,3......N(N)

這樣,用矩陣表示可以寫成(yX·w)T(yX·w) 因爲要求函數的極小值,再對w求導得,xT(yX·w) ,則令其等於0,即可得到w的最優解:

w=(XTX)1XT·y

 需要注意的是,公式中,出現的求逆運算,而對於任意一個矩陣而言,不一定可逆,所以,我們在實際寫代碼過程中,需要事先確定矩陣是否可逆,否則很可能會造成程序出現嚴重的錯誤。
  此外,我們知道線性迴歸的方程的一般形式爲:y=wx+b ;即存在一定的偏移量b,於是,我們可以將回歸係數和特徵向量均增加一個維度,將函數的偏移值b也算作迴歸係數的一部分,佔據迴歸係數向量中的一個維度,比如w=(b,w1,w2,...,wN) 。相應地,將每條數據特徵向量的第一個維度設置爲1.0。
  
  最後,通過上面的數據我們可以得到一個擬合的線性迴歸模型,但是我們還需要驗證該模型的好壞。如果將所有樣本的真實值y保存於一個數列,將所有的預測值yHat保存在另外一個數列,那麼我們可以通過計算這兩個序列的相關係數,來度量預測值與真實值得匹配程度。相關性最好爲1,最差爲0,表示不相關。
  

2.局部加權線性迴歸

  線性迴歸的一個問題是有可能出現欠擬合現象,因爲它求的是具有最小均方誤差的無偏估計。顯而易見,如果模型欠擬合將不能取得最好的預測效果。所以有些方法允許在估計中引人一些偏差,從而降低預測的均方誤差。
  解決上述問題的一個方法即是局部加權線性迴歸(LWLR)。即在算法中,爲每一個待預測的數據點附近的賦予一定的權重,越靠近預測點的數據點分配的權重越高。這裏,我們採用高斯核函數爲預測點附近的數據點分配權重,即:
  

w(i,i)=exp(|x(i)x|2k2)

  其中參數k可以由用戶自己定義。顯然,有上面高斯核函數可知,矩陣W是一個只含對角元素的矩陣。這樣,迴歸係數的解的形式變爲:w=(XTWX)1(XTWY)
  需要說明的是,當爲某一預測點附近的數據點分配權重時,由高斯核函數公式可知,與預測點越相近的點分配得到的權重越大,否則權重將以指數級衰減,與預測點足夠遠的數據點權重接近0,那麼這些數據點將不會在該次預測中起作用。當然,用戶可以通過自己設定參數k來控制衰減的速度,如果k值較大,衰減速度較慢,這樣就會有更多的數據點共同參與決策;否則,如果參數k非常小,那麼衰減速度極快,參與預測點決策的數據點就很少。所以,我們在實驗中,應該多選擇幾組不同的k值,得到不同的迴歸模型,從而找到最優的迴歸模型對應的k值。
  此外,局部加權線性迴歸也存在一定的問題,相對於普通的線性迴歸,由於引入了權重,大大增加了計算量,雖然取得了不錯的擬合效果,但也相應地付出了計算量的代價。

3.縮減係數”理解”數據的方法

  試想,如果此時數據集樣本的特徵維度大於樣本的數量,此時我們還能採取上面的線性迴歸方法求出最佳擬合參數麼?顯然不可能,因爲當樣本特徵維度大於樣本數時,數據矩陣顯然是非滿秩矩陣,那麼對非滿秩矩陣求逆運算會出現錯誤。

3.1 嶺迴歸

  簡單而言,嶺迴歸即是在矩陣xTx 上加入一個λI 從而使得矩陣非奇異,進而能對矩陣XTX+λI 求逆。其中矩陣I 是一個單位矩陣,即對角線上元素皆爲1,其他均爲0。這樣,迴歸係數的計算公式變爲:
  

w=(XTX+λI)1(XTy)

  公式中通過引入該懲罰項,從而減少不重要的參數,更好的理解和利用數據。此外,增加了相關約束:Σwi2<=λ ,即迴歸係數向量中每個參數的平方和不能大於λ,這就避免了當兩個或多個特徵相關時,可能出現很大的正係數和很大的負係數。嶺迴歸就是一種縮減方法,通過此方法可以去掉不重要的參數,更好的理解數據的重要性和非重要性,從而更好的預測數據。 
  在嶺迴歸算法中,通過預測誤差最小化來得到最優的λ 值。數據獲取之後,將數據隨機分成兩部分,一部分用於訓練模型,另一部分則用於測試預測誤差。爲了找到最優的λ ,可以選擇多個不同λ 值重複上述測試過程,最終得到一個使預測誤差最小的λ
  注:嶺迴歸中數據需要進行標準化處理,即數據的每一維度特徵減去相應的特徵均值之後,再除以特徵的方差。可以看出,當λ非常小時,係數與普通迴歸一樣。而λ非常大時,所有迴歸係數縮減爲0。這樣,可以在中間的某處找到使得預測結果最好的λ。
3.2 逐步前向迴歸

  逐步前向迴歸是一種貪心算法,即每一步都儘可能的減小誤差。從一開始,所有的權重都設爲1,然後每一步所做的決策是對某個權重增加或減少一個較小的數值。
數據標準化,使其分佈滿足均值爲0,和方差爲1
在每輪的迭代中:
設置當前最小的誤差爲正無窮
對每個特徵:
 增大或減小:
  改變一個係數得到一個新的w
  計算新w下的誤差
  如果誤差小於當前最小的誤差:設置最小誤差等於當前誤差
  將當前的w設置爲最優的w,
將本次迭代得到的預測誤差最小的w存入矩陣中
返回多次迭代下的迴歸係數組成的矩陣

前向逐步迴歸算法也屬於縮減算法。它主要的優點是可以幫助我們更好地理解現有的模型並作出改進。當構建出一個模型時,可以運行該算法找出重要的特徵,這樣就可能及時停止對不重要特徵的收集。同樣,在算法測試的過程中,可以使用s折交叉驗證的方法,選擇誤差最小的模型。

此外,當我們不管是應用嶺迴歸還是前向逐步迴歸等縮減算法時,就相應的爲模型增加了偏差,與此同時也就減小了模型的方差。而最優的模型往往是在模型偏差和方差的折中時獲得。否則,當模型方差很大偏差很小時模型複雜度很大而出現過擬合現象,而方差很小偏差很大時而容易出現欠擬合現象。因此,權衡模型的偏差和方差可以做出最好的預測。

總結

(1) 迴歸與分類的區別,前者預測連續型變量,後者預測離散型變量;迴歸中求最佳係數的方法常用的是最小化誤差的平方和;如果xTx 可逆,那麼迴歸算法可以使用;可以通過預測值和原始值的相關係數來度量回歸方程的好壞。

(2) 當特徵數大於樣本總數時,爲解決xTx 不可逆的問題,我們可以通過引入嶺迴歸來保證能夠求得迴歸係數。

(3) 另外一種縮減算法是,前向逐步迴歸算法,它是一種貪心算法,每一步通過修改某一維度特徵方法來減小預測誤差,最後通過多次迭代的方法找到最小誤差對應的模型。

(4) 縮減法可以看做是對一個模型增加偏差的同時減少方差,通過偏差方差折中的方法,可以幫助我們理解模型並進行改進,從而得到更好的預測結果。

==============================================================

二、樹迴歸<

  
優點:可以對複雜和非線性的數據建模。
缺點:結果不易理解。
適用數據類型:數值型和標稱型數據。

訓練:大部分時間都花費在葉節點樹模型的構建上。
測試:使用測試數據上的^ 值來分析模型的效果。
使用:使用訓練出的樹做預測,預測結果還可以用來做很多事情

==================================================
  儘管線性迴歸包含了一些強大的方法,但這些方法創建的模型需要擬合所有的樣本數據。當數據擁有衆多特徵並且特徵之間的關係比較複雜時,構建全局線性模型就會非常困難。並且,在實際生活中很多問題都是非線性的,很難通過全局線性模型來擬合所有數據。
  解決上述非線性數據的擬合問題的一個可行的方法是,將數據集切分成很多份容易建模的數據,然後再利用線性迴歸方法來對切分後的數據子集分別建模如果切分後仍難以擬合線性模型就繼續切分。這樣,就可以比較好的擬合全局數據。

1. CART算法——迴歸樹

  CART算法,即分類迴歸樹算法,該算法既可以用於分類,也可以用於迴歸。該算法數據的建模方法爲二元切分法。
  ID3決策樹算法通過不斷將數據切分成小數據集,知道所有目標變量完全相同,或者數據不能再切分爲止;決策樹是一種貪心算法,要在給定時間內找到最佳選擇,並並不關心全局最優問題。
  ID3決策樹算法存在以下兩個問題:
  (1)ID3算法每次選取最佳特徵來分割數據,並按照該特徵所有的取值來切分,即有幾種可能的取值,數據就會被切分成幾份。而一旦按該特徵切分後,該特徵在之後的算法執行過程中便不再起作用了,所以存在一些觀點認爲該算法過於迅速。
  (2)ID3算法並不能處理連續型特徵,只能事先將連續性特徵轉化爲離散型,才能使用。顯然,在轉換過程中會破壞連續型變量的內在性質。
  
  相比於ID3算法,顯然CART算法更有優勢,因爲我們知道CART算法不僅可以用於分類,還可以用於迴歸,這裏的迴歸即是處理連續型特徵的體現。CART算法之所以能夠處理連續型特徵,就在於採用了二元切分法,而使用二元切分法易於對樹構建過程進行調整以處理連續型特徵。二元切分法的具體過程爲每次將數據集劃分爲兩份,如果數據的某特徵值大於給定值就進入左子樹,否則就進入右子樹

CART算法樹的構建:

  CART算法既可以用於分類也可以用於迴歸,迴歸樹與分類樹思路類似,但葉節點的數據不是類型不是離散型,而是連續型。這裏,我們將通過CART算法構建兩種樹,一種是迴歸樹,其每個葉節點包含單個值;另外一種是模型樹,其每個葉節點包含一個線性方程。
  首先,這裏採用跟ID3算法中使用相同的字典結果來存儲構建樹的數據結構。在這裏,CART算法構建樹包含四個主要元素,待切分特徵,待切分的特徵值,左子樹(當數據不能再切分時,也可以是葉節點),右子樹
  

CART算法用於迴歸:

對每個特徵:
  對每個特徵值:
    將數據集切分爲兩份
    計算切分誤差
    如果當前誤差小於當前最小誤差,那麼將當前切分設定爲最佳切分並更新最小誤差
返回最佳切分的特徵和閾值

樹剪枝

上面我們利用迴歸樹構建算法構建了迴歸樹,雖然看起來效果不錯,但是我們還要需要某種有效的措施來檢查構建過程是否得當。這就是樹剪枝技術,它通過對決策樹剪枝的方式來達到更好的預測效果, 一棵樹如果節點過多,表明該模型可能對數據進行了過擬合,一旦發生了過擬合,就表明該模型對訓練數據擬合效果非常好,而對其他的測試數據擬合效果很差的情況。所以,爲避免過擬合,我們需要通過剪枝的方式來降低模型的複雜度。
剪枝包括預剪枝和後剪枝兩種方法。

(1)預剪枝
  預剪枝的方法,即通過設置合理的切分終止條件tolS,tolN,在樹構建的過程中進行剪枝過程,從而防止過擬合。在預剪枝過程中,我們需要不斷的修改停止條件tolS,tolN來得到較好的結果,這顯然不能算作是一種好的辦法,因爲,尋找到合適的停止條件意味着需要更多的時間損耗。而後剪枝則不需要用戶指定參數,是一種比較理想的剪枝方法
  
(2)後剪枝
  後剪枝的方法意味着我們需要兩個不同的數據集,一個作爲訓練集,另外一個作爲測試集。訓練集構建出來的樹需要足夠大,足夠複雜,這樣才能便於後面的剪枝。接下來,從上而下找到葉節點,用測試集判斷將這些葉節點合併是否能降低測試誤差。如果是那就將這些葉節點合併。
基於已有的樹切分測試數據:
  如果存在任一子集是一棵樹,則在該子集上遞歸剪枝過程
  計算將當前兩個葉節點合併後的誤差
  計算不合並的誤差
  如果合併會降低誤差,就將兩個葉節點合併  

模型樹構建

  迴歸樹計算誤差的方法是,首先計算數據集目標變量值的均方差,再乘以數據集的樣本數;而模型樹的誤差計算方法爲:首先計算數據集各個樣本目標變量的真實值與預測值得差值的平方,然後再進行累加,即類似於前面的平方損失函數。
  上面的構建的迴歸樹,是將葉節點設定爲常數值來進行建模。還有一種方法是把葉節點設爲分段線性函數,這裏的分段線性是指模型由多個線性片段組成。因爲,數據集不是線性的,那麼我們很難通過全局線性函數來擬合數據,所以採用將數據集分段,分段後的數據都滿足線性要求,這樣就分別構建出相應的線性方程,再將分段線性模型組合起來就是全局的模型。比如,下圖分段線性數據,顯然使用兩條直線組合來擬合會比一條直線擬合效果要好。

小結

  在實際生活中,數據集經常會包含一些複雜的相互關係,輸入數據與目標變量之間呈現出非線性關係。對這些複雜數據建模,我們可以採用樹迴歸的方法來對數據進行分段線性預測,分段線性函數包括分段常數(迴歸樹模型)和分段直線方程(模型樹);二者的區別在於構建樹的葉節點模型上,若葉節點採用分段常數則是迴歸樹,若使用的模型是線性迴歸方程則稱爲模型樹。
  上面用到的樹構建方法,是基於CART算法的二元切分法,通過計算最小誤差的方法得到切分該數據集的最佳特徵以及最佳的特徵取值,從而來對數據集進行二元劃分。
  很顯然,CART算法是一種貪心算法,更多的是關心最佳切分特徵及特徵值的選取上,而不關注全局模型的最優解。所以,大多時候,該算法構建的樹會產生過擬合情況,即對訓練數據擬合很好,而對測試數據擬合效果較差。
  預剪枝和後剪枝是兩種對決策樹剪枝從而降低模型複雜度的方法,前者在樹構建的過程中邊構建邊剪枝,後者則是先利用訓練集構建出樹,在對構建的樹利用測試集進行剪枝處理;從效果來看,預剪枝要比後剪枝要好;但是,預剪枝需要用戶提供合理的輸入,對用戶輸入的參數較爲敏感,從這方面來看,後剪枝因爲不需要用戶的參與而更加理想。在實際的構建樹過程中,往往採用兩種方法結合的方法對於尋求最佳模型效果較好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章