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