决策树实现鸢尾花分类
介紹
在這篇博客中,我們使用以下幾個庫來實現決策樹算法
- scikit-learn機器學習庫
scikit-learn最先是由David Cournapeau在2007年發起的一個Google Summer of Code項目,從那時起這個項目就已經擁有很多的貢獻者了,該項目目前也是由一個志愿者團隊在維護著。scikit-learn是python的一個開源機器學習模塊,它建立在numpy,scipy和matplotlib模塊之上。scikit-learn最大的特點就是,為用戶提供各種機器學習算法接口,可以讓用戶簡單、高效地進行數據挖掘和數據分析。
scikit-learn內包含了常用的機器學習數據集,比如做分類的iris和digit數據集,用于回歸的經典數據集Boston house prices。scikit-learn載入的數據集是以類似于字典的形式存放的,該對象中包含了所有有關該數據的數據信息(甚至還有參考文獻)。其中的數據值統一存放在.data的成員中。
- numpy
NumPy是Python語言的一個擴充程序庫。支持高級大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。Numpy內部解除了Python的PIL(全局解釋器鎖),運算效率極好,是大量機器學習框架的基礎庫!
- pandas
Pandas是一個開源的Python數據分析庫。Pandas把結構化數據分為了三類:
1)Series,1維序列,可視作為沒有column名的、只有一個column的DataFrame;
2)DataFrame,同Spark SQL中的DataFrame一樣,其概念來自于R語言,為多column并schema化的2維結構化數據,可視作為Series的容器(container);
3)Panel,為3維的結構化數據,可視作為DataFrame的容器;
- matplotlib
matplotlib是一個python的數據可視化模塊,能夠創建多數類型的圖表,如條形圖,散點圖,條形圖,餅圖,堆疊圖,3D 圖和地圖圖表。
- seaborn
seaborn與matlotlib同出一源,只是把matplotlib進行了封裝,讓許多方法調用時變得更加簡便。簡單的操作就能夠畫出更加復雜的圖像。由于seaborn是調用的matplotlib,在使用時,兩個庫可以進行相互操作。
導入庫
import numpy as np import matplotlib.pyplot as plt import seaborn as sns import pandas as pd from sklearn import tree from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.externals import joblib數據集
鳶尾花數據集(iris_data)是原則20世紀30年代的經典數據集。它是用統計進行分類的鼻祖。
1)下面我們從scikit-learn接口導入數據集(第一行)
在導入數據集后我們打印前五行發現每個樣本有五個參數,分別為花萼長度、花萼寬度、花瓣長度、花瓣寬度和所屬類別(山鳶尾花、變色鳶尾花和維吉尼亞鳶尾花)。
iris=sns.load_dataset("iris") print(iris.head()) sepal_length sepal_width petal_length petal_width species 0 5.1 3.5 1.4 0.2 setosa 1 4.9 3.0 1.4 0.2 setosa 2 4.7 3.2 1.3 0.2 setosa 3 4.6 3.1 1.5 0.2 setosa 4 5.0 3.6 1.4 0.2 setosa2)現在我們打印一下這個數據集的shape,可以發現這個數據集一共包含150個樣本,每個樣本五個參數。
print(iris.shape) (150, 5)3)打印數據集四個特征的詳細分布情況
print(iris.describe()) sepal_length sepal_width petal_length petal_width count 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.057333 3.758000 1.199333 std 0.828066 0.435866 1.765298 0.762238 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可視化
seaborn畫圖-----pairplot多變量圖
1)格式
seaborn.pairplot(data, hue=None, hue_order=None, palette=None, vars=None, x_vars=None, y_vars=None, kind=‘scatter’, diag_kind=‘hist’, markers=None, size=2.5, aspect=1, dropna=True, plot_kws=None, diag_kws=None, grid_kws=None)
2)基本參數
size : 默認 6,圖的尺度大小(正方形)。參數類型:numeric
hue : 使用指定變量為分類變量畫圖。參數類型:string (變量名)
hue_order : list of strings Order for the levels of the hue variable in the palette
palette : 調色板顏色
markers : 使用不同的形狀。參數類型:list
aspect : scalar, optional。Aspect * size gives the width (in inches) of each facet.
{plot, diag, grid}_kws : 指定其他參數。參數類型:dicts
sns.set(style="ticks") sns.pairplot(iris,hue="species",palette="bright") plt.show()決策樹算法實現
劃分數據集
yyy 表示數據集的標簽,XXX 代表每一行除標簽以外的特征。注意這里的axis=1axis=1axis=1表述行,axis=0axis=0axis=0表述列。
y=iris.species X=iris.drop('species',axis=1)- train_test_split函數
train_test_split函數用于將矩陣隨機劃分為訓練子集和測試子集,并返回劃分好的訓練集測試集樣本和訓練集測試集標簽。
格式:
X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.3, random_state=0)
- 參數解釋
train_data:被劃分的樣本特征集
train_target:被劃分的樣本標簽
test_size:如果是浮點數,在0-1之間,表示樣本占比;如果是整數的話就是樣本的數量
random_state:是隨機數的種子。
隨機數種子:其實就是該組隨機數的編號,在需要重復試驗的時候,保證得到一組一樣的隨機數。比如你每次都填1,其他參數一樣的情況下你得到的隨機數組是一樣的。但填0或不填,每次都會不一樣。
隨機數的產生取決于種子,隨機數和種子之間的關系遵從以下兩個規則:
1)種子不同,產生不同的隨機數;
2)種子相同,即使實例不同也產生相同的隨機數。
from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=100,stratify=y)決策樹算法
1)從scikit-learn中調用決策樹算法
2)訓練(fit(x,y))
clf=tree.DecisionTreeClassifier() clf.fit(X_train,y_train) 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')3)導出決策樹,將數據用決策樹算法進行訓練后,該算法會將數據進行分類,我們使用graphvizgraphvizgraphviz庫生成一個.dot.dot.dot文件。
from sklearn.datasets import load_iris iris=load_iris() tree.export_graphviz(clf,out_file="iris.dot",feature_names=iris.feature_names,class_names=iris.target_names,filled=True,rounded=True,special_characters=True)使用一個Graphviz軟件得到決策樹如下:
預測(predict()函數)
y_pred=(clf.predict(X_test))輸出正確率
Recall =預測正確正/(預測正確正+預測錯誤的負)
Accuracy = (true positives + true negatives) / (total examples)
print("Accuracy Score") print(accuracy_score(y_test,y_pred)*100) Accuracy Score 95.55555555555556總結
以上是生活随笔為你收集整理的决策树实现鸢尾花分类的全部內容,希望文章能夠幫你解決所遇到的問題。