决策树-分类算法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?決策樹-分類算法
1 認識決策樹
決策樹是一種基本的分類方法,也可以用于回歸。我們一般只討論用于分類的決策樹。決策樹模型呈樹形結構,在分類問題中,表示基于特征對實例進行分類的過程,它可以認為是if-then規則的集合。在決策樹的結構中,每一個實例都被一條路徑或者一條規則所覆蓋。
2 特征選擇
特征選擇在于選取對訓練數據具有分類能力的特征。這樣可以提高決策樹學習的效率,如果利用一個特征進行分類的結果與隨機分類的結果沒有很大差別,則稱這個特征是沒有分類能力的,經驗上扔掉這樣的特征對決策樹學習的影響不大。
首先舉個例子,
母親要給你介紹男朋友的對話:
女兒:多大了?? ? 母親:26。
女兒:長的帥不?? ?母親:挺帥的。
女兒:有房不?? ? ?母親:有的。
女兒:那好,我去見見。
上圖中,長相和是否有房為什么放在年齡后面,不把他們放在前面呢,這是因為女兒把年齡看得比較重要,那么年齡就更具有分類的能力。回到特征選擇中,如果一個特征具有更好的分類能力,是在當前的條件下有最好的分類,那么就更應該選擇這個特征。
2.1 信息度量
某個信息有用,那么它的作用如何客觀、定量地體現出來呢,1948年,香農在他的論文“通信的數學原理”中提到了“信息熵”的概念,解決了信息的度量問題,并量化出信息的作用。
一條信息的信息量與其不確定性有著直接的關系,比如我們要搞清一件非常不確定的事,就需要大量的信息。相反如果對某件事了解較多,則不需要太多的信息就能把它搞清楚 。所以從這個角度看,可以認為,信息量就等于不確定的多少。
那么如何量化信息量的度量,假設某次世界杯上有32支球隊,誰會贏呢,每猜一次給一塊錢,告訴我是否猜對了,那么我需要掏多少錢才能知道誰是冠軍?我可以把球編上號,從1到32,然后提問:冠 軍在1-16號嗎?依次詢問,只需要五次,就可以知道結果,以誰是世界杯冠軍這條消息只值五塊錢。香農用“比特”這個概念來度量信息量。一個比特是 一位二進制數,在計算機中一個字節是8比特。
如果有一天有64支球隊進行決賽階段的比賽,那么“誰是世界杯冠軍”的信息量就是6比特,因為要多猜一次,信息量的比特數和所有可能情況的對數函數log有關,(log32=5,log64=6)
實際上不需要猜五次就能才出冠軍,因為像西班牙、巴西、德國這樣的球隊奪得冠軍的可能性比南非、尼日利亞等球隊大得多,因此第一次猜測時不需要把32支球隊等分成兩個組,而可以把少數幾支最有可能的球隊分成一組,把其他球隊分成一組。然后才冠軍球隊是否在那幾支熱門隊中。這樣,也許三次就猜出結果。因此,當每支球隊奪冠的可能性不等時,“誰是世界杯冠軍”的信息量比5比特少。香農指出,它的準確信息量應該是:
H = -(p1logp1 + p2logp2 + ... + p32log32)
其中,p1...p32為這三支球隊奪冠的概率。H的專業術語稱之為信息熵,單位為比特。當這32支球隊奪冠的幾率相同時,對應的信息熵等于5比特,這個可以通過計算得出。有一個特性就是,5比特是公式的最大值。那么信息熵(經驗熵)的具體定義可以為如下:
H(X)=∑?x∈X??P(x)logP(x)
2.2 信息增益
信息和消除不確定性是相聯系的。所以決策樹的過程其實是在尋找某一個特征對整個分類結果的不確定減少的過程。那么這樣就有一個概念叫做信息增益(information gain)。
信息增益表示得知特征X的信息而使得Y的信息的不確定性減少的程度,所以對于選擇特征進行分類的時候,要選擇信息增益較大的特征,這樣具有較強的分類能力。特征A對訓練數據集D的信息增益g(D,A),定義為集合D的信息熵H(D)與特征A給定條件下D的信息條件熵H(D|A)之差,即公式為:
根據信息增益的準則的特征選擇方法是:對于訓練數據集D,計算其每個特征的信息增益,并比較它們的大小,選擇信息增益最大的特征。
2.3 信息增益的計算
假設訓練數據集為D,|D|表示樣本個數。設有K個類C?k??,k=1,2,3,4...k,∣C?k??∣為屬于類C?k??的樣本個數,=∣D∣.設特征A有n個不同的取值{a1,a2,...,an},根據特征A的取值將D劃分為n個子集D1,D2,...,Dn,∣Di∣為樣本個數,其中Di中屬于Ck類的樣本的集合為D?i??k
信息熵的計算如下:
條件熵的計算如下:
?
3 常見決策樹使用的算法
ID3:信息增益 最大的準則
C4.5:信息增益比 最大的準則
CART :回歸樹: 平方誤差 最小
? ? ? ? ? ? ?分類樹: 基尼系數 ? 最小的準則,在sklearn中默認劃分的原則
基尼系數劃分比信息增益劃分更加仔細
4 sklearn決策樹API
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None) 決策樹分類器
常用參數:
criterion:默認是’gini’系數,也可以選擇信息增益的熵’entropy’
max_depth:樹的深度大小
random_state:隨機數種子
常用方法::
apply?返回每個樣本被預測的葉子的索引
decision_path:返回決策樹的路徑
fit_transform(X,y=None,fit_params)** 輸入數據,然后轉換
predict(X)?預測輸入數據的類型,完整代碼
score(X,y,sample_weight=None)?返回給定測試數據的準確精度
?
決策樹的結構、本地保存。
①sklearn.tree.export_graphviz() 該函數能導出DOT格式
? ? ? ? ? ?tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
②工具:(能夠將dot文件轉換為pdf、png)
? ? ? ? ? ?安卓:https://graphviz.gitlab.io/_pages/Download/Download_windows.html(下載解壓后需要添加到環境變量中)
? ? ? ? ? ?安裝graphviz ubuntu:sudo apt-get install graphviz ? ? ? ? ? ? ? ? ? ?Mac:brew install graphviz
③運行命令 然后我們運行這個命令
? ? ? ? ? ?$ dot -Tpng tree.dot -o tree.png
如果我們安裝了Python模塊pydotplus,我們可以直接在Python中生成PDF文件,通過pip install pydotplus,還需要安裝好graphviz,然后運行
import pydotplus from sklearn import tree from sklearn.datasets import load_iris clf = tree.DecisionTreeClassifier() iris = load_iris() clf = clf.fit(iris.data, iris.target) dot_data = tree.export_graphviz(clf, out_file=None) graph = pydotplus.graph_from_dot_data(dot_data) graph.write_pdf("iris.pdf")5 案例
決策樹對泰坦尼克號預測生死:數據來源http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
泰坦尼克號數據,數據集中的特征是票的類別,存活,乘坐班,年齡,登陸,home.dest,房間,票,船和性別。乘坐班是指乘客班(1,2,3),是社會經濟階層的代表。 其中age數據存在缺失。
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier,export_graphviz # 1.加載數據 datas = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")# 2.處理數據,找出目標值和特征值 x = datas[['pclass','age','sex']] y = datas['survived']# 2.1利用pandas.DataFrame.fillna方法處理缺失數據,inplace=True直接修改原對象 x['age'].fillna(x['age'].mean(),inplace=True)# 3 分割數據集為訓練集合測試集 x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)# 4.特征工程的抽取 特征->類別->one_hot編碼 # 當特征里面是類別的信息,應該要one-hot編碼,否則計算機不知道怎么去計算 dict = DictVectorizer(sparse=False) # 將x_train(DataFrame類型)轉換為字典,關鍵字orient='records' 時形成[{column -> value}, … , {column -> value}]的結構 # 整體構成一個列表,內層是將原始數據的每行提取出來形成字典 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'))# 5.決策樹進行預測 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', '女性', '男性'])?
6 決策樹的優缺點
優點: 簡單的理解和解釋,樹木可視化;需要很少的數據準備,其他技術通常需要數據歸一化?
缺點: 決策樹學習者可以創建,不能很好地推廣數據過于復雜的樹,這被稱為過擬合; 決策樹可能不穩定,因為數據的小變化可能會導致完全不同的樹被生成
改進: 減枝cart算法,隨機森林
總結
                            
                        - 上一篇: R语言的安装与配置
 - 下一篇: html 仿ios选择控件,仿ios垂直