12-分類算法-決策樹、隨機森林

決策樹

生活中的決策樹模型:


在這里插入圖片描述

顯然:判斷依據(jù)的重要性從前往后越來越小

信息的度量和作用

在不知道任何信息的情況下猜測32支球隊中的冠軍:如果用二分法,需要猜5次,即需要的代價為5bit,這個5bit我們稱之為信息熵(H)
5 = -(1/32log(1/32) + 1/32log(1/32) + ... + 1/32log(1/32))

公式:概率log概率 之和


在這里插入圖片描述

如果我們知道了一些球隊的信息,需要的代價會小于5bit
5 > -(1/4log(1/32) + 1/8log(1/32) + ... + 1/24log(1/32))

信息熵越大(比如,當每個球隊的奪冠幾率相等),不確定性越大

結(jié)合決策數(shù),之所以我們先對某些條件進行判斷,是因為能夠減少我們更多的不確定性

決策樹的劃分依據(jù)——信息增益

信息增益:當?shù)弥粋€條件之后,減少的信息熵的大小

在這里插入圖片描述
在這里插入圖片描述

常見決策樹使用的算法

  • ID3:信息增益 最大的準則
  • C4.5:信息增益比 最大的準則
  • CART
    • 回歸樹: 平方誤差 最小
    • 分類樹: 基尼系數(shù) 最小的準則 在sklearn中可以選擇劃分的默認原則。基尼系數(shù)的劃分比信息增益更加仔細

決策樹的api

在這里插入圖片描述

案例:泰坦尼克號乘客生存狀態(tài)

在泰坦尼克號和titanic2數(shù)據(jù)幀描述泰坦尼克號上的個別乘客的生存狀態(tài)。在泰坦尼克號的數(shù)據(jù)幀不包含從劇組信息,但它確實包含了乘客的一半的實際年齡。關于泰坦尼克號旅客的數(shù)據(jù)的主要來源是百科全書Titanica。這里使用的數(shù)據(jù)集是由各種研究人員開始的。其中包括許多研究人員創(chuàng)建的旅客名單,由Michael A. Findlay編輯。
我們提取的數(shù)據(jù)集中的特征是票的類別,存活,乘坐班,年齡,登陸,home.dest,房間,票,船和性別。乘坐班是指乘客班(1,2,3),是社會經(jīng)濟階層的代表。
其中age數(shù)據(jù)存在缺失。

import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
def decision():
    """
    決策樹對泰坦尼克進行預測生死
    :return: None
    """
    #獲取數(shù)據(jù)
    taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    #處理數(shù)據(jù),找出特征值和目標值
    x = taitan[['pclass', 'age', 'sex']]
    y = taitan[['survived']]
    print(x)
    #缺失值處理
    x['age'].fillna(x['age'].mean(), inplace=True)
    #分割數(shù)據(jù)集到訓練集和測試集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

    #進行處理(特征工程):當特征是類別的信息需要進行one-hot編碼
    dict = DictVectorizer(sparse=False)
    x_train = dict.fit_transform(x_train.to_dict(orient="records")) #to_dict的參數(shù),把一行轉(zhuǎn)換成一個字典
    print(dict.get_feature_names())
    x_test = dict.fit_transform(x_test.to_dict(orient="records"))
    print(x_train)

    #用決策樹進行預測
    dec = DecisionTreeClassifier(max_depth=5)   #參數(shù)限定決策樹的深度
    dec.fit(x_train, y_train)
    print("預測的準確率為:",dec.score(x_test, y_test))

    #導出決策樹的結(jié)構(gòu)
    export_graphviz(dec, out_file="./tree.dot", feature_names=['年齡', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
    #導出的文件用Graphviz打開
    return None

if __name__ == "__main__":
    decision()

決策樹部分圖例:


在這里插入圖片描述

決策樹的優(yōu)缺點以及改進

優(yōu)點:

  • 簡單理解和解釋,數(shù)目可視化
  • 需要很少的數(shù)據(jù)準備,其他技術通常需要數(shù)據(jù)歸一化

缺點:

  • 決策樹學習者可以創(chuàng)建不能很好地推廣數(shù)據(jù)的過于復雜的樹,這被稱為過擬合

改進:

  • 減枝cart算法:如果是用sklearn,在DecisionTreeClassifier中指定超參數(shù)即可
  • 隨機森林:準確率非常高

集成學習方法

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

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

隨機森林建立多個決策樹的過程:

  1. 單個決策樹的建立過程:

    • 隨機在N個樣本當中選擇一個樣本,重復N次 可能重復
    • 隨機在M個特征中選出m個特征
  2. 建立多顆決策樹,樣本、特征大多不一樣 隨機有放回的抽樣,稱bootstrap抽樣

ps:為什么要隨機抽樣?避免每顆樹的訓練集的一樣,那么最終訓練出的上面的分類結(jié)果也是完全一樣的

  • 隨機森林的api


    在這里插入圖片描述

隨機森林案例:

import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
def randomforest():
    """
    隨機森林對泰坦尼克進行預測生死
    :return: None
    """
    #獲取數(shù)據(jù)
    taitan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    #處理數(shù)據(jù),找出特征值和目標值
    x = taitan[['pclass', 'age', 'sex']]
    y = taitan[['survived']]
    print(x)
    #缺失值處理
    x['age'].fillna(x['age'].mean(), inplace=True)
    #分割數(shù)據(jù)集到訓練集和測試集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

    #進行處理(特征工程):當特征是類別的信息需要進行one-hot編碼
    dict = DictVectorizer(sparse=False)
    x_train = dict.fit_transform(x_train.to_dict(orient="records")) #to_dict的參數(shù),把一行轉(zhuǎn)換成一個字典
    print(dict.get_feature_names())
    x_test = dict.fit_transform(x_test.to_dict(orient="records"))
    print(x_train)
    rf = RandomForestClassifier()
    #網(wǎng)格搜索與交叉驗證
    param = {"n_estimators":[120, 200, 300, 500, 800, 1200], "max_depth":[5, 8, 15, 25, 30]}
    gc = GridSearchCV(rf, param_grid=param, cv=5)
    gc.fit(x_train, y_train)
    print("預測的準確率為:", gc.score(x_test, y_test))
    print("查看選擇的參數(shù)模型:", gc.best_estimator_)
    print("最佳的參數(shù):", gc.best_params_)
    #注意:隨機森林的圖不支持導出
    return None

if __name__ == "__main__":
    randomforest()

隨機森林的優(yōu)點:

  • 在當前所有算法中,具有極好的準確率
  • 能夠有效地運行在大數(shù)據(jù)集上(大體現(xiàn)在樣本數(shù)和特征數(shù)兩方面)
  • 能夠處理具有高維特征的輸入樣本,而且不需要降維
  • 能夠評估各個特征在分類問題上的重要性
  • 對于缺省值問題也能夠獲得很好得結(jié)果

隨機森林幾乎沒有缺點

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 決策樹理論在決策樹理論中,有這樣一句話,“用較少的東西,照樣可以做很好的事情。越是小的決策樹,越優(yōu)于大的決策樹”。...
    制杖灶灶閱讀 6,069評論 0 25
  • 1 前言 在了解樹模型之前,自然想到樹模型和線性模型,他們有什么區(qū)別呢? 樹形模型是一個一個特征進行處理,之前線性...
    高永峰_GYF閱讀 1,508評論 0 1
  • 概念 決策樹(Decision Tree)分為兩大類,回歸樹(Regression Decision Tree)和...
    HRain閱讀 5,676評論 1 30
  • 轉(zhuǎn)載自:http://www.zilhua.com/629.html 1. 隨機森林使用背景 1.1 隨機森林定義...
    吃番茄的土撥鼠閱讀 1,493評論 0 13
  • 馬未都在都嘟《寫作的秘密》節(jié)目中說,文章有金線。他說的金線和馮唐說的不一樣。馮唐說的金線是文章好不好的一個不好描述...
    親密數(shù)閱讀 1,464評論 0 0

友情鏈接更多精彩內(nèi)容