機器學習4-分類演算法2

清風紫雪發表於2021-01-19

樸素貝葉斯演算法

樸素

假定特徵與特徵之間是相互獨立的

貝葉斯公式

公式分為三個部分:

  • P(C):每個文件類別的概率(某文件類別數/總文件數量)
  • P(W│C):給定類別下特徵(被預測文件中出現的詞)的概率P(F1,F2,…) 預測文件中每個詞的概率
    • 計算方法:P(F1│C)=Ni/N (訓練文件中去計算)
      • Ni為該F1詞在C類別所有文件中出現的次數
      • N為所屬類別C下的文件所有詞出現的次數和

如果計算兩個類別概率比較:

 

 

 所以我們只要比較前面的大小就可以,得出誰的概率大

有的時候會出現為0的情況,而我們知道為0的情況不大可能出現,因此需要引進另一個引數,防止出現0

拉普拉斯平滑係數

目的:防止計算出的分類概率為0

 

 

 

API

  • sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
    • 樸素貝葉斯分類
    • alpha:拉普拉斯平滑係數

案例-新聞分類

分析

  • 分割資料集

  • tfidf進行的特徵抽取

  • 樸素貝葉斯預測
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import  MultinomialNB


def nb_news():
    #獲取資料集
    news=fetch_20newsgroups(subset="all")
    #劃分資料集
    x_train,x_test,y_train,y_test=train_test_split(news.data,news.target)
    #文字特徵抽取
    transfer=TfidfVectorizer()
    x_train=transfer.fit_transform(x_train)
    x_test=transfer.transform(x_test)
    #樸素貝葉斯
    estimator=MultinomialNB()
    estimator.fit(x_train,y_train)

    #模型評估
    # 方法1:直接比對真實值和預測值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比對真實值和預測值:\n", y_test == y_predict)
    # 方法2:計算準確率
    score = estimator.score(x_test, y_test)
    print("準確率為:\n", score)



    return None

if __name__ == '__main__':
    nb_news()

結果為:

 

 

 

總結

  • 優點:
    • 樸素貝葉斯模型發源於古典數學理論,有穩定的分類效率。
    • 對缺失資料不太敏感,演算法也比較簡單,常用於文字分類。
    • 分類準確度高,速度快
  • 缺點:
    • 由於使用了樣本屬性獨立性的假設,所以如果特徵屬性有關聯時其效果不好

決策樹

認識決策樹

決策樹分類原理詳解

 

 

問題:如何對這些客戶進行分類預測?你是如何去劃分?

有可能你的劃分是這樣的

 

 那麼我們怎麼知道這些特徵哪個更好放在最上面,那麼決策樹的真是劃分是這樣的

 

 

原理

資訊熵,資訊增益

資訊熵的定義

總結(重要)

  • 資訊和消除不確定性是相聯絡的

當我們得到的額外資訊(球隊歷史比賽情況等等)越多的話,那麼我們猜測的代價越小(猜測的不確定性減小)

問題: 回到我們前面的貸款案例,怎麼去劃分?可以利用當得知某個特徵(比如是否有房子)之後,我們能夠減少的不確定性大小。越大我們可以認為這個特徵很重要。那怎麼去衡量減少的不確定性大小呢?

決策樹的劃分依據之一------資訊增益

定義與公式

特徵A對訓練資料集D的資訊增益g(D,A),定義為集合D的資訊熵H(D)與特徵A給定條件下D的資訊條件熵H(D|A)之差,即公式為:

 

 公式的詳細解釋:

 

 

貸款特徵重要計算

我們以年齡特徵來計算:

1、g(D, 年齡) = H(D) -H(D|年齡) = 0.971-[5/15H(青年)+5/15H(中年)+5/15H(老年]

2、H(D) = -(6/15log(6/15)+9/15log(9/15))=0.971

3、H(青年) = -(3/5log(3/5) +2/5log(2/5))
H(中年)=-(3/5log(3/5) +2/5log(2/5))
H(老年)=-(4/5og(4/5)+1/5log(1/5))

我們以A1、A2、A3、A4代表年齡、有工作、有自己的房子和貸款情況。最終計算的結果g(D, A1) = 0.313, g(D, A2) = 0.324, g(D, A3) = 0.420,g(D, A4) = 0.363。所以我們選擇A3 作為劃分的第一個特徵。這樣我們就可以一棵樹慢慢建立

決策樹API

  • class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
    • 決策樹分類器
    • criterion:預設是’gini’係數,也可以選擇資訊增益的熵’entropy’
    • max_depth:樹的深度大小
    • random_state:隨機數種子
  • 其中會有些超引數:max_depth:樹的深度大小
    • 其它超引數我們會結合隨機森林講解

案例

鳶尾花決策樹分析

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier,export_graphviz
import pydotplus

def tree():
    """
    用決策樹對鳶尾花分類
    """
    #獲取資料集
    iris=load_iris()
    #劃分資料集
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=22)
    #決策樹預估器
    estimator=DecisionTreeClassifier(criterion="entropy")
    estimator.fit(x_train,y_train)

    # 模型評估
    # 方法1:直接比對真實值和預測值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比對真實值和預測值:\n", y_test == y_predict)
    # 方法2:計算準確率
    score = estimator.score(x_test, y_test)
    print("準確率為:\n", score)

    #視覺化決策樹
    dot_data=export_graphviz(estimator,out_file=None,feature_names=iris.feature_names)
    graph = pydotplus.graph_from_dot_data(dot_data)
    graph.write_pdf("iris.pdf")

    return None


if __name__ == '__main__':
    tree()

結果為:

 

 視覺化展示:

泰坦尼克號乘客生存預測

相關資料與說明:https://www.kaggle.com/zephyrzhan522/titanic-prediction-dl-vs-ml

分析

  • 選擇我們認為重要的幾個特徵 ['pclass', 'age', 'sex']
  • 填充缺失值
  • 特徵中出現類別符號,需要進行one-hot編碼處理(DictVectorizer)資料集劃分
    • x.to_dict(orient="records") 需要將陣列特徵轉換成字典資料
  • 決策樹分類預測

步驟

讀取資料

 

 抽取特徵:

 

 填充缺失值並轉換為字典資料

 

 資料集劃分以及相關資料的轉化

 

 決策樹預估以及視覺化

 

 

 

 視覺化展示:

決策樹總結

  • 優點:
    • 簡單的理解和解釋,樹木視覺化。
  • 缺點:
    • 決策樹學習者可以建立不能很好地推廣資料的過於複雜的樹,這被稱為過擬合。
  • 改進:
    • 減枝cart演算法(決策樹API當中已經實現,隨機森林引數調優有相關介紹)
    • 隨機森林

注:企業重要決策,由於決策樹很好的分析能力,在決策過程應用較多, 可以選擇特徵

整合學習方法之隨機森林

什麼是整合學習方法

整合學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最後結合成組合預測,因此優於任何一個單分類的做出預測。

什麼是隨機森林

隨機森林是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定。

例如, 如果你訓練了5個樹, 其中有4個樹的結果是True, 1個數的結果是False, 那麼最終投票結果就是True

隨機森林原理過程

學習演算法根據下列演算法而建造每棵樹:

  • 用N來表示訓練用例(樣本)的個數,M表示特徵數目。採取bootstrap抽樣
    • 1、一次隨機選出一個樣本,重複N次, (有可能出現重複的樣本)
    • 2、隨機去選出m個特徵, m <<M,建立決策樹

為什麼採用BootStrap抽樣

  • 為什麼要隨機抽樣訓練集?  
    • 如果不進行隨機抽樣,每棵樹的訓練集都一樣,那麼最終訓練出的樹分類結果也是完全一樣的
  • 為什麼要有放回地抽樣?
    • 如果不是有放回的抽樣,那麼每棵樹的訓練樣本都是不同的,都是沒有交集的,這樣每棵樹都是“有偏的”,都是絕對“片面的”(當然這樣說可能不對),也就是說每棵樹訓練出來都是有很大的差異的;而隨機森林最後分類取決於多棵樹(弱分類器)的投票表決。

API

  • class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)

    • 隨機森林分類器
    • n_estimators:integer,optional(default = 10)森林裡的樹木數量120,200,300,500,800,1200
    • criteria:string,可選(default =“gini”)分割特徵的測量方法
    • max_depth:integer或None,可選(預設=無)樹的最大深度 5,8,15,25,30
    • max_features="auto”,每個決策樹的最大特徵數量
      • If "auto", then max_features=sqrt(n_features).
      • If "sqrt", then max_features=sqrt(n_features) (same as "auto").
      • If "log2", then max_features=log2(n_features).
      • If None, then max_features=n_features.
    • bootstrap:boolean,optional(default = True)是否在構建樹時使用放回抽樣
    • min_samples_split:節點劃分最少樣本數
    • min_samples_leaf:葉子節點的最小樣本數
  • 超引數:n_estimator, max_depth, min_samples_split,min_samples_leaf

案例

還是剛剛的泰坦尼克號,用隨機森林進行預測

結果為:

 

總結

  • 在當前所有演算法中,具有極好的準確率
  • 能夠有效地執行在大資料集上,處理具有高維特徵的輸入樣本,而且不需要降維
  • 能夠評估各個特徵在分類問題上的重要性

分類演算法總結

 

 

相關文章