1. 程式人生 > >機器學習實戰-基本演算法總結1

機器學習實戰-基本演算法總結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.顯然,我們不能不提到一個函式,即