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

機器學習基本算法總結

☞監督學習——分類

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

這裏只是一個總結,原書已經講解很清楚了,不清楚的直接看代碼,或者李航的統計學習方法也有公式推導。

目錄1

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

一、k-近鄰算法(kNN)

1.概述

k-NN算法是最簡單的分類算法,主要的思想是計算待分類樣本與訓練樣本之間的差異性,並將差異按照由小到大排序,選出前面K個差異最小的類別,並統計在K箇中類別出現次數最多的類別爲最相似的類,最終將待分類樣本分到最相似的訓練樣本的類中。與投票(Vote)的機制類似。
k-近鄰算法是基於實例的學習,使用算法時我們必須有接近實際數據的訓練樣本數
據。

  • 優點:精度高,對異常值不敏感,無數據輸入假定
  • 缺點:時間和空間複雜度高,無法獲取樣本特徵
  • 數據:數值型和標稱型

2.算法介紹

  • 訓練算法:此步驟不適用於k-臨近算法
  • 測試算法:計算錯誤率
  • 使用算法:首先需要輸入樣本數據和結構化的輸出結果,然後運行k-臨近算法判定輸入數據分別屬於哪個分類,最後應用對計算出的分類執行後續處理。
##2.1 錯誤率

error_rate=分錯的樣本數量 / 總樣本數量

##2.2 歸一化

newvalue=(oldvalue-min) / (mx-min)

3.僞代碼

對未知類別屬性的數據集中的每個點依次執行以下操作:
(1)計算已知類別數據集中的點與當前點之間的距離;
(2)按照距離遞增次序排序;
(3)選取與當前點歐氏距離最小的k個點
(4)確定前k個點所在類別的出現頻率;
(5)返回前k個點出現頻率最高的類別作爲當前點的預測分類。

4.實例

1、約會網站配對案例

某人將對象分爲三類人,不喜歡的人,魅力一般的人,極具魅力的人。
這裏實現的過程是,給定一個人的數據,進行打分預測屬於哪類人,從而幫助用戶是否選擇相親進行決策。

2、手寫數字識別實戰案例

5.存在的問題及解決方法、總結

算法小結:
(1)如果我們改變訓練樣本的數目,調整相應的k值,都會對最後的預測錯誤率產生影響,我們可以根據錯誤率的情況,對這些變量進行調整,從而降低預測錯誤率

(2)k近鄰算法是基於實例的學習,使用算法時我們必須有接近實際數據的訓練樣本數據。k近鄰算法必須保存全部數據集,如果訓練數據集很大,必須使用大量的存儲空間。此外,由於必須對數據集中的每個數據計算距離,實際使用時也可能會非常耗時
(3)此外,k近鄰算法無法給出數據的基礎結構信息,因此我們無法知道平均實例樣本和典型實例樣本具有怎樣的特徵。

1、計算複雜度的問題
  在K-NN算法中,每一個預測樣本需要與所有的訓練樣本計算相似度,計算量比較大。比較常用的方法有K-D樹,局部敏感哈希等等

2、K-NN的均勻投票
  在上述的K-NN算法中,最終對標籤的選擇是通過投票的方式決定的,在投票的過程中,每一個訓練樣本的投票的權重是相等的,
  (1)可以對每個訓練樣本的投票加權,以期望最相似的樣本有更高的決策權。
  (2)歸一化。

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

二、決策樹ID3

1.概述

  k-近鄰算法可以完成很多分類任務,但是它最大的缺點就是無法給出數據的內在含義,決策樹的主要優勢就在於數據形式非常容易理解。

  決策樹算法是從數據的屬性(或者特徵)出發,以屬性作爲基礎,劃分不同的類。
  實現決策樹的算法有很多種,有ID3、C4.5和CART等算法。

  • 優點:計算複雜度不高,輸出結果易於理解,對中間值的缺失不敏感,可以處理不相關特徵數據。
  • 缺點:可能會產生過度匹配問題。
  • 數據:數值型和標稱型

2.算法介紹

  • 訓練算法:構造樹的數據結構。
  • 測試算法:使用經驗樹計算錯誤率。
  • 使用算法:此步驟可以適用於任何監督學習算法,而使用決策樹可以更好地理解數據
    的內在含義。
2.1 ID3算法

  ID3算法是由Quinlan首先提出的,該算法是以信息論爲基礎,以信息熵和信息增益爲衡量標準,從而實現對數據的歸納分類。
(1) 在ID3算法中,選擇信息增益最大的屬性作爲當前的特徵對數據集分類。
(2) 判斷劃分結束,第一種爲劃分出來的類屬於同一個類,第二種爲遍歷完所有劃分數據集的屬性。

2.2 信息增益

   ID3算法是以信息熵和信息增益作爲衡量標準的分類算法。
  熵的概念主要是指信息的混亂程度,變量的不確定性越大,熵的值也就越大,熵定義爲信息的期望值。
符號xi 的信息定義爲:

(1)l(xi)=log2p(xi)

  其中p(xi) 是選擇該分類的概率。
  爲了計算熵,我們需要計算所有類別所有可能值包含的信息期望值,通過下面的公式得到:
(2)H=i=1np(xi)log2p(xi)

  劃分數據集的大原則是:將無序的數據變得更加有序。在劃分數據集之前之後信息發生的變化稱爲信息增益,,獲得信息增益最高的特徵就是最好的選擇。

3.僞代碼

對未知類別屬性的數據集中的每個點依次執行以下操作:
(1)選擇特徵
(2)劃分數據集——尋找劃分數據集的最好特徵,創建分支節點
(3)滿足終止條件
(4)滿足就結束,不滿足則回到(1)

4.實例

4.1 預測眼鏡蛇類型

存在過度匹配問題

5.存在的問題及解決方法

1、過度匹配數據集

   裁剪決策樹,合併相鄰無法產生大量信息增益的葉節點,消除過度匹配問題。

  當決策樹的複雜度較大時,很可能會造成過擬合問題。此時,我們可以通過裁剪決策樹的辦法,降低決策樹的複雜度,提高決策樹的泛化能力。比如,如果決策樹的某一葉子結點只能增加很少的信息,那麼我們就可將該節點刪掉,將其併入到相鄰的結點中去,這樣,降低了決策樹的複雜度,消除過擬合問題。

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

三、基於概率論的分類方法:樸素貝葉斯

1.概述

  前兩章的KNN分類算法和決策樹分類算法最終都是預測出實例的確定的分類結果,但是,有時候分類器會產生錯誤結果;本章要學的樸素貝葉斯分類算法則是給出一個最優的猜測結果,同時給出猜測的概率估計值。利用已知值估計未知概率

  • 優點:在數據較少的情況下仍然有效,可以處理多類別問題。
  • 缺點:對於輸入數據的準備方式較爲敏感。
  • 適用數據類型:標稱型數據

2.算法介紹

  • 訓練算法:計算不同的獨立特徵的條件概率。
  • 測試算法:計算錯誤率。
  • 使用算法:一個常見的樸素貝葉斯應用是文檔分類。可以在任意的分類場景中使_用樸素貝葉斯命類器,不一定非要是文本。輸入數據分別屬於哪個分類,最後應用對計算出的分類執行後續處理。
2.1 條件概率

(1)P(c|x)=P(c,x)P(x)=P(x|c)P(c)P(x)
2.2 如何使用條件概率進行分類

  假設這裏要被分類的類別有兩類,類c1和類c2,那麼我們需要計算概率p(c1|x,y)和p(c2|x,y)的大小並進行比較:

如果:p(c1|x,y)>p(c2|x,y),則(x,y)屬於類c1

     p(c1|x,y)<p(c2|x,y),則(x,y)屬於類c2

  我們知道p(x,y|c) 的條件概率所表示的含義爲:已知類別c條件下,取到點(x,y)的概率;那麼p(c|x,y) 所要表達的含義呢?顯然,我們同樣可以按照條件概率的方法來對概率含義進行描述,即在給定點(x,y)的條件下,求該點屬於類c的概率值。那麼這樣的概率該如何計算呢?顯然,我們可以利用貝葉斯準則來進行變換計算:

(2)p(ci|x,y)=p(x,y|ci)p(ci)p(x,y)

上述公式寫爲:
(3)p(ci|w)=p(w|ci)p(ci)p(w)

3.僞代碼

樸素貝葉斯完成文檔分類依次執行以下操作:
計算每個類別文檔的數目
計算每個類別佔總文檔數目的比例

  • 對每一篇文檔:
      - 對每一個類別:
        - 如果詞條出現在文檔中->增加該詞條的計數值#統計每個類別中出現的詞條的次數
        - 增加所有詞條的計數值#統計每個類別的文檔中出現的詞條總數
      - 對每個類別:
        - 將各個詞條出現的次數除以類別中出現的總詞條數目得到條件概率
  • 返回每個類別各個詞條的條件概率和每個類別所佔的比例

4.實例

1、文檔分類
  • 針對算法的部分改進

1)計算概率時,需要計算多個概率的乘積以獲得文檔屬於某個類別的概率,即計算p(w0|ci)p(w1|ci)…p(wN|ci),然後當其中任意一項的值爲0,那麼最後的乘積也爲0.爲降低這種影響,採用拉普拉斯平滑,在分子上添加a(一般爲1),分母上添加ka(k表示類別總數),即在這裏將所有詞的出現數初始化爲1,並將分母初始化爲2*1=2

2)解決下溢出問題
  正如上面所述,由於有太多很小的數相乘。計算概率時,由於大部分因子都非常小,最後相乘的結果四捨五入爲0,造成下溢出或者得不到準確的結果,所以,我們可以對成績取自然對數,即求解對數似然概率。這樣,可以避免下溢出或者浮點數舍入導致的錯誤。同時採用自然對數處理不會有任何損失。

3)上面也提到了關於如何選取文檔特徵的方法,上面用到的是詞集模型,即對於一篇文檔,將文檔中是否出現某一詞條作爲特徵,即特徵只能爲0不出現或者1出現;然後,一篇文檔中詞條的出現次數也可能具有重要的信息,於是我們可以採用詞袋模型,在詞袋向量中每個詞可以出現多次,這樣,在將文檔轉爲向量時,每當遇到一個單詞時,它會增加詞向量中的對應值

2、過濾垃圾郵件
  • 切分數據
      這樣就得到了一系列詞組成的詞表,但是裏面的空字符串還是需要去掉,此時我們可以通過字符的長度,去掉長度等於0的字符。並且,由於我們是統計某一詞是否出現,不考慮其大小寫,所有還可以將所有詞轉爲小寫字符,即lower(),相應的,轉爲大寫字符爲upper()
      此外,需要注意的是,由於是URL,因而可能會出現en和py這樣的單詞。當對URL進行切分時,會得到很多的詞,因此在實現時也會過濾掉長度小於3的詞。當然,也可以根據自己的實際需要來增加相應的文本解析函數。

  • 交叉驗證
      代碼中,採用隨機選擇的方法從數據集中選擇訓練集,剩餘的作爲測試集。這種方法的好處是,可以進行多次隨機選擇,得到不同的訓練集和測試集,從而得到多次不同的錯誤率,我們可以通過多次的迭代,求取平均錯誤率,這樣就能得到更準確的錯誤率。這種方法稱爲留存交叉驗證

3、樸素貝葉斯從個人廣告中獲取區域傾向

  在本例中,我們通過從不同的城市的RSS源中獲得的同類型廣告信息,比較兩個城市人們在廣告用詞上是否不同。如果不同,那麼各自的常用詞是哪些?而從人們的用詞當中,我們能否對不同城市的人所關心的內容有所瞭解?如果能得到這些信息,分析過後,相信對於廣告商而言具有不小的幫助。
  需要說明的是,這裏用到了將出現次數最多的30個單詞刪除的方法,結果發現去掉了這些最常出現的高頻詞後,錯誤率大幅度上升,這表明了文本中的小部分高頻單詞佔據了文本中絕大部分的用詞。產生這種情況的原因是因爲語言中大部分是冗餘和結果輔助性內容。所以,我們不僅可以嘗試移除高頻詞的方法,還可以進一步從某個預定詞表(停用詞表)中移除結構上的輔助詞,通過移除輔助性詞,分類錯誤率會所有下降

 此外,爲了得到錯誤率的精確估計,應進行多次上述實驗,從而得到錯誤率平均值。

5.存在的問題及解決方法

  樸素貝葉斯在數據較少的情況下仍然適用,雖然例子中爲兩類類別的分析,但是樸素貝葉斯可以處理多分類的情況;樸素貝葉斯的一個不足的地方是,對輸入的數據有一定的要求,需要花費一定的時間進行數據的處理和解析。樸素貝葉斯中用來計算的數據爲標稱型數據,我們需要將字符串特徵轉化爲相應的離散值,用於後續的統計和計算。

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

四、Logistic迴歸

1.概述

ogistic迴歸是一種簡單的分類算法,利用logistic迴歸進行分類的主要思想是:根據現有數據對分類邊界線建立迴歸公式,以此進行分類。
而“迴歸”也就意味着最佳擬合。要進行最佳擬合,則需要尋找到最佳的擬合參數,一些最優化方法就可以用於最佳迴歸係數的確定。

我們知道,logistic迴歸主要是進行二分類預測,也即是對於0~1之間的概率值,當概率大於0.5預測爲1,小於0.5預測爲0.顯然,我們不能不提到一個函數,即sigmoid=11+ez ,該函數的曲線類似於一個s型,在x=0處,函數值爲0.5.

  • 優點:計算代價不高,易於理解和實現。
  • 缺點:容易欠擬合,分類精度可能不高。 .
  • 適用數據類型:數值型和標稱型數據。

2.算法介紹

  • 訓練算法:大部分時間將用於訓練,訓練的目的是爲了找到最佳的分類迴歸係數。
  • 測試算法:一旦訓練步驟完成,分類將會很快。
  • 使用算法:首先,我們需要輸入一些數據,並將其轉換成對應的結構化數值;
    接着,基於訓練好的迴歸係數就可以對這些數值進行簡單的迴歸計算,判定它們屬於哪個類別,在這之後,我們就可以奪輸出的類別上做一些其他分析工作。
2.1 確定最佳迴歸係數

sigmoid函數的輸入記爲z,即

(1)z=w0x0+w1x1+w2x2+...+wnxn

記爲:
(1)z=wTx

最優化方法有基於梯度的梯度下降法梯度上升法改進的隨機梯度上升法等等。基於梯度的優化方法在求解問題時,本身對要求解的問題有要求:即問題本身必須是可導的。其次,基於梯度的方法會使得待優化問題陷入局部最優。此時,一些啓發式優化方法可以很好的解決這樣的問題,但是啓發式算法的求解速度較慢,佔用內存較大。
(1)梯度上升它的基本思想是:要找到某函數的最大值,最好的方法就是沿着該函數的梯度方向搜尋。如果函數爲f,梯度記爲D,a爲步長,那麼梯度上升法的迭代公式爲:
(3)ww+αΔwf(w)

(2)隨機梯度上升法我們知道梯度上升法每次更新迴歸係數都需要遍歷整個數據集,當樣本數量較小時,該方法尚可,但是當樣本數據集非常大且特徵非常多時,那麼隨機梯度下降法的計算複雜度就會特別高。一種改進的方法是一次僅用一個樣本點來更新迴歸係數。由於可以在新樣本到來時對分類器進行增量式更新,因此隨機梯度上升法是一個在線學習算法。
2.2 處理數據中的缺失值

我們可能會遇到數據缺失的情況,但有時候數據相當昂貴,扔掉和重新獲取均不可取,這顯然是會帶來更多的成本負擔,所以我們可以選取一些有效的方法來解決該類問題。比如:

  1 使用可用特徵的均值填補缺失值

  2 使用特殊值來填補缺失的特徵,如-1

  3 忽略有缺失值的樣本

  4 使用相似樣本的平均值填補缺失值

  5 使用另外的機器學習算法預測缺失值

3.僞代碼

使用梯度上升法尋找最佳參數
假設有100個樣本點,每個樣本有兩個特徵:x1和x2.此外爲方便考慮,我們額外添加一個x0=1,將線性函數z=wTx+b轉爲z=wTx(此時向量w和x的維度均價

1).那麼梯度上升法的僞代碼如下:

  • 初始化每個迴歸係數爲1
  • 重複R次:
      - 計算整個數據集梯度
      - 使用alpha*gradient更新迴歸係數的向量
  • 返回迴歸係數

2)隨機梯度上升法可以寫成如下僞代碼:

  • 所有迴歸係數初始化爲1
  • 對數據集每個樣本
      - 計算該樣本的梯度
      - 使用alpha*gradient更新回顧係數值
  • 返回迴歸係數值

4.實例

1、從疝氣病症預測病馬死亡率
  • 處理數據缺失:
    這裏我們根據logstic迴歸的函數特徵,選擇實數0來替換所有缺失值,而這恰好能適用logistic迴歸。因此,它在參數更新時不會影響參數的值。即如果某特徵對應值爲0 ,那麼由公式w:w+alpha*gradient,可知w不會發生改變。

      此外,由於sigmoid(0)=0.5,表面該特徵對結果的預測不具有任何傾向性,因此不會對誤差造成影響。

      當然,如果是發生有樣本的類標籤缺失的情況,此時我們最好的辦法是將該樣本捨棄,這是因爲標籤與特徵不同,我們很難確定採用某個合適的值替換掉。

5.存在的問題及解決方法

   logistic迴歸的目的是尋找一個非線性函數sigmoid的最佳擬合參數,從而來相對準確的預測分類結果。爲了找出最佳的函數擬合參數,最常用的優化算法爲梯度上升法,當然我們爲了節省計算損耗,通常選擇隨機梯度上升法來迭代更新擬合參數。並且,隨機梯度上升法是一種在線學習算法,它可以在新數據到來時完成參數的更新,而不需要重新讀取整個數據集來進行批處理運算。

  總的來說,logistic迴歸算法,其具有計算代價不高,易於理解和實現等優點;此外,logistic迴歸算法容易出現欠擬合,以及分類精度不太高的缺點。
   我們知道,評判一個優化算法的優劣的可靠方法是看其是否收斂,也就是說參數的值是否達到穩定值。此外,當參數值接近穩定時,仍然可能會出現一些小的週期性的波動。這種情況發生的原因是樣本集中存在一些不能正確分類的樣本點(數據集並非線性可分),所以這些點在每次迭代時會引發係數的劇烈改變,造成週期性的波動。顯然我們希望算法能夠避免來回波動,從而收斂到某個值,並且收斂速度也要足夠快。
改進:
1 alpha在每次迭代更新是都會調整,這會緩解數據波動或者高頻運動。此外,alpha還有一個常數項,目的是爲了保證在多次迭代後仍然對新數據具有一定的影響,如果要處理的問題是動態變化的,可以適當加大該常數項,從而確保新的值獲得更大的迴歸係數。

2 第二個改進的地方是選擇隨機的樣本對參數進行更新,由於增加了隨機性,這就防止參數值發生週期性的波動。

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

五、支持向量機(SVM)

1.概述

  SVM有很多實現,但是本章只關注其中最流行的一種實現,即序列最小優化,在此之後,將介紹如何使用一種稱爲核函數(kernel)的方式將SVM擴展到更多數據集上。
  支持向量機是一種二類分類算法,假設一個平面可以將所有的樣本分爲兩類,位於正側的樣本爲一類,值爲+1,而位於負一側的樣本爲另外一類,值爲-1。雖然SVM本身是一個二類分類器,若要解決多類問題,需要修改SVM。

  我們說分類,不僅僅是將不同的類別樣本分隔開,還要以比較大的置信度來分隔這些樣本,這樣才能使絕大部分樣本被分開。比如,我們想通過一個平面將兩個類別的樣本分開,如果這些樣本是線性可分(或者近視線性可分),那麼這樣的平面有很多,但是如果我們加上要以最大的置信度來將這些樣本分開,那麼這樣的平面只有一條。

  • 1.幾何間隔
      幾何間隔的概念,簡單理解就是樣本點到分隔平面的距離
  • 2 間隔最大化
      想要間隔最大化,我們必須找到距離分隔平面最近的點,並且使得距離平面最近的點儘可能的距離平面最遠,這樣,每一個樣本就都能夠以比較大的置信度被分隔開算法的分類預測能力也就越好
      顯然,SVM算法的關鍵所在,就是找到使得間隔最大化的分隔超平面(如果特徵是高維度的情況,我們稱這樣的平面爲超平面)。簡言之:最大化支持向量到超平面距離

  • 優點:泛化錯誤率低,計算開銷不大,結果易解釋。

  • 缺點:對參數調節和核函數的選擇敏感,原始分類器不加修改僅適用於處理二類問題。
  • 適用數據類型:數值型和標稱型數據。

2.算法介紹

支持向量機推導

  • 訓練算法:SVM的大部分時間都源自訓練,該過程主要實現兩個參數的調優。
  • 測試算法:十分簡單的計算過程就可以實現。
  • 使用算法:幾乎所有分類問題都可以使用SVM,值得一提的是,S V M 本身是一個二類分類器,對多類問題應用SVM需要對代碼做一些修改。

下面介紹線性支持向量機,近似線性支持向量機以及非線性支持向量機(核函數)

2.1 線性支持向量機

  求解線性支持向量機的過程是凸二次規劃問題,所謂凸二次規劃問題,就是目標函數是凸的二次可微函數,約束函數爲仿射函數滿足
而我們說求解凸二次規劃問題可以利用對偶算法–即引入拉格朗日算子,利用拉格朗日對偶性將原始問題的最優解問題轉化爲拉格朗日對偶問題,這樣就將求wb 的原始問題的極小問題轉化爲求
α

(1)α>=0,i=1mαilable(i)=0

的對偶問題的極大問題,即求出α ,在通過KKT條件求出對應的參數w,b ,從而找到這樣的間隔最大化超平面,進而利用該平面完成樣本分類。目標函數如下:
(2)maxα[i=1mα12i,j=1mlabel(i)label(j)αiαj<x(i),x(j)>]
2.2 近似線性支持向量機

  當數據集並不是嚴格線性可分時,即滿足絕不部分樣本點是線性可分,存在極少部分異常點;這裏也就是說存在部分樣本不能滿足約束條件,此時我們可以引入鬆弛因子,這樣這些樣本點到超平面的函數距離加上鬆弛因子,就能保證被超平面分隔開來;當然,添加了鬆弛因子σ ,我們也會添加對應的代價項,使得

(3)α$滿$0=<α<=C$$i=1mαilable(i)=0
2.3 非線性支持向量機

  顯然,當數據集不是線性可分的,即我們不能通過前面的線性模型來對數據集進行分類。此時,我們必須想辦法將這些樣本特徵符合線性模型,才能通過線性模型對這些樣本進行分類。這就要用到核函數,核函數的功能就是將低維的特徵空間映射到高維的特徵空間,而在高維的特徵空間中,這些樣本進過轉化後,變成了線性可分的情況,這樣,在高維空間中,我們就能夠利用線性模型來解決數據集分類問題
  如果想要透徹理解SVM建議還是要看看書和博客文章,篇幅有限,我這裏的中心在於凸二次規劃的優化算法——SMO(序列最小最優化算法)

2.4 SMO優化算法

  SMO算法的工作原理是:每次循環中選擇兩個α 進行優化處理。一旦找到一對合適的α ,那麼就增大其中一個而減少另外一個。這裏的”合適”,意味着在選擇α 對時必須滿足一定的條件,條件之一是這兩個α 不滿足最優化問題的kkt條件,另外一個條件是這兩個α 還沒有進行區間化處理,對於SMO算法編寫,我們採用由簡單到複雜的方法,層層遞進,完成最終的SMO算法實現,最後通過實際的用例對SVM模型進行訓練,並驗證準確性。

3.僞代碼

3.1 簡化版SMO算法

  簡化版SMO算法,省略了確定要優化的最佳α 對的步驟,而是首先在數據集上進行遍歷每一個α ,再在剩餘的數據集中找到另外一個α ,構成要優化的α 對,同時對其進行優化,這裏同時是要確保式:i=1mαi·lable(i)=0 。所以改變一個α 顯然會導致等式失效,所以這裏需要同時改變兩個α

僞代碼:

  • 創建一個alpha向量並將其初始化爲0向量
  • 當迭代次數小於最大迭代次數時(w 外循環)
      - 對數據集中每個數據向量(內循環):
        - 如果該數據向量可以被優化:
          - 隨機選擇另外一個數據向量
          - 同時優化這兩個向量
          - 如果兩個向量都不能被優化,退出內循環
      - 如果所有向量都沒有被優化,增加迭代次數,繼續下一次循環

      當然,上面的代碼通過對整個數據集進行兩次遍歷的方法來尋找α 對的方法,顯然存在一定的不足,如果數據集規模較小的情況下,或許還可以滿足要求。但是對於大規模的數據集而言,上面的代碼顯然收斂速度非常慢,所以,接下來我們在此基礎上對選取合適的α 對方法進行改進,採用啓發式的方法來選取合適的α 對,從而提升運算效率。

3.2 啓發式選取alpha變量的SMO算法

啓發式的SMO算法一個外循環來選擇第一個α 值,並且其選擇過程會在下面兩種方法之間進行交替:
(1)在所有數據集上進行單遍掃描
(2)另一種方法是在間隔邊界上樣本點進行單遍掃描,所謂間隔邊界上的點即爲支持向量點。
   顯然,對於整個數據集遍歷比較容易,而對於那些處於間隔邊界上的點,我們還需要事先將這些點對應的α 值找出來,存放在一個列表中,然後對列表進行遍歷;此外,在選擇第一個α 值後,算法會通過一個內循環來選擇第二個值。建立一個全局的緩存用於保存誤差值,從中選擇是的步長(或者 EiEj )最大的α 值。
  上面的SMO完整代碼是分爲內外兩個循環函數來編寫的,採取這樣的結構可以更方便我們去理解選取兩個α 的過程;既然,我們已經計算出了α 值和b 值,那麼顯然我們可以利用公式w=Σαi·label[i]·dataMat[i,:] 計算出相應的權值參數,然後就可以得到間隔超平面的公式wx+b 來完成樣本的分類了,由於SVM算法是一種二類分類算法,正值爲1,負值爲-1,即分類的決策函數爲跳躍函數signwx+b

3.33 核函數

  核函數的目的主要是爲了解決非線性分類問題,通過核技巧將低維的非線性特徵轉化爲高維的線性特徵,從而可以通過線性模型來解決非線性的分類問題。
例如,當數據集不是線性可分時,即數據集分佈是下面的圓形該怎麼辦呢?

1

  顯然,此時數據集線性不可分,我們無法用一個超平面來將兩種樣本分隔開;那麼我們就希望將這些數據進行轉化,轉化之後的數據就能夠通過一個線性超平面將不同類別的樣本分開,這就需要核函數,核函數的目的主要是爲了解決非線性分類問題,通過核技巧將低維的非線性特徵轉化爲高維的線性特徵,從而可以通過線性模型來解決非線性的分類問題
  而徑向基核函數,是SVM中常用的一個核函數。徑向基核函數是一個採用向量作爲自變量的函數,能夠基於向量距離運算輸出一個標量。徑向基核函數的高斯版本公式爲:

(4)k(xy)=exp(||xy||2)2σ2

其中,σ爲到達率,是超參數,決定了函數值跌落至0的速度。
 有了高斯核函數之後,我們只要將上面的SMO算法中所有的內積項替換爲核函數即可。
  另外:有了核函數,我們就能對非線性的數據集進行分類預測了,接下來就是編寫代碼利用核函數進行測試,需要說明的是,在優化的過程中,我們僅僅需要找到支持向量和其對應的α 值,而對於其他的樣本值可以不用管,甚至可以捨棄,因爲這些樣本將不會對分類預測函數造成任何影響。這也就是SVM相比KNN算法的優秀的地方所在。

  通過輸入不同的σ值(當然,迭代次數也會有一定的影響,我們只討論σ值),我們發現測試錯誤率,訓練誤差率,支持向量個數都會發生變化,在一定的範圍內,支持向量數目的下降,會使得訓練錯誤率和測試錯誤率都下降,但是當抵達某處的最優值時,再次通過增大σ值的方法減少支持向量,此時訓練錯誤率下降,而測試誤差上升
  簡言之,對於固定的數據集,支持向量的數目存在一個最優值,如果支持向量太少,會得到一個很差的決策邊界;而支持向量太多,也相當於利用整個數據集進行分類,就類似於KNN算法,顯然運算速度不高。

4.實例  

  可以發現:相較於kNN算法,儘管kNN也能取得不錯的效果;但是從節省內存的角度出發,顯然SVM算法更勝一籌,因爲其不需要保存真個數據集,而只需要其作用的支持向量點,而取得不錯的分類效果。
  對於固定的數據集,存在最優的支持向量個數,使得分類錯誤率最低。支持向量的個數會隨着σ值的增大而逐漸減少,但是分類錯誤率確實一個先降低後升高的過程。即最小的分類錯誤率並不意味着最少的支持向量個數。
  

5.存在的問題及解決方法、總結

   支持向量機是一種通過求解凸二次規劃問題來解決分類問題的算法,具有較低的泛化錯誤率。而SMO算法可以通過每次只優化兩個alpha值來加快SVM的訓練速度。
  核技巧是將數據由低維空間映射到高維空間,可以將一個低維空間中的非線性問題轉換爲高維空間下的線性問題來求解。而徑向基核函數是一個常用的度量兩個向量距離的核函數。

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

六、Logistic迴歸

1.概述

  AdaBoost分類器就是一種元算法分類器,adaBoost分類器利用同一種基分類器(弱分類器),基於分類器的錯誤率分配不同的權重參數,最後累加加權的預測結果作爲輸出。

  • 1.元算法:對其他算法進行組合的一種方式,這種組合結果也可以叫做集成方法。
  • 2.bagging方法:其是從原始數據集選擇s次後得到s個新數據集的一種技術。需要說明的是,新數據集和原數據集的大小相等。每個數據集都是通過在原始數據集上先後隨機選擇一個樣本來進行替換得到的新的數據集(即先隨機選擇一個樣本,然後隨機選擇另外一個樣本替換之前的樣本),並且這裏的替換可以多次選擇同一樣本,也就是說某些樣本可能多次出現,而另外有一些樣本在新集合中不再出現。s個數據集準備好之後,將某個學習算法分別作用於每個數據集就得到s個分類器。當要對新的數據進行分類時,就應用這s個分類器進行分類,最後根據多數表決的原則確定出最後的分類結果。
  • 3.boosting方法:首先,boosting集成了多個分類器,不同的分類器類型都是一致的,不過這些分類器是通過串行訓練得到的(即每個新的分類器是通過原來已訓練出的分類器訓練得到的),集中關注被前面分類器錯分的數據來獲得新的分類器。然後,boosting的分類結果是基於所有分類器加權求和得到的(這也是和bagging 不同的地方,bagging中的分類器權值都相等),分類器的錯誤率越低,那麼其對應的權重也就越大,越容易對預測結果產生影響。boosting擁有多個版本,這裏介紹其中最流行的Adaboost方法。很多人認爲boosting和SVM是監督機器學習中最強大的兩種方法,但是這它們之間也有很多相似之處。

  • 優點:泛化錯誤率低,易編碼,可以應用在大部分分類器上,無參數調整。

  • 缺點:對離羣點敏感。
  • 適用數據類型:數值型和標稱型數據。

2.算法介紹

  • 訓練算法:Adaboost的大部分時間都用在訓練上,分類器將多次在同一數據集上訓練弱分類器。
  • 測試算法:計算分類的錯誤率,訓練代碼會幫我們保存每個弱分類器的重要信息,比如分類器係數,分類器的最優特徵,特徵閾值等。有了這些重要的信息,我們拿到之後,就可以對測試數據進行預測分類了
  • 使用算法:同SVM— 樣,Adaboost預測兩個類別中的一個。如果想把它應用到多個類別的場合,那麼就要像多類SVM中的做法一樣對Adaboost進行修改。
2.1 AdaBoost的運行過程

 訓練數據的每一個樣本,並賦予其一個權重,這些權值構成權重向量D,維度等於數據集樣本個數。開始時,這些權重都是相等的,首先在訓練數據集上訓練出一個弱分類器並計算該分類器的錯誤率,然後在同一數據集上再次訓練弱分類器,但是在第二次訓練時,將會根據分類器的錯誤率,對數據集中樣本的各個權重進行調整,分類正確的樣本的權重降低,而分類錯的樣本權重則上升,但這些權重的總和保持不變爲1.
  並且,最終的分類器會基於這些訓練的弱分類器的分類錯誤率,分配不同的決定係數α ,錯誤率低的分類器獲得更高的決定係數,從而在對數據進行預測時起關鍵作用。α 的計算根據錯誤率得來:

(1)α=0.5ln(1ε/max(ε,1e16))

其中:ε=
計算出α 之後,就可以對權重向量進行更新了,使得分類錯誤的樣本獲得更高的權重,而分類正確的樣本獲得更低的權重。D的權重更新如下:
(1)如果某個樣本被正確分類,那麼權重更新爲:
  
(2)D(t+1,i)=D(t,i)·exp(α)sum(D)

(2)如果某個樣本被錯誤分類,那麼權重更新爲:
  

(3)D(t+1,i)=D(t,i)·exp(α)sum(D)

其中,m 爲迭代的次數,即訓練的第m 個分類器,i 爲權重向量的第i 個分量,i<= 。直到錯誤率爲0,或者弱分類器的數目達到用戶指定值。

2.2 基於單層決策樹構建弱分類器

  單層決策樹是一種簡單的決策樹,也稱爲決策樹樁。單層決策樹可以看做是由一個根節點直接連接兩個葉結點的簡單決策樹。

3.僞代碼

3.1尋找最佳的單層決策樹(弱分類器)

最佳單層決策樹是具有最低分類錯誤率的單層決策樹,僞代碼如下:
- 將最小錯誤率minError設爲+∞
- 對數據集中的每個特徵(第一層特徵):
- 對每個步長(第二層特徵):
- 對每個不等號(第三層特徵):
- 建立一顆單層決策樹並利用加權數據集對它進行測試
- 如果錯誤率低於minError,則將當前單層決策樹設爲最佳單層決策樹
- 返回最佳單層決策樹
包含兩個函數:
第一個函數是分類器的閾值過濾函數,即設定某一閾值,凡是超過該閾值的結果被歸爲一類,小於閾值的結果都被分爲另外一類,這裏的兩類依然同SVM一樣,採用+1和-1作爲類別。
第二個函數,就是建立單層決策樹的具體代碼,基於樣本值的各個特徵及特徵值的大小,設定合適的步長,獲得不同的閾值,然後以此閾值作爲根結點,對數據集樣本進行分類,並計算錯誤率,需要指出的是,這裏的錯誤率計算是基於樣本權重的,所有分錯的樣本乘以其對應的權重,然後進行累加得到分類器的錯誤率。錯誤率得到之後,根據錯誤率的大小,跟當前存儲的最小錯誤率的分類器進行比較,選擇出錯誤率最小的特徵訓練出來的分類器,作爲最佳單層決策樹輸出,並通過字典類型保存其相關重要的信息。

3.2完整AdaBoost算法實現

僞代碼如下:

  • 對每次迭代:
      找到最佳的單層決策樹
      將最佳單層決策樹加入到單層決策樹數組
      計算alpha
      計算新的權重向量D
      更新累計類別估計值
      如果錯誤率爲等於0.0,退出循環
      
    需要說明的幾點:
    (1)上面的輸入除了數據集和標籤之外,還有用戶自己指定的迭代次數,用戶可以根據自己的成本需要和實際情況,設定合適的迭代次數,構建出需要的弱分類器數量。
    (2)權重向量D包含了當前單層決策樹分類器下,各個數據集樣本的權重,一開始它們的值都相等。但是,經過分類器分類之後,會根據分類的權重加權錯誤率對這些權重進行修改,修改的方向爲,提高分類錯誤樣本的權重,減少分類正確的樣本的權重
    (3)分類器係數α ,是非常重要的參數,它在最終的分類器組合決策分類結果的過程中,起到了非常重要的作用,如果某個弱分類器的分類錯誤率更低,那麼根據錯誤率計算出來的分類器係數將更高,這樣,這些分類錯誤率更低的分類器在最終的分類決策中,會起到更加重要的作用。
    (4)上述代碼的訓練過程是以達到迭代的用戶指定的迭代次數或者訓練錯誤率達到要求而跳出循環。而最終的分類器決策結果,會通過sign函數,將結果指定爲+1或者-1

4.實例

4.1 難數據集上應用adaBoost

(1)隨着分類器數目的增加,adaBoost分類器的訓練錯誤率不斷的減少,而測試錯誤率則是經歷先減少到最小值,再逐漸增大的過程。顯然,這就是所說的過擬合。因此,對於這種情況,我們應該採取相應的措施,比如採取交叉驗證的方法,在訓練分類器時,設定一個驗證集合,不斷測試驗證集的分類錯誤率,當發現訓練集錯誤率減少的同時,驗證集的錯誤率較之上一次結果上升了,就停止訓練。或者其他比較實用的模擬退火方法,基因遺傳算法等。

(2)前面的第四章的logistic迴歸分類器對該數據集的分類錯誤率是35%,顯然adaBoost分類器取得了更好的分類效果。

(3)有文獻表明,對於表現好的數據集,AdaBoost的測試誤差率會隨着迭代次數的增加而逐漸穩定在某一個值附近,而不會出現上表中的先減小後上升的情況。顯然,這裏用到的數據集不能稱爲”表現好”的數據集,比較該數據集存在30%的數據缺失。
在第四章的logistic迴歸中,我們講這些確實的數據設置爲0,顯然這在logistic迴歸算法中是合適,這樣不會對分類結果造成影響。但是,在adaBoost算法中依然這樣設置,其合理性還有待證明,所以,有必要可以將這些缺失的數據值由0變成該特徵相類似的數據或者該特徵數據的平均值,再來進行adaBoost算法訓練,看看得到的結果會不會有所提升?

5.存在的問題及解決方法、總結

 多個分類器組合可能會進一步凸顯出單分類器的不足,比如過擬合問題。如果分類器之間差別顯著,那麼多個分類器組合就可能會緩解這一問題。分類器之間的差別可以是算法本身或者是應用於算法上的數據的不同。
 在bagging中,是通過隨機抽樣的替換方式,得到了與原始數據集規模一樣的數據集。而AdaBoost在bagging的思路上更進了一步,它在數據集上順序應用了多個不同的分類器
 AdaBoost是以弱分類器作爲基礎分類器,輸入數據之後,通過加權向量進行加權,在每一輪的迭代過程中都會基於弱分類器的加權錯誤率,更新權重向量,從而進行下一次迭代。並且會在每一輪迭代中計算出該弱分類器的係數,該係數的大小將決定該弱分類器在最終預測分類中的重要程度。顯然,這兩點的結合是AdaBoost算法的優勢所在。

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

七、非均衡分類問題

  在上述機器學習的分類問題中,我們都假設所有類別的分類代價是一樣的。但是事實上,不同分類的代價是不一樣的,比如我們通過一個用於檢測患病的系統來檢測馬匹是否能繼續存活,如果我們把能存活的馬匹檢測成患病,那麼這匹馬可能就會被執行安樂死;如果我們把不能存活的馬匹檢測成健康,那麼就會繼續餵養這匹馬。一個代價是錯殺一隻昂貴的動物,一個代價是繼續餵養,很明顯這兩個代價是不一樣的。

性能度量

  衡量模型泛化能力的評價標準,就是性能度量。除了基於錯誤率來衡量分類器任務的成功程度的。錯誤率指的是在所有測試樣例中錯分的樣例比例。但是,這樣卻掩蓋了樣例如何被錯分的事實。在機器學習中,有一個普遍試用的稱爲混淆矩陣(confusion matrix)的工具,可以幫助人們更好地瞭解分類的錯誤。

正確率(Precision)、召回率(Recall)、ROC曲線

  • 正確率P = TP/(TP+FP),給出的是預測爲正例的樣本中的真正正例的比例。
  • 召回率R = TP/(TP+FN),給出的是預測爲正例的真實正例佔所有真實正例的比例。
  • ROC代表接收者操作特徵”Receiver Operating Characteristic”
    ROC曲線的縱軸是“真正例率”,TPR=TP/(TP+FN)
    橫軸是“假正例率”,FPR=FP/(TN+FP)
    (1)在理想的情況下,最佳的分類器應該儘可能地處於左上角,這就意味着分類器在假正例率很低的同時,獲得了很高的真正例率
    (2)對不同的ROC曲線進行比較的一個指標就是曲線下的面積(AUC),AUC給出的是分類器的平均性能值。一個完美的分類器的AUC是1,而隨機猜測的AUC則爲0.5。
    (2)若一個學習器的ROC曲線能把另一個學習器的ROC曲線完全包住,則這個學習器的性能比較好。

基於代價函數的分類器決策控制(方法更好)

  例如代價敏感學習:爲權衡不同類型錯誤所造成的不同損失,可爲錯誤賦予“非均等代價”。在“代價矩陣”中,將-1錯判成+1的代價(50),比把+1錯判成-1的代價(1)要高。
  在分類算法中,我們有很多方法可以用來引人代價信息。(1)在AdaBoost中,可以基於代價函數來調整錯誤權重向量D 。(2)在樸素貝葉斯中,可以選擇具有最小期望代價而不是最大概率的類別作爲最後的結果。(3)在S V M 中,可以在代價函數中對於不同的類別選擇不同的參數c。上述做法就會給較小類更多的權重,即在訓練時,小類當中只允許更少的錯誤。

處理非均衡問題的數據抽樣方法(方法可以)

  另外一種針對非均衡問題調節分類器的方法,就是對分類器的訓練數據進行改造。這可以通過欠抽樣或者過抽樣來實現。過抽樣意味着複製樣例,而欠抽樣意味着刪除樣例
  如前所述,正例類別屬於罕見類別。我們希望對於這種罕見類別能儘可能保留更多的信息,因此,我們應該保留正例類別中的所有樣例,而對反例類別進行欠抽樣或者樣例刪除處理。這種方法的一個缺點就在於要確定哪些樣例需要進行副除。但是,在選擇副除的樣例中可能攜帶了剩餘樣例中並不包含的有價值信息。
上述問題的一種解決辦法,就是選擇那些離決策邊界較遠的樣例進行刪除。假定我們有一個數據集,其中有50例信用卡欺詐交易和5000例合法交易。如果我們想要對合法交易樣例進行欠抽樣處理,使得這兩類數據比較均衡的話,那麼我們就需要去掉4950個樣例,這看上去有些極端,因此有一種替代的策略就是使用反例類別的欠抽樣和正例類別的過抽樣相混合的方法。要對正例類別進行過抽樣,我們可以複製已有樣例或者加入與已有樣例相似的點,例如,加人已有數據點的插值點,但是這種做法可能會導致過擬合的問題。

總結

  非均衡分類問題是指在分類器訓練時正例數目和反例數目不相等(相差很大)。該問題在錯分正例和反例的代價不同時也存在。
  通過過抽樣和欠抽樣方法來調節數據集中的正例和反例數目。另外一種可能更好的非均衡問題的處理方法,就是在訓練分類器時將錯誤的代價考慮在內。

迴歸很像分類,但是和分類輸出標稱型類別值不同的是,迴歸方法會預測出一個連續值。

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