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