机器学习-分类之决策树原理及实战
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                机器学习-分类之决策树原理及实战
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                決策樹
-  
簡介
- 決策樹是一個非參數(shù)的監(jiān)督學(xué)習(xí)方法,又稱為判定樹,是運用于分類的一種樹結(jié)構(gòu),其中的每個內(nèi)部節(jié)點代表對某一屬性的一次測試,每條邊代表一個測試結(jié)果,葉子節(jié)點代表某個類或者類的分布。
 - 簡單決策樹 
 - 決策樹的決策過程一般需要從決策樹的根節(jié)點開始,將待測數(shù)據(jù)與決策樹中的特征節(jié)點進行比較,并按照比較結(jié)果選擇下一個比較分支,直到葉子節(jié)點作為最終的決策結(jié)果。決策樹除了用于分類外,還可以用于回歸和預(yù)測。分類樹對離散變量做決策樹,回歸樹對連續(xù)變量做決策樹。
 
 -  
決策樹學(xué)習(xí)
- 從數(shù)據(jù)產(chǎn)生決策樹的機器學(xué)習(xí)技術(shù)稱為決策樹學(xué)習(xí),通俗地說就是決策樹。一個決策樹一般包含以下3種類型的節(jié)點。 
- 決策節(jié)點:是對幾種可能方案的選擇,即最后選擇的最佳方案。如果決策屬于多級決策,則決策樹的中間可以有多個決策點,以決策樹根部的決策點作為最終的決策方案。
 - 狀態(tài)節(jié)點:代表備選方案的經(jīng)濟效果(期望值),通過各狀態(tài)節(jié)點的經(jīng)濟效果對比,按照一定的決策標準就可以選出最佳方案。由狀態(tài)節(jié)點引出的分支稱為概率枝,概率枝的數(shù)目表示可能出現(xiàn)的自然狀態(tài)數(shù)目每個分支上要注明該狀態(tài)出現(xiàn)的概率。
 - 終節(jié)點:每個方案在各種自然狀態(tài)下取得的最終結(jié)果,即樹的葉子。
 
 - 當然,作為機器學(xué)習(xí)的經(jīng)典算法,決策樹有其優(yōu)缺點。
 
優(yōu)點缺點 簡單易懂,原理清晰,可視化方便。 決策樹有時候是不穩(wěn)定的,因為數(shù)據(jù)微小的變動,可能生成完全不同的決策樹。 決策樹算法的時間復(fù)雜度(預(yù)測數(shù)據(jù))是用于訓(xùn)練決策樹的數(shù)據(jù)點的對數(shù)。 有些問題學(xué)習(xí)起來非常難,因為決策樹很難表達,如異或問題、奇偶校驗或多路復(fù)用器問題。 能夠處理數(shù)值和分類數(shù)據(jù)。 如果有些因素占據(jù)支配地位,決策樹是有偏差的。因此建議在擬合決策樹之前先平衡數(shù)據(jù)的影響因子。 可以通過統(tǒng)計學(xué)檢驗驗證模型。這使得模型的可靠性計算變得可能。 對連續(xù)性的字段比較難預(yù)測。 能夠處理多路輸出問題。 最優(yōu)決策樹的構(gòu)建屬于NP問題。 即使模型假設(shè)違反產(chǎn)生數(shù)據(jù)的真實模型,表現(xiàn)性能依舊很好。 - 決策樹學(xué)習(xí)過程 
- 決策樹學(xué)習(xí)是數(shù)據(jù)挖掘中的一個經(jīng)典方法,每個決策樹都表現(xiàn)了一種樹形結(jié)構(gòu),它由它的分支來對該類型的對象依靠屬性進行分類。每個決策樹可以依靠對源數(shù)據(jù)的分割進行數(shù)據(jù)測試。這個過程可以遞歸式地對樹進行修剪。當不能再進行分割或者一個單獨的類可以應(yīng)用于某一分支時,遞歸過程就完成了。學(xué)習(xí)過程概括如下。 
- 特征選擇:從訓(xùn)練數(shù)據(jù)的特征中選擇一個作為當前節(jié)點的分裂標準(特征選擇的標準不同產(chǎn)生了不同的特征決策樹算法,后面提到)。
 - 決策樹生成:根據(jù)所選特征評估標準,從上至下遞歸地生成子節(jié)點,直到數(shù)據(jù)集不可分時停止決策樹生成。
 - 剪枝:決策樹容易過擬合,需要剪枝來縮小樹的結(jié)構(gòu)和規(guī)模。(包括預(yù)剪枝和后剪枝)
 
 
 - 決策樹學(xué)習(xí)是數(shù)據(jù)挖掘中的一個經(jīng)典方法,每個決策樹都表現(xiàn)了一種樹形結(jié)構(gòu),它由它的分支來對該類型的對象依靠屬性進行分類。每個決策樹可以依靠對源數(shù)據(jù)的分割進行數(shù)據(jù)測試。這個過程可以遞歸式地對樹進行修剪。當不能再進行分割或者一個單獨的類可以應(yīng)用于某一分支時,遞歸過程就完成了。學(xué)習(xí)過程概括如下。 
 
 - 從數(shù)據(jù)產(chǎn)生決策樹的機器學(xué)習(xí)技術(shù)稱為決策樹學(xué)習(xí),通俗地說就是決策樹。一個決策樹一般包含以下3種類型的節(jié)點。 
 -  
決策樹分類
- 流程 
- 1.創(chuàng)建數(shù)據(jù)集。
 - 2.計算數(shù)據(jù)集的信息熵。
 - 3.遍歷所有特征,選擇信息熵最小的特征,即為最好的分類特征。
 - 4.根據(jù)上一步得到的分類特征分隔數(shù)據(jù)集,并將該特征從列表中移除。
 - 5.執(zhí)行遞歸函數(shù),返回步驟3,不斷分隔數(shù)據(jù)集,直到分類結(jié)束。
 - 6.使用決策樹執(zhí)行分類,返回分類結(jié)果。
 
 - 不難發(fā)現(xiàn),在構(gòu)建決策樹的過程中,要尋找劃分數(shù)據(jù)集的最好特征。例如,一個數(shù)據(jù)集有10個特征,每次選取哪一個作為劃分依據(jù)呢?這就必須采用量化的方法來進行判斷,量化劃分方法有很多,其中一項就是“信息論度量信息分類”,即使無序的數(shù)據(jù)變得有序。
 - 基于信息論的決策樹算法包括ID3、C4.5、CART等,這里不做具體介紹。其中涉及到了信息熵和信息增益的計算概念,可以查閱相關(guān)資料。
 
 - 流程 
 -  
Scikit-learn決策樹算法類庫
- sklearn實現(xiàn)了優(yōu)化過的CART樹算法,既可以分類也可以回歸,對應(yīng)的是DecisionTreeClassifier和DecisionTreeRegressor。參數(shù)類似,含義卻完全不同。常用的方法為fit()和predict(),前者表示訓(xùn)練,后者表示預(yù)測。
 
 -  
決策樹可視化
- 方法一 
- graphviz安裝即配置環(huán)境變量
 
 - 方法二 
- 使用pip安裝pydotplus
 
 
 - 方法一 
 -  
實戰(zhàn)
- 使用決策樹對身高體重數(shù)據(jù)進行分類
 - 說明 
- 數(shù)據(jù)集給出特征為身高和體重,分類結(jié)果為胖瘦。
 - 程序包含可視化代碼。
 
 - 代碼實現(xiàn) 
- # -*-coding:utf-8 -*-import numpy as npimport scipy as spfrom sklearn import treefrom sklearn.metrics import precision_recall_curvefrom sklearn.metrics import classification_reportfrom sklearn.model_selection import train_test_splitdef getData():'''獲取數(shù)據(jù)集:return:'''data = []labels = []with open("data/1.txt") as ifile:for line in ifile:tokens = line.strip().split(' ')data.append([float(tk) for tk in tokens[:-1]])labels.append(tokens[-1])x = np.array(data)labels = np.array(labels)y = np.zeros(labels.shape)y[labels == 'fat'] = 1return x, yif __name__ == '__main__':x, y = getData()x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)# 使用信息熵作為劃分標準,對決策樹進行訓(xùn)練clf = tree.DecisionTreeClassifier(criterion='entropy')print(clf)clf.fit(x_train, y_train)with open("tree.dot", 'w') as f:f = tree.export_graphviz(clf, out_file=f)# 系數(shù)反映每個特征的影響力。越大表示該特征在分類中起到的作用越大 '''print('兩個特征所占的權(quán)重是:', clf.feature_importances_)# 測試結(jié)果顯示answer = clf.predict(x_test)print('測試數(shù)據(jù)是:', x_test)print('測試數(shù)據(jù)使用模型預(yù)測對應(yīng)的類是:', answer)print('測試數(shù)據(jù)對應(yīng)的類是:', y_test)print(np.mean(answer == y_test))# 準確率與召回率'''precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train))answer = clf.predict_proba(x)[:, 1]print(classification_report(y, answer, target_names=['thin', 'fat']))# 落地模型import pydotplusdot_data = tree.export_graphviz(clf, out_file=None)graph = pydotplus.graph_from_dot_data(dot_data)graph.write_pdf("tree.pdf")
 
 
 -  
補充說明
- 考書《Python3數(shù)據(jù)分析與機器學(xué)習(xí)實戰(zhàn)》
 - 具體數(shù)據(jù)集和代碼可以查看我的GitHub,歡迎star或者fork
 
 
總結(jié)
以上是生活随笔為你收集整理的机器学习-分类之决策树原理及实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 安卓进阶系列-08异步加载AsynsTa
 - 下一篇: 机器学习-分类之多层感知机原理及实战