日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

决策树(Decision Tree,DT)

發布時間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 决策树(Decision Tree,DT) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 決策樹模型與學習
    • 2. 特征選擇
      • 2.1 特征選擇Python代碼
    • 3. 決策樹的生成
      • 3.1 Python代碼
    • 4. 決策樹的剪枝
    • 5. CART 算法
    • 6. sklearn 例子
      • 6.1 書上貸款例子
      • 6.2 鳶尾花 及 決策樹可視化
    • 附. 本文完整代碼

決策樹(decision tree)是一種基本的分類與回歸方法。

  • 分類問題中,基于特征對實例進行分類的過程。
  • 優點:模型具有可讀性,分類速度快。
  • 學習:利用訓練數據,根據損失函數最小化的原則建立決策樹模型。
  • 預測:對新的數據,利用決策樹模型進行分類。

決策樹學習通常包括3個步驟:特征選擇、決策樹生成決策樹修剪。

Quinlan在1986年提出的ID3算法、1993年提出的C4.5算法
Breiman等人在1984年提出的CART算法

1. 決策樹模型與學習

決策樹由結點(node)和有向邊(directed edge)組成。

  • 內部結點(internal node)和葉結點(leaf node)。
  • 內部結點表示一個特征或屬性,結點表示一個。
  • 用決策樹分類,從根結點開始,對實例的某一特征進行測試,根據測試結果,將實例分配到其子結點;這時,每一個子結點對應著該特征的一個取值。
  • 遞歸地對實例進行測試并分配,直至達到葉結點。最后將實例分到葉結點的類中。

決策樹學習本質:從訓練數據集中歸納出一組分類規則。

  • 需要一個與訓練數據矛盾較小的決策樹,同時具有很好的泛化能力。
  • 決策樹學習的損失函數:通常是正則化的極大似然函數。
  • 決策樹學習的策略:損失函數為目標函數的最小化。

2. 特征選擇

決策樹訓練時高度太高,對訓練數據準確率高,但泛化能力差,需要剪枝。

常用的準則

(1)樣本集合DDD對特征AAA信息增益(ID3)

g(D,A)=H(D)?H(D∣A)g(D, A)=H(D)-H(D|A)g(D,A)=H(D)?H(DA)

H(D)=?∑k=1K∣Ck∣∣D∣log?2∣Ck∣∣D∣H(D)=-\sum_{k=1}^{K} \frac{\left|C_{k}\right|}{|D|} \log _{2} \frac{\left|C_{k}\right|}{|D|}H(D)=?k=1K?DCk??log2?DCk??

H(D∣A)=∑i=1n∣Di∣∣D∣H(Di)H(D | A)=\sum_{i=1}^{n} \frac{\left|D_{i}\right|}{|D|} H\left(D_{i}\right)H(DA)=i=1n?DDi??H(Di?)

其中,H(D)H(D)H(D)是數據集DDD的熵,H(Di)H(D_i)H(Di?)是數據集DiD_iDi?的熵,H(D∣A)H(D|A)H(DA)是數據集DDD對特征AAA的條件熵。 DiD_iDi?DDD中特征AAA取第iii個值的樣本子集,CkC_kCk?DDD中屬于第kkk類的樣本子集。nnn是特征AAA取值的個數,KKK是類的個數。

  • 熵越大,隨機變量的不確定性就越大
  • 信息增益(information gain)表示得知特征X的信息而使得類Y的信息的不確定性減少的程度。
  • 選擇信息增益 大的

(2)樣本集合DDD對特征AAA信息增益比(C4.5)

gR(D,A)=g(D,A)HA(D)g_{R}(D, A)=\frac{g(D, A)}{H_A(D)}gR?(D,A)=HA?(D)g(D,A)?

其中,g(D,A)g(D,A)g(D,A)是信息增益,HA(D)H_A(D)HA?(D)是數據集DDD關于特征AAA的熵。

(3)樣本集合DDD 基尼指數(CART)

Gini?(D)=1?∑k=1K(∣Ck∣∣D∣)2\operatorname{Gini}(D)=1-\sum_{k=1}^{K}\left(\frac{\left|C_{k}\right|}{|D|}\right)^{2}Gini(D)=1?k=1K?(DCk??)2

特征AAA條件下集合DDD的基尼指數:

Gini?(D,A)=∣D1∣∣D∣Gini?(D1)+∣D2∣∣D∣Gini?(D2)\operatorname{Gini}(D, A)=\frac{\left|D_{1}\right|}{|D|} \operatorname{Gini}\left(D_{1}\right)+\frac{\left|D_{2}\right|}{|D|} \operatorname{Gini}\left(D_{2}\right)Gini(D,A)=DD1??Gini(D1?)+DD2??Gini(D2?)

  • 基尼指數表示集合D的不確定性,基尼指數 Gini(D,A)Gini(D,A)Gini(D,A) 表示經A=aA=aA=a分割后集合DDD的不確定性。
  • 基尼指數值越大,樣本集合的不確定性也就越大,這一點與熵相似。
  • 選擇 基尼指數 小的

2.1 特征選擇Python代碼

def get_data():datasets = [['青年', '否', '否', '一般', '否'],['青年', '否', '否', '好', '否'],['青年', '是', '否', '好', '是'],['青年', '是', '是', '一般', '是'],['青年', '否', '否', '一般', '否'],['中年', '否', '否', '一般', '否'],['中年', '否', '否', '好', '否'],['中年', '是', '是', '好', '是'],['中年', '否', '是', '非常好', '是'],['中年', '否', '是', '非常好', '是'],['老年', '否', '是', '非常好', '是'],['老年', '否', '是', '好', '是'],['老年', '是', '否', '好', '是'],['老年', '是', '否', '非常好', '是'],['老年', '否', '否', '一般', '否'],]labels = [u'年齡', u'有工作', u'有自己的房子', u'信貸情況', u'分類']# 字符串前加 u, 后面字符串以 Unicode 格式 進行編碼,一般用在中文字符串前面,防止亂碼return datasets, labels; # ---------書上貸款例子----------------- datasets, labels = get_data()def cal_entropy(datasets): # 經驗熵H(D)data_len = len(datasets)label_count = {}for i in range(data_len):label = datasets[i][-1]if label not in label_count:label_count[label] = 0label_count[label] += 1entropy = -sum([(p / data_len) * log(p / data_len, 2) for p in label_count.values()])return entropydef cond_entropy(datasets, axis=0): # 經驗條件熵H(D|A)data_len = len(datasets)feature_set = {}for i in range(data_len):feature = datasets[i][axis]if feature not in feature_set:feature_set[feature] = []feature_set[feature].append(datasets[i])cond_ent = sum([(len(p) / data_len) * cal_entropy(p) for p in feature_set.values()])return cond_entdef info_gain(entropy, cond_ent): # 信息增益return entropy - cond_entdef info_gain_train(datasets): # 基于特征信息增益的特征選擇count = len(datasets[0]) - 1entropy = cal_entropy(datasets)best_feature = []for i in range(count):info_gain_i = info_gain(entropy, cond_entropy(datasets, axis=i))best_feature.append((i, info_gain_i))print("特征({})- info_gain - {:.3f}".format(labels[i], info_gain_i))best_feature_i = max(best_feature, key=lambda x: x[-1])print("特征({})的信息增益最大,選為根節點的特征".format(labels[best_feature_i[0]]))info_gain_train(np.array(datasets)) 特征(年齡)- info_gain - 0.083 特征(有工作)- info_gain - 0.324 特征(有自己的房子)- info_gain - 0.420 特征(信貸情況)- info_gain - 0.363 特征(有自己的房子)的信息增益最大,選為根節點的特征

3. 決策樹的生成

通常使用信息增益最大、信息增益比最大或基尼指數最小作為特征選擇的準則。

決策樹的生成往往通過計算信息增益或其他指標,從根結點開始,遞歸地產生決策樹。
這相當于用信息增益或其他準則不斷地選取局部最優的特征,或將訓練集分割為能夠基本正確分類的子集。

  • ID3算法只有樹的生成,所以該算法生成的樹容易產生過擬合
  • C4.5算法與ID3算法相似,進行了改進。C4.5在生成的過程中,用信息增益比來選擇特征。

3.1 Python代碼

class Node():def __init__(self, root=True, label=None, feature_name=None, feature=None):self.root = rootself.label = labelself.feature_name = feature_nameself.feature = featureself.tree = {}self.result = {'label:': self.label,'feature:': self.feature,'tree:': self.tree}def __repr__(self): # 類似str方法,更側重程序員調試print('{}'.format(self.result))def add_node(self, val, node):self.tree[val] = nodedef predict(self, features):if self.root is True:return self.labelreturn self.tree[features[self.feature]].predict(features)class DTree():def __init__(self, epsilon=0.1): # 信息增益閾值, < epsilon 時,結束決策樹展開self.epsilon = epsilonself._tree = {}@staticmethoddef cal_entropy(datasets): # 經驗熵H(D)data_len = len(datasets)label_count = {}for i in range(data_len):label = datasets[i][-1]if label not in label_count:label_count[label] = 0label_count[label] += 1entropy = -sum([(p / data_len) * log(p / data_len, 2) for p in label_count.values()])return entropydef cond_entropy(self, datasets, axis=0): # 經驗條件熵H(D|A)data_len = len(datasets)feature_set = {}for i in range(data_len):feature = datasets[i][axis]if feature not in feature_set:feature_set[feature] = []feature_set[feature].append(datasets[i])cond_ent = sum([(len(p) / data_len) * self.cal_entropy(p) for p in feature_set.values()])return cond_ent@staticmethoddef info_gain(entropy, cond_ent): # 信息增益return entropy - cond_entdef info_gain_train(self, datasets): # 基于特征信息增益的特征選擇count = len(datasets[0]) - 1entropy = self.cal_entropy(datasets)best_feature = []for i in range(count):info_gain_i = info_gain(entropy, cond_entropy(datasets, axis=i))best_feature.append((i, info_gain_i))print("特征({})- info_gain - {:.3f}".format(labels[i], info_gain_i))best_feature_i = max(best_feature, key=lambda x: x[-1])return best_feature_idef train(self, train_data):''':input: 數據集D(DataFrame格式),特征集A,閾值eta:return: 決策樹DT'''_, y_train, features = train_data.iloc[:, :-1], train_data.iloc[:, -1], train_data.columns[:-1]# 1. 若所有D實例都屬于同一分類,不用分了,直接返回那個類if len(y_train.value_counts()) == 1:return Node(root=True, label=y_train.iloc[0])# 2. 若沒有特征A,返回D中數量最多的分類if len(features) == 0:return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])# 3. 計算最大信息增益,取為特征max_feature, max_info_gain = self.info_gain_train(np.array(train_data))max_feature_name = features[max_feature]# 4. 如果信息增益小于閾值epsilon,置為單節點,將實例數最大的類作為節點標記if max_info_gain < self.epsilon:return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])# 5. 構建Ag子集node_tree = Node(root=False, feature_name=max_feature_name, feature=max_feature)feature_list = train_data[max_feature_name].value_counts().indexfor f in feature_list:sub_train_df = train_data.loc[train_data[max_feature_name] == f].drop([max_feature_name], axis=1)# 6. 遞歸生成樹sub_tree = self.train(sub_train_df)node_tree.add_node(f, sub_tree)return node_treedef fit(self, train_data):self._tree = self.train(train_data)return self._treedef predict(self, X_test):return self._tree.predict(X_test)train_data = pd.DataFrame(datasets, columns=labels) dt = DTree() tree = dt.fit(train_data) print(dt.predict(['老年', '否', '否', '一般'])) print(dt.predict(['青年', '否', '是', '一般'])) print(dt.predict(['中年', '是', '否', '好'])) print(dt.predict(['老年', '否', '是', '一般']))

4. 決策樹的剪枝

學習時,過多考慮準確性,樹復雜,過擬合,泛化能力差,需要剪枝。

方法:極小化決策樹整體損失函數

5. CART 算法

分類與回歸樹(classification and regression tree,CART)模型

  • 二叉樹
  • 左分支,是;右分支,否
  • (1)決策樹生成:基于訓練數據集生成決策樹,生成的決策樹要盡量大;
    (2)決策樹剪枝:用驗證數據集對已生成的樹進行剪枝并選擇最優子樹,這時用損失函數最小作為剪枝的標準。

6. sklearn 例子

sklearn.tree.DecisionTreeClassifier

class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best',max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None,class_weight=None, presort='deprecated', ccp_alpha=0.0)
  • 特征選擇標準:
criterion{“gini”, “entropy”}, default=”gini”
  • 擇優劃分、樹的最大深度、最小劃分幾類、葉子節點個數等參數

6.1 書上貸款例子

# ---------書上貸款例子----------------- datasets, labels = get_data() train_data = np.array(pd.DataFrame(datasets, columns=labels)) X_train, y_train = train_data[:, :-1], train_data[:, -1:] encoder = preprocessing.OrdinalEncoder() # 將字符轉成浮點 encoder.fit(X_train) # 先擬合 X_train = encoder.transform(X_train) # 轉換成數字 A = encoder.transform([['青年', '否', '是', '一般']]) B = encoder.transform([['中年', '是', '否', '好']]) C = encoder.transform([['老年', '否', '是', '一般']])encoder = preprocessing.OrdinalEncoder() encoder.fit(y_train) y_train = encoder.transform(y_train) # sklearn 決策樹 clf = DecisionTreeClassifier() clf.fit(X_train, y_train) print(encoder.inverse_transform([clf.predict(A)])) print(clf.predict_proba(B)) print(clf.predict_proba(C)) [['是']] [[0. 1.]] [[0. 1.]]

6.2 鳶尾花 及 決策樹可視化

# ------------鳶尾花--------------- iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df['label'] = iris.target df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label'] data = np.array(df.iloc[:100, [0, 1, -1]]) X = data[:, :2] y = data[:, -1] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) clf = DecisionTreeClassifier() print(clf) clf.fit(X_train, y_train) print(clf.score(X_test, y_test))# --------------決策樹可視化------------- # 需要安裝graphviz,添加path,可視化決策樹 with open('mytree.dot', 'w', encoding='utf-8') as f:dot_data = export_graphviz(clf, out_file=None, feature_names=df.columns[:2],filled=True, rounded=True, special_characters=True, class_names=iris.target_names[0:2]) dot = graphviz.Source(dot_data) dot.view() # 寫入png , pdf graph = pydotplus.graph_from_dot_data(dot_data) graph.write_png('tree.png') # cmd: dot -Tpdf tree.dot -o output.pdf,dot -Tpng tree.dot -o output.png

決策樹可視化

附. 本文完整代碼

# -*- coding:utf-8 -*- # @Python Version: 3.7 # @Time: 2020/3/13 19:36 # @Author: Michael Ming # @Website: https://michael.blog.csdn.net/ # @File: 5.decisionTree.py # @Reference: https://github.com/fengdu78/lihang-codeimport pandas as pd import numpy as np from sklearn import preprocessing from sklearn.model_selection import train_test_split from collections import Counter import math from math import log import pprint import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.tree import export_graphviz import graphviz import pydotplusdef get_data():datasets = [['青年', '否', '否', '一般', '否'],['青年', '否', '否', '好', '否'],['青年', '是', '否', '好', '是'],['青年', '是', '是', '一般', '是'],['青年', '否', '否', '一般', '否'],['中年', '否', '否', '一般', '否'],['中年', '否', '否', '好', '否'],['中年', '是', '是', '好', '是'],['中年', '否', '是', '非常好', '是'],['中年', '否', '是', '非常好', '是'],['老年', '否', '是', '非常好', '是'],['老年', '否', '是', '好', '是'],['老年', '是', '否', '好', '是'],['老年', '是', '否', '非常好', '是'],['老年', '否', '否', '一般', '否'],]labels = [u'年齡', u'有工作', u'有自己的房子', u'信貸情況', u'分類']# 字符串前加 u, 后面字符串以 Unicode 格式 進行編碼,一般用在中文字符串前面,防止亂碼return datasets, labels;# ---------書上貸款例子----------------- datasets, labels = get_data() train_data = np.array(pd.DataFrame(datasets, columns=labels)) X_train, y_train = train_data[:, :-1], train_data[:, -1:] encoder = preprocessing.OrdinalEncoder() # 將字符轉成浮點 encoder.fit(X_train) # 先擬合 X_train = encoder.transform(X_train) # 轉換成數字 A = encoder.transform([['青年', '否', '是', '一般']]) B = encoder.transform([['中年', '是', '否', '好']]) C = encoder.transform([['老年', '否', '是', '一般']])encoder = preprocessing.OrdinalEncoder() encoder.fit(y_train) y_train = encoder.transform(y_train) # sklearn 決策樹 clf = DecisionTreeClassifier() clf.fit(X_train, y_train) print(encoder.inverse_transform([clf.predict(A)])) print(clf.predict_proba(B)) print(clf.predict_proba(C))# --------------決策樹可視化------------- # 需要安裝graphviz,添加path,可視化決策樹 with open('mytree.dot', 'w', encoding='utf-8') as f:dot_data = export_graphviz(clf, out_file=None, feature_names=clf.feature_importances_,filled=True, rounded=True, special_characters=True) dot = graphviz.Source(dot_data) # dot.view() # 寫入png , pdf graph = pydotplus.graph_from_dot_data(dot_data) graph.write_png('tree.png')# cmd: dot -Tpdf tree.dot -o output.pdf,dot -Tpng tree.dot -o output.png# -----------自編程,抄一遍--------------- # ----特征選擇,基于信息增益---- def cal_entropy(datasets): # 經驗熵H(D)data_len = len(datasets)label_count = {}for i in range(data_len):label = datasets[i][-1]if label not in label_count:label_count[label] = 0label_count[label] += 1entropy = -sum([(p / data_len) * log(p / data_len, 2) for p in label_count.values()])return entropydef cond_entropy(datasets, axis=0): # 經驗條件熵H(D|A)data_len = len(datasets)feature_set = {}for i in range(data_len):feature = datasets[i][axis]if feature not in feature_set:feature_set[feature] = []feature_set[feature].append(datasets[i])cond_ent = sum([(len(p) / data_len) * cal_entropy(p) for p in feature_set.values()])return cond_entdef info_gain(entropy, cond_ent): # 信息增益return entropy - cond_entdef info_gain_train(datasets): # 基于特征信息增益的特征選擇count = len(datasets[0]) - 1entropy = cal_entropy(datasets)best_feature = []for i in range(count):info_gain_i = info_gain(entropy, cond_entropy(datasets, axis=i))best_feature.append((i, info_gain_i))print("特征({})- info_gain - {:.3f}".format(labels[i], info_gain_i))best_feature_i = max(best_feature, key=lambda x: x[-1])print("特征({})的信息增益最大,選為根節點的特征".format(labels[best_feature_i[0]]))info_gain_train(np.array(datasets))# -------ID3算法生成決策樹---------class Node():def __init__(self, root=True, label=None, feature_name=None, feature=None):self.root = rootself.label = labelself.feature_name = feature_nameself.feature = featureself.tree = {}self.result = {'label:': self.label,'feature:': self.feature,'tree:': self.tree}def __repr__(self): # 類似str方法,更側重程序員調試print('{}'.format(self.result))def add_node(self, val, node):self.tree[val] = nodedef predict(self, features):if self.root is True:return self.labelreturn self.tree[features[self.feature]].predict(features)class DTree():def __init__(self, epsilon=0.1): # 信息增益閾值, < epsilon 時,結束決策樹展開self.epsilon = epsilonself._tree = {}@staticmethoddef cal_entropy(datasets): # 經驗熵H(D)data_len = len(datasets)label_count = {}for i in range(data_len):label = datasets[i][-1]if label not in label_count:label_count[label] = 0label_count[label] += 1entropy = -sum([(p / data_len) * log(p / data_len, 2) for p in label_count.values()])return entropydef cond_entropy(self, datasets, axis=0): # 經驗條件熵H(D|A)data_len = len(datasets)feature_set = {}for i in range(data_len):feature = datasets[i][axis]if feature not in feature_set:feature_set[feature] = []feature_set[feature].append(datasets[i])cond_ent = sum([(len(p) / data_len) * self.cal_entropy(p) for p in feature_set.values()])return cond_ent@staticmethoddef info_gain(entropy, cond_ent): # 信息增益return entropy - cond_entdef info_gain_train(self, datasets): # 基于特征信息增益的特征選擇count = len(datasets[0]) - 1entropy = self.cal_entropy(datasets)best_feature = []for i in range(count):info_gain_i = info_gain(entropy, cond_entropy(datasets, axis=i))best_feature.append((i, info_gain_i))print("特征({})- info_gain - {:.3f}".format(labels[i], info_gain_i))best_feature_i = max(best_feature, key=lambda x: x[-1])return best_feature_idef train(self, train_data):''':input: 數據集D(DataFrame格式),特征集A,閾值eta:return: 決策樹DT'''_, y_train, features = train_data.iloc[:, :-1], train_data.iloc[:, -1], train_data.columns[:-1]# 1. 若所有D實例都屬于同一分類,不用分了,直接返回那個類if len(y_train.value_counts()) == 1:return Node(root=True, label=y_train.iloc[0])# 2. 若沒有特征A,返回D中數量最多的分類if len(features) == 0:return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])# 3. 計算最大信息增益,取為特征max_feature, max_info_gain = self.info_gain_train(np.array(train_data))max_feature_name = features[max_feature]# 4. 如果信息增益小于閾值epsilon,置為單節點,將實例數最大的類作為節點標記if max_info_gain < self.epsilon:return Node(root=True, label=y_train.value_counts().sort_values(ascending=False).index[0])# 5. 構建Ag子集node_tree = Node(root=False, feature_name=max_feature_name, feature=max_feature)feature_list = train_data[max_feature_name].value_counts().indexfor f in feature_list:sub_train_df = train_data.loc[train_data[max_feature_name] == f].drop([max_feature_name], axis=1)# 6. 遞歸生成樹sub_tree = self.train(sub_train_df)node_tree.add_node(f, sub_tree)return node_treedef fit(self, train_data):self._tree = self.train(train_data)return self._treedef predict(self, X_test):return self._tree.predict(X_test)train_data = pd.DataFrame(datasets, columns=labels) dt = DTree() tree = dt.fit(train_data) print(dt.predict(['老年', '否', '否', '一般'])) print(dt.predict(['青年', '否', '是', '一般'])) print(dt.predict(['中年', '是', '否', '好'])) print(dt.predict(['老年', '否', '是', '一般']))# ------------鳶尾花--------------- iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df['label'] = iris.target df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label'] data = np.array(df.iloc[:100, [0, 1, -1]]) X = data[:, :2] y = data[:, -1] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) clf = DecisionTreeClassifier() print(clf) clf.fit(X_train, y_train) print(clf.score(X_test, y_test)) # --------------決策樹可視化------------- # 需要安裝graphviz,添加path,可視化決策樹 with open('mytree.dot', 'w', encoding='utf-8') as f:dot_data = export_graphviz(clf, out_file=None, feature_names=df.columns[:2],filled=True, rounded=True, special_characters=True, class_names=iris.target_names[0:2]) dot = graphviz.Source(dot_data) dot.view() # 寫入png , pdf graph = pydotplus.graph_from_dot_data(dot_data) graph.write_png('tree.png') # cmd: dot -Tpdf tree.dot -o output.pdf,dot -Tpng tree.dot -o output.png 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的决策树(Decision Tree,DT)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。