graphviz 画决策树_数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris
- 數(shù)據(jù)挖掘入門系列教程(四)之基于scikit-lean決策樹處理Iris
- 加載數(shù)據(jù)集
- 數(shù)據(jù)特征
- 訓(xùn)練
- 隨機森林
- 調(diào)參工程師
- 結(jié)尾
數(shù)據(jù)挖掘入門系列教程(四)之基于scikit-lean決策樹處理Iris
在上一篇博客,我們介紹了決策樹的一些知識。如果對決策樹還不是很了解的話,建議先閱讀上一篇博客,在來學(xué)習(xí)這一篇。
本次實驗基于scikit-learn中的Iris數(shù)據(jù)。說了好久的Iris,從OneR到?jīng)Q策樹,那么Iris到底長啥樣呢?
加載數(shù)據(jù)集
首先我們還是需要先加載數(shù)據(jù)集,數(shù)據(jù)集來自scikit自帶的iris數(shù)據(jù)集,數(shù)據(jù)集的內(nèi)容可以參考以前的博客,這里就不在贅述。
首先讓我們從scikit-learn中加載數(shù)據(jù)集。
from sklearn.datasets import load_iris dataset = load_iris() data = dataset.data target = dataset.target然后我們再使用pandas將數(shù)據(jù)進行格式化以下,添加Iris的屬性到數(shù)據(jù)集中。
import numpy as np import pandas as pd data = pd.DataFrame(data,columns=["sepal_length","sepal_width","petal_length","petal_width"]) data["class"] = targetdata的數(shù)據(jù)如下所示:
class代表類別。其他的就是Iris的屬性了。
數(shù)據(jù)特征
這里我們主要是用畫圖來看一看Iris數(shù)據(jù)集的特征。本來以為畫圖就matpotlib就行了,但是沒想到有seaborn這個好使用的庫,來自B站up主的提示。使用的庫如下:
- matplotlib
- seaborn
首先我們畫散點圖:
import matplotlib.pyplot as plt import seaborn as sb # data.dropna()去除里面的none元素 sb.pairplot(data.dropna(),hue="class")圖像如下所示:
上面的這幅圖展示了在四個屬性中的類別的分別情況。
同時我們還可以畫小提琴圖:
plt.figure(figsize=(20, 20)) for column_index, column in enumerate(data.columns):if column == 'class':continueplt.subplot(2, 2, column_index + 1)sb.violinplot(x='class', y=column, data=data)畫出的圖如下:
通過上面的這幅圖我們可以直觀的比較出哪一個變量更具有代表性。比如說petal_width 對類別0更加的友好。
接下來就是進行訓(xùn)練了。
訓(xùn)練
首先的首先,我們還是需要從數(shù)據(jù)集中抽出訓(xùn)練集和測試集。這個內(nèi)容在前面講過了,就不多講了。
from sklearn.model_selection import train_test_splitinput_data = data[["sepal_length","sepal_width","petal_length","petal_width"]] input_class = data["class"]train_data,test_data,train_class,test_class = train_test_split(input_data,input_class,random_state = 14)then,讓我們來開始進行訓(xùn)練吧,在scikit-learn中實現(xiàn)了決策樹,和前面的K近鄰算法一樣我們直接引用就行,調(diào)用fit(訓(xùn)練)和predict(預(yù)測)函數(shù)。使用如下所示:
from sklearn.tree import DecisionTreeClassifierdecision_tree = DecisionTreeClassifier(random_state=14) decision_tree.fit(train_data,train_class) predict_class = decision_tree.predict(test_data) predict_score = np.mean(predict_class == test_class) print("預(yù)測的準確度為{}".format(predict_score))DecisionTreeClassifier其他的參數(shù)在后面說,這里主要說一下random_state參數(shù)。為什么決策樹還需要random_state這個參數(shù),以下知乎上面的兩位博主的說法。
至于哪個說法是正確的,我暫時也不知道,如果有知道的,可以在評論區(qū)留言哦!
最后得到的預(yù)測結(jié)果如下所示:
這里值得注意的是DecisionTreeClassifier()函數(shù),里面可以添加很多參數(shù)。官方文檔在這里: https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html 。
這里還是稍微的說一下參數(shù)。
# criterion gini(默認)/tropy:這里對應(yīng)的就是之前的熵增益和Gini系數(shù)# splitter best(默認)/random 每個結(jié)點選擇的拆分策略# max_depth 樹的最大深度。# min_samples_split int類型或者float(默認2) 如果某節(jié)點的樣本數(shù)少于min_samples_split,則不會進行拆分了。浮點值表示分數(shù),代表所占比例# min_samples_leaf 默認=1 這個值限制了葉子節(jié)點最少的樣本數(shù),如果某葉子節(jié)點數(shù)目小于樣本數(shù),則會和兄弟節(jié)點一起被剪枝。# min_weight_fraction_leaf float(默認0.0) 這個值限制了葉子節(jié)點所有樣本權(quán)重,如果小于這個值,則會和兄弟節(jié)點一起被剪枝。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分布類別偏差很大,就會引入樣本權(quán)重,這時我們就要注意這個值了。# max_features int, float or {“auto”, “sqrt”, “l(fā)og2”}(默認0.0)# max_leaf_nodes 通過限制最大葉子節(jié)點數(shù),可以防止過擬合,默認是"None”,即不限制最大的葉子節(jié)點數(shù)。如果加了限制,算法會建立在最大葉子節(jié)點數(shù)內(nèi)最優(yōu)的決策樹。# class_weight dict/balanced 指定樣本各類別的的權(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é)點 。更多的可以去看官網(wǎng)細節(jié)。
然后我們可以將這個樹的結(jié)構(gòu)可視化,將文件保存在“tree.dot”中:
from sklearn.tree import export_graphviz with open("tree.dot",'w') as f:export_graphviz(decision_tree, feature_names =['sepal_length', 'sepal_width', 'petal_length', 'petal_width'], out_file = f)這個是決策樹的圖:
同樣,我們還可以使用交叉驗證,具體的使用可以參考別人的博客,或者看我的這一篇博客:
from sklearn.model_selection import cross_val_score decision_tree = DecisionTreeClassifier() scores = cross_val_score(decision_tree,input_data,input_class,scoring='accuracy') print("交叉驗證結(jié)果: {0:.2f}%".format(np.mean(scores) * 100))通過交叉驗證得到的準確度如下:
比上面的結(jié)果略低,不過這個是正常的。
隨機森林
前面的博客介紹了隨機樹,這里不多做介紹,直接看使用吧。我們通過導(dǎo)入RandomForestClassifier模塊,并指令森林中樹的個數(shù)為30,具體的參數(shù)看官網(wǎng)
from sklearn.ensemble import RandomForestClassifier rft = RandomForestClassifier(n_estimators=20,random_state=14) rft.fit(train_data,train_class) predict_class = rft.predict(test_data) predict_score = np.mean(predict_class == test_class) print("隨機森林預(yù)測的準確度為{}".format(predict_score))最后的結(jié)果如下圖
然后進行交叉驗證:
scores = cross_val_score(rft,input_data,input_class,scoring='accuracy') print("Accuracy: {0:.2f}%".format(np.mean(scores) * 100))結(jié)果如下:
emm,好像和上面的結(jié)果一樣,因為這個數(shù)據(jù)集很小,可能會有這種情況。
調(diào)參工程師
首先,我們可以對決策樹的max_feature和max_depth進行調(diào)參,改變其值,最終的結(jié)果如下:
在隨機森林中,我們可以對樹的個數(shù)進行調(diào)參,結(jié)果如下圖:
結(jié)尾
這次并沒有使用《 Python數(shù)據(jù)挖掘入門與實踐 》書上的例子,實在是它打籃球的數(shù)據(jù)找不到,emm。相比較與oneR算法的70%左右的正確率,決策樹95%正確率已經(jīng)算足夠優(yōu)秀了。
盡管代碼寫起來很簡單,也很容易實現(xiàn)得到結(jié)果,但是我們真正應(yīng)該了解的是里面的內(nèi)涵:決策樹是什么?里面是怎樣工作的?以及所蘊含的含義……
項目地址:GitHub
總結(jié)
以上是生活随笔為你收集整理的graphviz 画决策树_数据挖掘入门系列教程(四)之基于scikit-lean决策树处理Iris的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1002 写出这个数 (20分)
- 下一篇: 如何下载jdk源码进行阅读