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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python:以鸢尾花数据为例,介绍决策树算法

發(fā)布時間:2023/12/10 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python:以鸢尾花数据为例,介绍决策树算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章參考來源:

https://www.cnblogs.com/yanqiang/p/11600569.html

https://www.cnblogs.com/baby-lily/p/10646226.html

https://blog.csdn.net/liuziyuan333183/article/details/107399633


決策樹算法

決策樹算法主要有ID3, C4.5, CART這三種。

ID3算法從樹的根節(jié)點開始,總是選擇信息增益最大的特征,對此特征施加判斷條件建立子節(jié)點,遞歸進行,直到信息增益很小或者沒有特征時結(jié)束。
信息增益:特征 A 對于某一訓(xùn)練集 D 的信息增益?g(D,A)g(D,A)?定義為集合 D 的熵?H(D)H(D)?與特征 A 在給定條件下 D 的熵?H(D/A)H(D/A)?之差。
熵(Entropy)是表示隨機變量不確定性的度量。

g(D,A)=H(D)?H(D∣A)g(D,A)=H(D)?H(D∣A)

C4.5是使用了信息增益比來選擇特征,這被看成是 ID3 算法的一種改進。

但這兩種算法都會導(dǎo)致過擬合的問題,需要進行剪枝。

決策樹的修剪,其實就是通過優(yōu)化損失函數(shù)來去掉不必要的一些分類特征,降低模型的整體復(fù)雜度。

CART 算法在生成樹的過程中,分類樹采用了基尼指數(shù)(Gini Index)最小化原則,而回歸樹選擇了平方損失函數(shù)最小化原則。
CART 算法也包含了樹的修剪,CART 算法從完全生長的決策樹底端剪去一些子樹,使得模型更加簡單。

具體代碼實現(xiàn)上,scikit-learn 提供的 DecisionTreeClassifier 類可以做多分類任務(wù)。

1. DecisionTreeClassifier API 的使用

和其他分類器一樣,DecisionTreeClassifier 需要兩個數(shù)組作為輸入:
X: 訓(xùn)練數(shù)據(jù),稀疏或稠密矩陣,大小為 [n_samples, n_features]
Y: 類別標(biāo)簽,整型數(shù)組,大小為 [n_samples]

from sklearn import tree X = [[0, 0], [1, 1]] Y = [0, 1] #clf = tree.DecisionTreeClassifier() clf = tree.DecisionTreeClassifier(criterion="entropy" #不純度的計算方法。"entropy"表示使用信息熵;"gini"表示使用基尼系數(shù),splitter="best" #控制決策樹中的隨機選項。“best”表示在分枝時會優(yōu)先選擇重要的特征進行分枝;“random”表示分枝時會更加隨機,常用來防止過擬合,max_depth=10 #限制樹的最大深度,min_samples_split=5 #節(jié)點必須包含訓(xùn)練樣本的個數(shù),min_samples_leaf=1 #葉子最少包含樣本的個數(shù),min_weight_fraction_leaf=0.0,max_features=None #限制分枝的特征個數(shù),random_state=None #輸入任意數(shù)字會讓模型穩(wěn)定下來。加上random_state這個參數(shù)后,score就不會總是變化,max_leaf_nodes=None,min_impurity_decrease=0.0 #限制信息增益的大小,信息增益小于設(shè)定值分枝不會發(fā)生,min_impurity_split=None #結(jié)點必須含有最小信息增益再劃分,class_weight=None #設(shè)置樣本的權(quán)重,當(dāng)正反樣本差別較大時,又需要對少的樣本進行精確估計時使用,搭配min_weight_fraction_leaf來剪枝,presort=False)clf = clf.fit(X, Y)

DecisionTreeClassifier參數(shù)如下:

函數(shù)的參數(shù)含義如下所示:

  • criterion:gini或者entropy,前者是基尼系數(shù),后者是信息熵。
  • splitter:?best or random 前者是在所有特征中找最好的切分點 后者是在部分特征中,默認的”best”適合樣本量不大的時候,而如果樣本數(shù)據(jù)量非常大,此時決策樹構(gòu)建推薦”random” 。
  • max_features:None(所有),log2,sqrt,N ?特征小于50的時候一般使用所有的
  • max_depth:? int or None, optional (default=None) 設(shè)置決策隨機森林中的決策樹的最大深度,深度越大,越容易過擬合,推薦樹的深度為:5-20之間。
  • min_samples_split:設(shè)置結(jié)點的最小樣本數(shù)量,當(dāng)樣本數(shù)量可能小于此值時,結(jié)點將不會在劃分。
  • min_samples_leaf: 這個值限制了葉子節(jié)點最少的樣本數(shù),如果某葉子節(jié)點數(shù)目小于樣本數(shù),則會和兄弟節(jié)點一起被剪枝。
  • min_weight_fraction_leaf: 這個值限制了葉子節(jié)點所有樣本權(quán)重和的最小值,如果小于這個值,則會和兄弟節(jié)點一起被剪枝默認是0,就是不考慮權(quán)重問題。
  • max_leaf_nodes: 通過限制最大葉子節(jié)點數(shù),可以防止過擬合,默認是"None”,即不限制最大的葉子節(jié)點數(shù)。
  • class_weight: 指定樣本各類別的的權(quán)重,主要是為了防止訓(xùn)練集某些類別的樣本過多導(dǎo)致訓(xùn)練的決策樹過于偏向這些類別。這里可以自己指定各個樣本的權(quán)重,如果使用“balanced”,則算法會自己計算權(quán)重,樣本量少的類別所對應(yīng)的樣本權(quán)重會高。
  • min_impurity_split: 這個值限制了決策樹的增長,如果某節(jié)點的不純度(基尼系數(shù),信息增益,均方差,絕對差)小于這個閾值則該節(jié)點不再生成子節(jié)點。即為葉子節(jié)點 。

模型擬合后,可以用于預(yù)測樣本的分類

clf.predict([[2., 2.]]) array([1])

此外,可以預(yù)測樣本屬于每個分類(葉節(jié)點)的概率,(輸出結(jié)果:0%,100%)

clf.predict_proba([[2., 2.]]) array([[0., 1.]])

DecisionTreeClassifier()?模型方法中也包含非常多的參數(shù)值。例如:

  • criterion = gini/entropy?可以用來選擇用基尼指數(shù)或者熵來做損失函數(shù)。
  • splitter = best/random?用來確定每個節(jié)點的分裂策略。支持 “最佳” 或者“隨機”。
  • max_depth = int?用來控制決策樹的最大深度,防止模型出現(xiàn)過擬合。
  • min_samples_leaf = int?用來設(shè)置葉節(jié)點上的最少樣本數(shù)量,用于對樹進行修剪。

2. 由鳶尾花數(shù)據(jù)集構(gòu)建決策樹

鳶尾花數(shù)據(jù)集:
數(shù)據(jù)集名稱的準(zhǔn)確名稱為 Iris Data Set,總共包含 150 行數(shù)據(jù)。每一行數(shù)據(jù)由 4 個特征值及一個目標(biāo)值組成。
其中 4 個特征值分別為:萼片長度、萼片寬度、花瓣長度、花瓣寬度。
而目標(biāo)值為三種不同類別的鳶尾花,分別為:Iris Setosa,Iris Versicolour,Iris Virginica。

DecisionTreeClassifier 既可以用于二分類,也可以用于多分類。
對于鳶尾花數(shù)據(jù)集,可以如下構(gòu)建決策樹:

from sklearn.datasets import load_iris from sklearn import tree X, y = load_iris(return_X_y=True) clf = tree.DecisionTreeClassifier() clf = clf.fit(X, y)

2.1 簡單繪制決策樹

擬合完后,可以用plot_tree()方法繪制出決策樹來,如下圖所示

tree.plot_tree(clf)

2.2 Graphviz形式輸出決策樹

也可以用 Graphviz 格式(export_graphviz)輸出。
如果使用的是 conda 包管理器,可以用如下方式安裝:

conda install python-graphviz
pip install graphviz

以下展示了用 Graphviz 輸出上述從鳶尾花數(shù)據(jù)集得到的決策樹,結(jié)果保存為?iris.pdf

import graphviz iris = load_iris() dot_data = tree.export_graphviz(clf, out_file=None) graph = graphviz.Source(dot_data) graph.render("iris")

export_graphviz 支持使用參數(shù)進行視覺優(yōu)化,包括根據(jù)分類或者回歸值繪制彩色的結(jié)點,也可以使用顯式的變量或者類名。
Jupyter Notebook 還可以自動內(nèi)聯(lián)呈現(xiàn)這些繪圖。

dot_data = tree.export_graphviz(clf, out_file=None,feature_names=iris.feature_names,class_names=iris.target_names,filled=True, rounded=True,special_characters=True) graph = graphviz.Source(dot_data) graph

2.3 文本形式輸出決策樹

此外,決策樹也可以使用 export_text 方法以文本形式輸出,這個方法不需要安裝其他包,也更加的簡潔。

from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.tree.export import export_text iris = load_iris() decision_tree = DecisionTreeClassifier(random_state=0, max_depth=2) decision_tree = decision_tree.fit(iris.data, iris.target) r = export_text(decision_tree, feature_names=iris['feature_names']) print(r) |--- petal width (cm) <= 0.80 | |--- class: 0 |--- petal width (cm) > 0.80 | |--- petal width (cm) <= 1.75 | | |--- class: 1 | |--- petal width (cm) > 1.75 | | |--- class: 2

3. 繪制決策平面

繪制由特征對構(gòu)成的決策平面,決策邊界由訓(xùn)練集得到的簡單閾值組成。

print(__doc__)import numpy as np import matplotlib.pyplot as pltfrom sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier, plot_tree# Parameters n_classes = 3 plot_colors = "ryb" plot_step = 0.02# Load data iris = load_iris()for pairidx, pair in enumerate([[0, 1], [0, 2], [0, 3],[1, 2], [1, 3], [2, 3]]):# We only take the two corresponding featuresX = iris.data[:, pair]y = iris.target# Trainclf = DecisionTreeClassifier().fit(X, y)# Plot the decision boundaryplt.subplot(2, 3, pairidx + 1)x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),np.arange(y_min, y_max, plot_step))plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)cs = plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu)plt.xlabel(iris.feature_names[pair[0]])plt.ylabel(iris.feature_names[pair[1]])# Plot the training pointsfor i, color in zip(range(n_classes), plot_colors):idx = np.where(y == i)plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i],cmap=plt.cm.RdYlBu, edgecolor='black', s=15)plt.suptitle("Decision surface of a decision tree using paired features") plt.legend(loc='lower right', borderpad=0, handletextpad=0) plt.axis("tight")plt.figure() clf = DecisionTreeClassifier().fit(iris.data, iris.target) plot_tree(clf, filled=True) plt.show() Automatically created module for IPython interactive environment

4. 數(shù)據(jù)集劃分及結(jié)果評估

數(shù)據(jù)集獲取

from sklearn import datasets # 導(dǎo)入方法類iris = datasets.load_iris() # 加載 iris 數(shù)據(jù)集 iris_feature = iris.data # 特征數(shù)據(jù) iris_target = iris.target # 分類數(shù)據(jù)

數(shù)據(jù)集劃分

from sklearn.model_selection import train_test_splitfeature_train, feature_test, target_train, target_test = train_test_split(iris_feature, iris_target, test_size=0.33, random_state=42)

模型訓(xùn)練及預(yù)測

from sklearn.tree import DecisionTreeClassifierdt_model = DecisionTreeClassifier() # 所有參數(shù)均置為默認狀態(tài) dt_model.fit(feature_train,target_train) # 使用訓(xùn)練集訓(xùn)練模型 predict_results = dt_model.predict(feature_test) # 使用模型對測試集進行預(yù)測

結(jié)果評估

scores = dt_model.score(feature_test, target_test) scores 1.0

參考文檔

scikit-learn 1.10.1 DecisionTreeClassifier API User Guide
Example: a decision tree on the iris dataset

總結(jié)

以上是生活随笔為你收集整理的Python:以鸢尾花数据为例,介绍决策树算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。