用決策樹(CART)解決iris分類問題
阿新 • • 發佈:2018-06-10
datasets oba 可能 rom art PE 子集 花卉 調用
首先先看Iris數據集
Sepal.Length——花萼長度 Sepal.Width——花萼寬度
Petal.Length——花瓣長度 Petal.Width——花瓣寬度
通過上述4中屬性可以預測花卉屬於Setosa,Versicolour,Virginica 三個種類中的哪一類
決策樹 by CART
決策樹有挺多種,這裏講下CART
CART的執行過程是這樣的:
- 用特征值k和下限tk二分子集
- 不斷二分,直到到達最大深度或者劃分不能再減少不純度為止
這一下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分類問題