決策樹在sklearn中的實現

CDA 資料分析師發表於2019-03-07

小夥伴們大家好~o( ̄▽ ̄)ブ,首先宣告一下,我的開發環境是Jupyter lab,所用的庫和版本大家參考:

Python 3.7.1(你的版本至少要3.4以上

Scikit-learn 0.20.0 (你的版本至少要0.20

Graphviz 0.8.4 (沒有畫不出決策樹哦,安裝程式碼conda install python-graphviz

Numpy 1.15.3, Pandas 0.23.4, Matplotlib 3.0.1, SciPy 1.1.0

  1. 決策樹是如何工作的
    決策樹(Decision Tree)是一種非引數的有監督學習方法,它能夠從一系列有特徵和標籤的資料中總結出決策規則,並用樹狀圖的結構來呈現這些規則,以解決分類和迴歸問題。決策樹演算法容易理解,適用各種資料,在解決各種問題時都有良好表現,尤其是以樹模型為核心的各種整合演算法,在各個行業和領域都有廣泛的應用。

我們來簡單瞭解一下決策樹是如何工作的。決策樹演算法的本質是一種圖結構,我們只需要問一系列問題就可以對資料進行分類了。比如說,來看看下面這組資料集,這是一系列已知物種以及所屬類別的資料:

我們現在的目標是,將動物們分為哺乳類和非哺乳類。那根據已經收集到的資料,決策樹演算法為我們算出了下面的這棵決策樹:

假如我們現在發現了一種新物種Python,它是冷血動物,體表帶鱗片,並且不是胎生,我們就可以通過這棵決策樹來判斷它的所屬類別。

可以看出,在這個決策過程中,我們一直在對記錄的特徵進行提問。最初的問題所在的地方叫做根節點,在得到結論前的每一個問題都是中間節點,而得到的每一個結論(動物的類別)都叫做葉子節點。

關鍵概念:節點
根節點:沒有進邊,有出邊。包含最初的,針對特徵的提問。 中間節點:既有進邊也有出邊,進邊只有一條,出邊可以有很多條。都是針對特徵的提問。 葉子節點:有進邊,沒有出邊,每個葉子節點都是一個類別標籤。 *子節點和父節點:在兩個相連的節點中,更接近根節點的是父節點,另一個是子節點。
2. 決策樹演算法的核心是什麼
決策樹演算法的核心是要解決兩個問題:

1)如何從資料表中找出最佳節點和最佳分枝?

2)如何讓決策樹停止生長,防止過擬合?

幾乎所有決策樹有關的模型調整方法,都圍繞這兩個問題展開。這兩個問題背後的原理十分複雜,我會在講解模型引數和屬性的時候為大家簡單解釋涉及到的部分。在這裡,我會盡量避免讓大家太過深入到決策樹複雜的原理和數學公式中(儘管決策樹的原理相比其他高階的演算法來說是非常簡單了),專注於實踐和應用。

  1. sklearn中的決策樹
    模組sklearn.tree
    sklearn中決策樹的類都在”tree“這個模組之下。這個模組總共包含五個類:

tree.DecisionTreeClassifier 分類樹
tree.DecisionTreeRegressor 迴歸樹
tree.export_graphviz 將生成的決策樹匯出為DOT格式,畫圖專用
tree.ExtraTreeClassifier 高隨機版本的分類樹
tree.ExtraTreeRegressor 高隨機版本的迴歸樹
我們會主要講解分類樹和迴歸樹,並用影像呈現給大家。

sklearn的基本建模流程
在那之前,我們先來了解一下sklearn建模的基本流程。

在這個流程下,分類樹對應的程式碼是:

from sklearn import tree #匯入需要的模組
​
clf = tree.DecisionTreeClassifier() #例項化
clf = clf.fit(X_train,y_train) #用訓練集資料訓練模型
result = clf.score(X_test,y_test) #匯入測試集,從介面中呼叫需要的資訊
  1. 分類決策樹的實現
    classsklearn.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=False)

這裡以SKlearn自帶的紅酒資料集為例,畫一棵分類決策樹。

#匯入需要的演算法庫和模組
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
​

探索資料
wine = load_wine()
wine.data
wine.data.shape
wine.target
wine.target.shape
​

如果wine是一張表,應該長這樣:
import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
​
wine.feature_names
wine.target_names
​

切分訓練集和測試集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
​
Xtrain.shape
Xtest.shape
​

建立模型
clf = tree.DecisionTreeClassifier()
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) #返回預測的準確度
score
​

繪製樹
import graphviz
feature_name = ['酒精','蘋果酸','灰','灰的鹼性','鎂','總酚','類黃酮','非黃烷類酚類','花青素','顏色強度','色調','od280/od315稀釋葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf
,out_file=None
,feature_names= feature_name
,class_names=["琴酒","雪莉","貝爾摩德"]
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph

最後繪製出來的樹就長這個樣子:

相關文章