決策樹模型——鳶尾花分類

構建一個決策樹分類模型,實現對鳶尾花的分類

1.lris數據集介紹:

鳶尾花數據集是機器學習領域中非常經典的一個分類數據集。數據集全名爲:Iris Data Set,總共包含150行數據。

每一行由4個特徵值及一個目標值(類別變量)組成。

其中4個特徵值分別是:萼片長度、萼片寬度、花瓣長度、花瓣寬度

目標值爲3種不同類別的鳶尾花:山鳶尾、變色鳶尾、維吉尼亞鳶尾

2.讀取數據

Iris數據集裏是一個矩陣,每一列代表了萼片或花瓣的長寬,一共4列,每一列代表某個被測量的鳶尾植物,一共採樣了150條記錄。

from sklearn.datasets import load_iris  # 導入方法類

iris = load_iris()  #導入數據集iris
iris_feature = iris.data    #特徵數據
iris_target = iris.target   #分類數據
print (iris.data)          #輸出數據集
print (iris.target)        #輸出真實標籤
print (len(iris.target) )
print (iris.data.shape )   #150個樣本 每個樣本4個特徵


#輸出結果如下:
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]
 [5.4 3.9 1.7 0.4]
 [4.6 3.4 1.4 0.3]
 [5.  3.4 1.5 0.2]
 [4.4 2.9 1.4 0.2]
 [4.9 3.1 1.5 0.1]
 [5.4 3.7 1.5 0.2]
 [4.8 3.4 1.6 0.2]
 [4.8 3.  1.4 0.1]
 [4.3 3.  1.1 0.1]
 [5.8 4.  1.2 0.2]
 [5.7 4.4 1.5 0.4]
 [5.4 3.9 1.3 0.4]
 [5.1 3.5 1.4 0.3]
 [5.7 3.8 1.7 0.3]
 [5.1 3.8 1.5 0.3]
 [5.4 3.4 1.7 0.2]
 [5.1 3.7 1.5 0.4]
 [4.6 3.6 1.  0.2]
 [5.1 3.3 1.7 0.5]
 [4.8 3.4 1.9 0.2]
 [5.  3.  1.6 0.2]
 [5.  3.4 1.6 0.4]
 [5.2 3.5 1.5 0.2]
 [5.2 3.4 1.4 0.2]
 [4.7 3.2 1.6 0.2]
 [4.8 3.1 1.6 0.2]
 [5.4 3.4 1.5 0.4]
 [5.2 4.1 1.5 0.1]
 [5.5 4.2 1.4 0.2]
 [4.9 3.1 1.5 0.2]
 [5.  3.2 1.2 0.2]
 [5.5 3.5 1.3 0.2]
 [4.9 3.6 1.4 0.1]
 [4.4 3.  1.3 0.2]
 [5.1 3.4 1.5 0.2]
 [5.  3.5 1.3 0.3]
 [4.5 2.3 1.3 0.3]
 [4.4 3.2 1.3 0.2]
 [5.  3.5 1.6 0.6]
 [5.1 3.8 1.9 0.4]
 [4.8 3.  1.4 0.3]
 [5.1 3.8 1.6 0.2]
 [4.6 3.2 1.4 0.2]
 [5.3 3.7 1.5 0.2]
 [5.  3.3 1.4 0.2]
 [7.  3.2 4.7 1.4]
 [6.4 3.2 4.5 1.5]
 [6.9 3.1 4.9 1.5]
 [5.5 2.3 4.  1.3]
 [6.5 2.8 4.6 1.5]
 [5.7 2.8 4.5 1.3]
 [6.3 3.3 4.7 1.6]
 [4.9 2.4 3.3 1. ]
 [6.6 2.9 4.6 1.3]
 [5.2 2.7 3.9 1.4]
 [5.  2.  3.5 1. ]
 [5.9 3.  4.2 1.5]
 [6.  2.2 4.  1. ]
 [6.1 2.9 4.7 1.4]
 [5.6 2.9 3.6 1.3]
 [6.7 3.1 4.4 1.4]
 [5.6 3.  4.5 1.5]
 [5.8 2.7 4.1 1. ]
 [6.2 2.2 4.5 1.5]
 [5.6 2.5 3.9 1.1]
 [5.9 3.2 4.8 1.8]
 [6.1 2.8 4.  1.3]
 [6.3 2.5 4.9 1.5]
 [6.1 2.8 4.7 1.2]
 [6.4 2.9 4.3 1.3]
 [6.6 3.  4.4 1.4]
 [6.8 2.8 4.8 1.4]
 [6.7 3.  5.  1.7]
 [6.  2.9 4.5 1.5]
 [5.7 2.6 3.5 1. ]
 [5.5 2.4 3.8 1.1]
 [5.5 2.4 3.7 1. ]
 [5.8 2.7 3.9 1.2]
 [6.  2.7 5.1 1.6]
 [5.4 3.  4.5 1.5]
 [6.  3.4 4.5 1.6]
 [6.7 3.1 4.7 1.5]
 [6.3 2.3 4.4 1.3]
 [5.6 3.  4.1 1.3]
 [5.5 2.5 4.  1.3]
 [5.5 2.6 4.4 1.2]
 [6.1 3.  4.6 1.4]
 [5.8 2.6 4.  1.2]
 [5.  2.3 3.3 1. ]
 [5.6 2.7 4.2 1.3]
 [5.7 3.  4.2 1.2]
 [5.7 2.9 4.2 1.3]
 [6.2 2.9 4.3 1.3]
 [5.1 2.5 3.  1.1]
 [5.7 2.8 4.1 1.3]
 [6.3 3.3 6.  2.5]
 [5.8 2.7 5.1 1.9]
 [7.1 3.  5.9 2.1]
 [6.3 2.9 5.6 1.8]
 [6.5 3.  5.8 2.2]
 [7.6 3.  6.6 2.1]
 [4.9 2.5 4.5 1.7]
 [7.3 2.9 6.3 1.8]
 [6.7 2.5 5.8 1.8]
 [7.2 3.6 6.1 2.5]
 [6.5 3.2 5.1 2. ]
 [6.4 2.7 5.3 1.9]
 [6.8 3.  5.5 2.1]
 [5.7 2.5 5.  2. ]
 [5.8 2.8 5.1 2.4]
 [6.4 3.2 5.3 2.3]
 [6.5 3.  5.5 1.8]
 [7.7 3.8 6.7 2.2]
 [7.7 2.6 6.9 2.3]
 [6.  2.2 5.  1.5]
 [6.9 3.2 5.7 2.3]
 [5.6 2.8 4.9 2. ]
 [7.7 2.8 6.7 2. ]
 [6.3 2.7 4.9 1.8]
 [6.7 3.3 5.7 2.1]
 [7.2 3.2 6.  1.8]
 [6.2 2.8 4.8 1.8]
 [6.1 3.  4.9 1.8]
 [6.4 2.8 5.6 2.1]
 [7.2 3.  5.8 1.6]
 [7.4 2.8 6.1 1.9]
 [7.9 3.8 6.4 2. ]
 [6.4 2.8 5.6 2.2]
 [6.3 2.8 5.1 1.5]
 [6.1 2.6 5.6 1.4]
 [7.7 3.  6.1 2.3]
 [6.3 3.4 5.6 2.4]
 [6.4 3.1 5.5 1.8]
 [6.  3.  4.8 1.8]
 [6.9 3.1 5.4 2.1]
 [6.7 3.1 5.6 2.4]
 [6.9 3.1 5.1 2.3]
 [5.8 2.7 5.1 1.9]
 [6.8 3.2 5.9 2.3]
 [6.7 3.3 5.7 2.5]
 [6.7 3.  5.2 2.3]
 [6.3 2.5 5.  1.9]
 [6.5 3.  5.2 2. ]
 [6.2 3.4 5.4 2.3]
 [5.9 3.  5.1 1.8]]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
150
(150, 4)

 

data是150*4的矩陣,對應着150條鳶尾花數據(每條4個數據:包括萼片和花瓣的長寬)

target是一個數組,存儲了data中每條數據屬於哪類鳶尾植物,所以數組長度是150

因爲共有3類鳶尾花,所以0,1,2分別代表了山鳶尾花、雜色鳶尾花、維吉尼亞鳶尾花

3.數據可視化

調用pandas擴展包進行繪圖。

首先繪製直方圖,展現了花瓣、花萼的長和寬的特徵數量,縱座標表示彙總的數量,橫座標表示對應的長度

通過調用hist()函數實現

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris  # 導入方法類

iris = load_iris()  #導入數據集iris
iris_feature = iris.data    #特徵數據
iris_target = iris.target   #分類數據
#print (iris.data)          #輸出數據集
#print (iris.target)        #輸出真實標籤
#print (len(iris.target) )
#print (iris.data.shape )   #150個樣本 每個樣本4個特徵

import pandas
#導入數據集iris
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = pandas.read_csv(url, names=names) #讀取csv數據
print(dataset.describe())
#直方圖 histograms
dataset.hist()
plt.show()


#dataset.describe()輸出如下:
       sepal-length  sepal-width  petal-length  petal-width
count    150.000000   150.000000    150.000000   150.000000
mean       5.843333     3.054000      3.758667     1.198667
std        0.828066     0.433594      1.764420     0.763161
min        4.300000     2.000000      1.000000     0.100000
25%        5.100000     2.800000      1.600000     0.300000
50%        5.800000     3.000000      4.350000     1.300000
75%        6.400000     3.300000      5.100000     1.800000
max        7.900000     4.400000      6.900000     2.500000

4.訓練和分類

首先對從sklearn中導入決策樹分類器,對數據集進行訓練和分類

from sklearn import tree
from sklearn.tree import DecisionTreeClassifier      #導入決策樹DTC包
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris  # 導入方法類

iris = load_iris()  #導入數據集iris
iris_feature = iris.data    #特徵數據
iris_target = iris.target   #分類數據

clf = DecisionTreeClassifier()      # 所以參數均置爲默認狀態
clf.fit(iris.data, iris.target)     # 使用訓練集訓練模型
print(clf)
predicted = clf.predict(iris.data)    #使用模型對測試集進行預測
print(predicted)
print("精度是:{:.3f}".format(clf.score(iris.data, iris.target)))


#輸出如下:
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
                       max_features=None, max_leaf_nodes=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=1, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, presort=False,
                       random_state=None, splitter='best')
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
精度是:1.000

因爲葉結點都是純的,輸的深的很大,足以完美的記住訓練數據的所有標籤。

之前有線性模型也做個鳶尾花分類,線性模型的精度約爲95%線性模型——鳶尾花分類

如果我們不限制決策樹的深度,他的深度和複雜度都會變得很大。

銀次未剪枝的樹容易過度擬合,對新數據的泛化能力不佳。

我們將預剪枝應用到決策樹上,這可以在完美擬合訓練數據之前阻止樹的展開。

一種選擇是,在樹到達一定深度後停止樹的展開。代碼如下:

clf = DecisionTreeClassifier(max_depth=3,random_state=0)


#輸出精度:

這意味着只能連續問4個問題。限制樹的深度可以減少過擬合。

這會降低訓練集精度,但是可以提高測試集的精度

(也就是訓練出來的模型精度低了,但是預測的時候精度高了,這肯定是好的麼)

5.可視化決策樹

當我們不限制樹的深度時:

# 引入數據集
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier      #導入決策樹DTC包
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris  # 導入方法類

iris = load_iris()  #導入數據集iris
iris_feature = iris.data    #特徵數據
iris_target = iris.target   #分類數據

clf = DecisionTreeClassifier()      # 所以參數均置爲默認狀態
clf.fit(iris.data, iris.target)     # 使用訓練集訓練模型
#print(clf)
predicted = clf.predict(iris.data)
#print(predicted)
print("精度是:{:.3f}".format(clf.score(iris.data, iris.target)))
# viz code 可視化 製作一個簡單易讀的PDF
from sklearn.externals.six import StringIO
import pydot
#需要安裝pydot包,用Anaconda Prompt安裝,需要先安裝graphviz再安裝pydot,命令如下:
# conda install graphviz
# conda install pydot
dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data,
                     feature_names=iris.feature_names,
                     class_names=iris.target_names,
                     filled=True, rounded=True,
                     special_characters=True)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
# print(len(graph))  # 1
# print(graph)  # [<pydot.Dot object at 0x000001F7BD1A9630>]
# print(graph[0])  # <pydot.Dot object at 0x000001F7BD1A9630>
# graph.write_pdf("iris.pdf")
graph[0].write_pdf("iris.pdf")


#輸出如下:
精度是:1.000

我們可以利用export_graphviz()函數將樹可視化,並輸出成pdf,如下圖:

當我們限制樹的深度爲3時:精度是:0.973

clf = DecisionTreeClassifier(max_depth=3,random_state=0)

6.數據集多類分類

決策樹實現類是DecisionTreeClassifier,能夠執行數據集的多類分類。

輸入參數爲兩個數組x[n_samples,n_features]和X[n_samples],

x爲訓練數據,X爲訓練數據的標記數據

把分類好的數據集繪製散點圖,使用Matplotlib模塊

# 引入數據集
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier      #導入決策樹DTC包
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris  # 導入方法類

iris = load_iris()  #導入數據集iris
iris_feature = iris.data    #特徵數據
iris_target = iris.target   #分類數據

clf = DecisionTreeClassifier()      # 所以參數均置爲默認狀態
clf.fit(iris.data, iris.target)     # 使用訓練集訓練模型
#print(clf)
predicted = clf.predict(iris.data)
#print(predicted)

# 獲取花卉兩列數據集
X = iris.data
L1 = [x[0] for x in X]
#print(L1)
L2 = [x[1] for x in X]
#print (L2)

#繪圖
plt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o', label='setosa')
plt.scatter(X[50:100, 0], X[50:100, 1], color='blue', marker='x', label='versicolor')
plt.scatter(X[100:, 0], X[100:, 1], color='green', marker='s', label='Virginica')
plt.title("DTC")
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xticks(())
plt.yticks(())
plt.legend(loc=2)
plt.show()

#輸出如下:
[5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5.0, 5.0, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5.0, 5.5, 4.9, 4.4, 5.1, 5.0, 4.5, 4.4, 5.0, 5.1, 4.8, 5.1, 4.6, 5.3, 5.0, 7.0, 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5.0, 5.9, 6.0, 6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6.0, 5.7, 5.5, 5.5, 5.8, 6.0, 5.4, 6.0, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, 5.8, 5.0, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7, 6.3, 5.8, 7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, 7.7, 6.0, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6.0, 6.9, 6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9]
[3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3.0, 3.0, 4.0, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3.0, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3.0, 3.4, 3.5, 2.3, 3.2, 3.5, 3.8, 3.0, 3.8, 3.2, 3.7, 3.3, 3.2, 3.2, 3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2.0, 3.0, 2.2, 2.9, 2.9, 3.1, 3.0, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3.0, 2.8, 3.0, 2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3.0, 3.4, 3.1, 2.3, 3.0, 2.5, 2.6, 3.0, 2.6, 2.3, 2.7, 3.0, 2.9, 2.9, 2.5, 2.8, 3.3, 2.7, 3.0, 2.9, 3.0, 3.0, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3.0, 2.5, 2.8, 3.2, 3.0, 3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3.0, 2.8, 3.0, 2.8, 3.8, 2.8, 2.8, 2.6, 3.0, 3.4, 3.1, 3.0, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3.0, 2.5, 3.0, 3.4, 3.0]

不同顏色的點代表不同的種類。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章