1. 程式人生 > >Can Liu---機器不學習

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()

在這裡插入圖片描述

決策樹演算法實現

劃分資料集

yy 表示資料集的標籤,XX 代表每一行除標籤以外的特徵。注意這裡的axis=1axis=1表述行,axis=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)匯出決策樹,將資料用決策樹演算法進行訓練後,該演算法會將資料進行分類,我們使用graphvizgraphviz庫生成一個.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軟體得到決策樹如下: tree

預測(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