Can Liu---機器不學習
介紹
在這篇部落格中,我們使用以下幾個庫來實現決策樹演算法
- 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 setosa
2)現在我們列印一下這個資料集的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()
決策樹演算法實現
劃分資料集
表示資料集的標籤, 代表每一行除標籤以外的特徵。注意這裡的表述行,表述列。
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)匯出決策樹,將資料用決策樹演算法進行訓練後,該演算法會將資料進行分類,我們使用庫生成一個檔案。
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