机器学习算法基础——决策树和随机深林
32.決策樹之信息論基礎
決策樹
決策樹思想的來源非常樸素,程序設計中的條件分支結構就是if-then結構,最早的決策樹就是利用這類結構分割數據的一種分類學習方法
猜誰是冠軍?假設有32支球隊
每猜一次給一塊錢,告訴我是否猜對了,那么我需要掏多少錢才能知道誰是冠軍?我可以把球編上號,從1到32,然后提問:冠軍在1-16號嗎?依次詢問,只需要五次(log32=5),就可以知道結果。
信息熵?
“誰是世界杯冠軍”的信息量應該比5比特少。香農指出,它的準確信息量應該是: H = -(p1logp1 + p2logp2 + ... + p32log32)
H的專業術語稱之為信息熵,單位為比特。
?
當這32支球隊奪冠的幾率相同時,對應的信息熵等于5比特
信息熵和不確定性相關
33.決策樹的劃分以及案例
信息增益
特征A對訓練數據集D的信息增益g(D,A),定義為集合D的信息熵H(D)與特征A給定條件下D的信息條件熵H(D|A)之差,即公式為:
??
注:信息增益表示得知特征X的信息而使得類Y的信息的不確定性減少的程度??
信息增益的計算
結合前面的貸款數據來看我們的公式:
信息熵的計算:??
?
?條件熵的計算:
?注:C_k表示屬于某個類別的樣本數,?
常見決策樹使用的算法
ID3
- 信息增益 最大的準則
C4.5
- 信息增益比 最大的準則
CART
- 回歸樹: 平方誤差最小
- 分類樹: 基尼系數最小的準則 在sklearn中可以選擇劃分的原則?
sklearn決策樹API
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None) 決策樹分類器
- criterion:默認是’gini’系數,也可以選擇信息增益的熵’entropy’
- max_depth:樹的深度大小
- random_state:隨機數種子
- method:
- decision_path:返回決策樹的路徑
泰坦尼克號案例
在泰坦尼克號和titanic2數據幀描述泰坦尼克號上的個別乘客的生存狀態。在泰坦尼克號的數據幀不包含從劇組信息,但它確實包含了乘客的一半的實際年齡。關于泰坦尼克號旅客的數據的主要來源是百科全書Titanica。這里使用的數據集是由各種研究人員開始的。其中包括許多研究人員創建的旅客名單,由Michael A. Findlay編輯。
我們提取的數據集中的特征是票的類別,存活,乘坐班,年齡,登陸,home.dest,房間,票,船和性別。乘坐班是指乘客班(1,2,3),是社會經濟階層的代表。
其中age數據存在缺失。
from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier,export_graphviz import pandas as pd def decision():#獲取數據titan = pd.read_csv("/Users/zhucan/Desktop/titanic/train.csv")#處理數據,找出特征值和目標值x = titan[["Pclass","Age","Sex"]]y = titan["Survived"]print(x)#缺失值處理x["Age"].fillna(x["Age"].mean(),inplace=True)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"))print(dict.get_feature_names())x_test = dict.transform(x_test.to_dict(orient="records"))#用決策樹進行預測dec = DecisionTreeClassifier()dec.fit(x_train,y_train)#預測準確率print("預測的準確率為:",dec.score(x_test,y_test))#導出樹的結構export_graphviz(dec,out_file="./tree.dot",feature_names=["年齡","Pclass=1st", "Pclass=2nd", "Pclass=3rd", "Sex=女性", "Sex=男性"])return None if __name__ == "__main__":decision() Pclass Age Sex 0 3rd 22.0 male 1 1st 38.0 female 2 3rd 26.0 female 3 1st 35.0 female 4 3rd 35.0 male .. ... ... ... 886 2nd 27.0 male 887 1st 19.0 female 888 3rd NaN female 889 1st 26.0 male 890 3rd 32.0 male['Age', 'Pclass=1st', 'Pclass=2nd', 'Pclass=3rd', 'Sex=female', 'Sex=male'] 預測的準確率為: 0.8026905829596412決策樹的結構、本地保存
34.決策樹的保存結果分析
決策樹的優缺點以及改進
優點:
- 簡單的理解和解釋,樹木可視化。
- 需要很少的數據準備,其他技術通常需要數據歸一化
缺點:
- 決策樹學習者可以創建不能很好地推廣數據的過于復雜的樹,這被稱為過擬合。
- 決策樹可能不穩定,因為數據的小變化可能會導致完全不同的樹被生成
改進: 減枝cart算法 隨機森林
35.隨機森林的原理以及案例調優
集成學習方法
集成學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最后結合成單預測,因此優于任何一個單分類的做出預測。
什么是隨機森林
定義:在機器學習中,隨機森林是一個包含多個決策樹的分類器,并且其輸出的類別是由個別樹輸出的類別的眾數而定。
為什么要隨機抽樣訓練集?
如果不進行隨機抽樣,每棵樹的訓練集都一樣,那么最終訓練出的樹分類結果也是完全一樣的
為什么要有放回地抽樣?
如果不是有放回的抽樣,那么每棵樹的訓練樣本都是不同的,都是沒有交集的,這樣每棵樹都是“有偏的”,都是絕對“片面的”(當然這樣說可能不對),也就是說每棵樹訓練出來都是有很大的差異的;而隨機森林最后分類取決于多棵樹(弱分類器)的投票表決。?
集成學習API
- class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None)
- 隨機森林分類器
- n_estimators:integer,optional(default = 10) 森林里的樹木數量
- criteria:string,可選(default =“gini”)分割特征的測量方法
- max_depth:integer或None,可選(默認=無)樹的最大深度
- bootstrap:boolean,optional(default = True)是否在構建樹時使用放回抽樣
隨機森林的優點
- 在當前所有算法中,具有極好的準確率
- 能夠有效地運行在大數據集上 ?
- 能夠處理具有高維特征的輸入樣本,而且不需要降維 能夠評估各個特征在分類問題上的重要性
- 對于缺省值問題也能夠獲得很好得結果
36.每日總結
總結
以上是生活随笔為你收集整理的机器学习算法基础——决策树和随机深林的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习算法基础——朴素贝叶斯算法
- 下一篇: 机器学习算法基础——线性回归