1. 程式人生 > >用決策樹(CART)解決iris分類問題

用決策樹(CART)解決iris分類問題

datasets oba 可能 rom art PE 子集 花卉 調用

首先先看Iris數據集

Sepal.Length——花萼長度 Sepal.Width——花萼寬度

Petal.Length——花瓣長度 Petal.Width——花瓣寬度

通過上述4中屬性可以預測花卉屬於Setosa,Versicolour,Virginica 三個種類中的哪一類

決策樹 by CART

決策樹有挺多種,這裏講下CART

CART的執行過程是這樣的:

  1. 用特征值k和下限tk二分子集
  2. 不斷二分,直到到達最大深度或者劃分不能再減少不純度為止

這一下sklearn都會自動幫我們完成,我們調用就行了

如何避免過擬合問題

減小最大深度等等

一個tip:

? min_* 的調大

? max_*的調小

? 就是DecisionTreeClassifier裏面的參數,具體看文檔_(:з」∠)_

損失函數的比較

sklearn提供了兩種損失函數gini和entropy

gini是通過計算每個節點的不純度,具體公式如下↓

\(J(k,t_k) = \frac{m_{left}}{m}G_{left} + \frac{m_{right}}{m}G_{right}\)

entropy在這裏就不再贅述了

sklearn默認的是調用gini,因為gini的速度會快點,而且兩者最後的效果是差不多的,真要比的話entropy產生的決策樹會更平衡點

接下來我們來看代碼

from sklearn.datasets import
load_iris from sklearn.tree import DecisionTreeClassifier import numpy as np iris = load_iris() X = iris.data[:, 2:] # petal length and width y = iris.target #目標值 tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42) #定義最大深度和確定隨機種子 tree_clf.fit(X, y) #訓練 print(tree_clf.predict_proba([[5
, 1.5]])) #預測返回的是可能性 #以上代碼運行後將會產生如下輸出 [[ 0. 0.90740741 0.09259259]] #分別代表屬於每一種類別可能的概率 #也可以用如下代碼 print(tree_clf.predict[[5,1.5]]) #直接輸出屬於哪一類

看下上面生成的決策樹的樣子

技術分享圖片

註:

? valuse是它劃分到各個類的數量

? samples 指的是當前節點的數據個數

? 從左表橙色的點可以看出,gini=0意味著劃分到了相同的類別裏面

ps.以上代碼及圖片來自《Hands-On Machine Learning with Scikit-Learn》一書

如需轉載請註明出處

**喜歡要不支持下_(:з」∠)_**

用決策樹(CART)解決iris分類問題