【python資料探勘課程】十九.鳶尾花資料集視覺化、線性迴歸、決策樹花樣分析

Eastmount發表於2017-12-02
這是《Python資料探勘課程》系列文章,也是我這學期上課的部分內容。本文主要講述鳶尾花資料集的各種分析,包括視覺化分析、線性迴歸分析、決策樹分析等,通常一個資料集是可以用於多種分析的,希望這篇文章對大家有所幫助,同時提供些思考。內容包括:
    1.鳶尾花資料集視覺化分析
    2.線性迴歸分析鳶尾花花瓣長度和寬度的關係
    3.決策樹分析鳶尾花資料集
    4.Kmeans聚類分析鳶尾花資料集

本篇文章為基礎性文章,希望對你有所幫助,如果文章中存在錯誤或不足支援,還請海涵~這也是自己書籍幾章的內容,同時,推薦大家閱讀我以前的文章瞭解基礎知識。自己真的太忙了,只能擠午休或深夜的時間學習新知識,週五深夜寫下這篇文章,內心非常享受。

前文參考:
【Python資料探勘課程】一.安裝Python及爬蟲入門介紹
【Python資料探勘課程】二.Kmeans聚類資料分析及Anaconda介紹
【Python資料探勘課程】三.Kmeans聚類程式碼實現、作業及優化
【Python資料探勘課程】四.決策樹DTC資料分析及鳶尾資料集分析
【Python資料探勘課程】五.線性迴歸知識及預測糖尿病例項
【Python資料探勘課程】六.Numpy、Pandas和Matplotlib包基礎知識
【Python資料探勘課程】七.PCA降維操作及subplot子圖繪製
【Python資料探勘課程】八.關聯規則挖掘及Apriori實現購物推薦
【Python資料探勘課程】九.迴歸模型LinearRegression簡單分析氧化物資料
【python資料探勘課程】十.Pandas、Matplotlib、PCA繪圖實用程式碼補充
【python資料探勘課程】十一.Pandas、Matplotlib結合SQL語句視覺化分析
【python資料探勘課程】十二.Pandas、Matplotlib結合SQL語句對比圖分析
【python資料探勘課程】十三.WordCloud詞雲配置過程及詞頻分析
【python資料探勘課程】十四.Scipy呼叫curve_fit實現曲線擬合
【python資料探勘課程】十五.Matplotlib呼叫imshow()函式繪製熱圖
【python資料探勘課程】十六.邏輯迴歸LogisticRegression分析鳶尾花資料
【python資料探勘課程】十七.社交網路Networkx庫分析人物關係(初識篇)
【python資料探勘課程】十八.線性迴歸及多項式迴歸分析四個案例分享


一. 鳶尾花資料集介紹


在做資料分析過程中,資料集通常可以來源於自己的需求,也可以從網上尋找公開的資料集,也可以隨機生成一個資料集,本章採用Python的Sklearn機器學習庫中自帶的資料集——鳶尾花資料集。簡單分析資料集之間特徵的關係圖,根據花瓣長度、花瓣寬度、花萼長度、花萼寬度四個特徵進行繪圖。

Iris plants data set資料集可以從KEEL dataset資料集網站獲取,也可以直接從Sklearn.datasets機器學習包得到。資料集共包含4個特徵變數、1個類別變數,共有150個樣本。類別變數分別對應鳶尾花的三個亞屬,分別是山鳶尾 (Iris-setosa)、變色鳶尾(Iris-versicolor)和維吉尼亞鳶尾(Iris-virginica)。


通過sklearn.datasets擴充套件包中的load_iris()函式匯入鳶尾花資料集,該Iris中有兩個屬性,分別是:iris.data和iris.target。data裡是一個矩陣,每一列代表了萼片或花瓣的長寬,一共4列,每一列代表某個被測量的鳶尾植物,一共取樣了150條記錄。程式碼如下:

#匯入資料集iris  
from sklearn.datasets import load_iris  
#載入資料集  
iris = load_iris()  
#輸出資料集  
print iris.data 

輸出如下所示內容:

[[ 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]   
 ....  
 [ 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]] 

target是一個陣列,儲存了data中每條記錄屬於哪一類鳶尾植物,陣列長度是150,陣列元素的值因為共有3類鳶尾植物,所以不同值只有3個。種類:
    Iris Setosa(山鳶尾)
    Iris Versicolour(雜色鳶尾)
    Iris Virginica(維吉尼亞鳶尾)
程式碼如下:

#輸出真實標籤  
print iris.target  
print len(iris.target) 
#150個樣本 每個樣本4個特徵  
print iris.data.shape 

輸出結果如下:

[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  
(150L, 4L) 

可以看到,類標共分為三類,前面50個類標位0,中間50個類標位1,後面為2。下面講解另一種匯入鳶尾花資料集的方法,這裡是從某一網頁匯入資料,但是如果網頁打不開很可能就匯入不了,但也普及下方法。程式碼如下:

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

輸出如圖所示,鳶尾花(iris)是資料探勘常用到的一個資料集,包含150種鳶尾花的資訊,每50種取自三個鳶尾花種之一(setosa,versicolour或virginica)。每個花的特徵用下面的5種屬性描述萼片長度(Sepal.Length)、萼片寬度(Sepal.Width)、花瓣長度(Petal.Length)、花瓣寬度(Petal.Width)、類(Species)。



可以看到如下結果,分別表示4個屬性的樣本值、均值、標準誤、最小值、25%分位數、中位數、75%分位數、最大值。接下來主介紹視覺化操作,呼叫Pandas擴充套件包讀取資料並繪製相關圖形。





二. 視覺化分析鳶尾花


資料視覺化可以更好地瞭解資料,主要呼叫Pandas擴充套件包進行繪圖操作。
首先繪製直方圖,直觀的表現花瓣、花萼的長和寬特徵的數量,縱座標表示彙總的數量,橫座標表示對應的長度。

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() 
呼叫hist()函式實現,輸出圖形如下所示:



接下來通過dataset.plot()繪製散點圖,這裡設定三個引數,顯示的x座標、y座標和設定繪圖種類。

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())
dataset.plot(x='sepal-length', y='sepal-width', kind='scatter')
其中kind設定為scatter,而Matplotlib擴充套件包中scatter()函式也是用於繪製散點圖的。


通過dataset.plot(kind='kde')繪製KDE圖,KDE圖也被稱作密度圖(Kernel Density Estimate,核密度估計)。

import pandas
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())
dataset.plot(kind='kde')

通過四條曲線反映四個特徵的變化情況。


設定dataset.plot()函式的型別kind='box'繪製箱圖,在這裡注意各個箱形圖的縱座標(y軸)的刻度是不同的,有明顯的區分,因此可以看到,各變數表示的屬性是有區分的。程式碼如下:

import pandas 
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())
dataset.plot(kind='kde')
dataset.plot(kind='box', subplots=True, layout=(2,2), 
             sharex=False, sharey=False)
輸出如下所示:

接下來呼叫radviz()函式、andrews_curves()函式和parallel_coordinates()函式繪製圖形,這裡選擇petal-length特徵,程式碼如下所示:

import pandas
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)

from pandas.tools.plotting import radviz
radviz(dataset, 'class')

from pandas.tools.plotting import andrews_curves
andrews_curves(dataset, 'class')

from pandas.tools.plotting import parallel_coordinates
parallel_coordinates(dataset, 'class')
輸出如下圖所示:


 

最後補充散點圖矩陣,這有助於發現變數之間的結構化關係,散點圖代表了兩變數的相關程度,如果呈現出沿著對角線分佈的趨勢,說明它們的相關性較高。

import pandas
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)

from pandas.tools.plotting import scatter_matrix
scatter_matrix(dataset, alpha=0.2, figsize=(6, 6), diagonal='kde')
輸出如下所示:





三. 線性迴歸分析鳶尾花


該部分主要採用線性迴歸演算法對鳶尾花的特徵資料進行分析,預測花瓣長度、花瓣寬度、花萼長度、花萼寬度四個特徵之間的線性關係。該部分的核心程式碼及步驟解釋如下:


第一步 匯入鳶尾花資料集並獲取前兩列資料,分別儲存至x和y陣列

from sklearn.datasets import load_iris
hua = load_iris()
#獲取花瓣的長和寬
x = [n[0] for n in hua.data]
y = [n[1] for n in hua.data]

但由於儲存的x、y變數為list型別,而使用線性迴歸fit()函式訓練時,需要轉換為陣列array型別,則使用如下程式碼進行轉換。

import numpy as np #轉換成陣列
x = np.array(x).reshape(len(x),1)
y = np.array(y).reshape(len(y),1)


第二步 匯入Sklearn機器學習擴充套件包中線性迴歸模型,然後進行訓練和預測

from sklearn.linear_model import LinearRegression
clf = LinearRegression()
clf.fit(x,y)
pre = clf.predict(x)


第三步 呼叫Matplotlib擴充套件包並繪製相關圖形

#第三步 畫圖
import matplotlib.pyplot as plt
plt.scatter(x,y,s=100)
plt.plot(x,pre,"r-",linewidth=4)
for idx, m in enumerate(x):
    plt.plot([m,m],[y[idx],pre[idx]], 'g-')
plt.show()

經過上述三個步驟,一個簡單的鳶尾花線性迴歸方程就講解完畢。完整程式碼如下:

from sklearn.datasets import load_iris
hua = load_iris()
#獲取花瓣的長和寬
x = [n[0] for n in hua.data]
y = [n[1] for n in hua.data]
import numpy as np #轉換成陣列
x = np.array(x).reshape(len(x),1)
y = np.array(y).reshape(len(y),1)

from sklearn.linear_model import LinearRegression
clf = LinearRegression()
clf.fit(x,y)
pre = clf.predict(x)

#第三步 畫圖
import matplotlib.pyplot as plt
plt.scatter(x,y,s=100)
plt.plot(x,pre,"r-",linewidth=4)
for idx, m in enumerate(x):
    plt.plot([m,m],[y[idx],pre[idx]], 'g-')
plt.show()

輸出如下圖所示,同時繪製了所有散點圖到直線的距離。其中散點圖為鳶尾花真實的花萼長度和花萼寬度關係,紅色直線為預測的線性迴歸方程,即預測結果。



最後對該演算法進行評估,主要是計算其線性迴歸方程,程式碼如下:

print u"係數", clf.coef_
print u"截距", clf.intercept_
print np.mean(y-pre)**2
# 係數 [[-0.05726823]]
# 截距 [ 3.38863738]
# 1.91991214088e-31

假設現在存在一個花萼長度為5.0的花,需要預測其花萼寬度,則使用該已經訓練好的線性迴歸模型進行預測,其結果應為[3.10229621]。

print clf.predict([[5.0]])
# [[ 3.10229621]]




四. 決策樹分析鳶尾花


Sklearn機器學習包中,決策樹實現類是DecisionTreeClassifier,能夠執行資料集的多類分類。輸入引數為兩個陣列X[n_samples,n_features]和y[n_samples],X為訓練資料,y為訓練資料的標記資料。
DecisionTreeClassifier構造方法為:

sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best'
    ,max_depth=None, min_samples_split=2, min_samples_leaf=1
    ,max_features=None, random_state=None, min_density=None
    ,compute_importances=None, max_leaf_nodes=None)

鳶尾花資料集使用決策樹的程式碼如下:

from sklearn.datasets import load_iris 
from sklearn.tree import DecisionTreeClassifier   
iris = load_iris()    
clf = DecisionTreeClassifier()  
clf.fit(iris.data, iris.target)  
print clf   
predicted = clf.predict(iris.data)  
  
#獲取花卉兩列資料集  
X = iris.data  
L1 = [x[0] for x in X]  
print L1  
L2 = [x[1] for x in X]  
print L2  
  
import numpy as np  
import matplotlib.pyplot as plt  
plt.scatter(L1, L2, c=predicted, marker='x')  #cmap=plt.cm.Paired  
plt.title("DTC")  
plt.show()  

輸出結果如下所示,可以看到分位三類,分別代表資料集三種鳶尾植物。


上面的程式碼predicted = clf.predict(iris.data)是對整個的資料集進行決策樹分析,而真是的分類分析,需要把一部分資料集作為訓練,一部分作為預測,這裡使用70%的訓練,30%的進行預測,其中70%的訓練集為0-40、50-90、100-140行,30%的預測集40-50、90-100、140-150行。同時輸出準確率、召回率等,優化後的完整程式碼如下所示:

from sklearn.datasets import load_iris   
from sklearn.tree import DecisionTreeClassifier  
 
iris = load_iris()   
#訓練集  
train_data = np.concatenate((iris.data[0:40, :], iris.data[50:90, :], iris.data[100:140, :]), axis = 0)  
train_target = np.concatenate((iris.target[0:40], iris.target[50:90], iris.target[100:140]), axis = 0)  
#測試集  
test_data = np.concatenate((iris.data[40:50, :], iris.data[90:100, :], iris.data[140:150, :]), axis = 0)  
test_target = np.concatenate((iris.target[40:50], iris.target[90:100], iris.target[140:150]), axis = 0)  

#訓練  
clf = DecisionTreeClassifier()   
clf.fit(train_data, train_target)  
predict_target = clf.predict(test_data)  
print predict_target  
  
#預測結果與真實結果比對  
print sum(predict_target == test_target)  
  
#輸出準確率 召回率 F值  
from sklearn import metrics  
print(metrics.classification_report(test_target,predict_target))  
print(metrics.confusion_matrix(test_target,predict_target)) 
X = test_data  
L1 = [n[0] for n in X]  
print L1  
L2 = [n[1] for n in X]  
print L2  
import numpy as np  
import matplotlib.pyplot as plt  
plt.scatter(L1, L2, c=predict_target, marker='x')  #cmap=plt.cm.Paired  
plt.title("DecisionTreeClassifier")  
plt.show()

輸出結果如下:

[0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2]  
30  
             precision    recall  f1-score   support

          0       1.00      1.00      1.00        10
          1       1.00      1.00      1.00        10
          2       1.00      1.00      1.00        10

avg / total       1.00      1.00      1.00        30
 
[[10  0  0]  
 [ 0 10  0]  
 [ 0  0 10]] 

繪製圖形如下所示:




五. Kmeans聚類分析鳶尾花


KMeans聚類鳶尾花的程式碼如下,它則不需要類標(屬於某一類鳶尾花),而是根據資料之間的相似性,按照“物以類聚,人以群分”進行聚類。程式碼如下:

# -*- coding: utf-8 -*-
from sklearn.datasets import load_iris 
from sklearn.cluster import KMeans   
iris = load_iris()    
clf = KMeans()  
clf.fit(iris.data, iris.target)  
print clf   
predicted = clf.predict(iris.data)  
  
#獲取花卉兩列資料集  
X = iris.data  
L1 = [x[0] for x in X]  
print L1  
L2 = [x[1] for x in X]  
print L2  
  
import numpy as np  
import matplotlib.pyplot as plt  
plt.scatter(L1, L2, c=predicted, marker='s',s=200,cmap=plt.cm.Paired)  
plt.title("DTC")  
plt.show() 
輸出如下所示:


希望文章對你有所幫助,尤其是我的學生,如果文章中存在錯誤或不足之處,還請海涵。
12月了,今年又要結束了,這一年真的成才很多,不是程式設計,而是做人做事,謝謝她!
再多讚美的語言,都比不上滴滴汗水凝結的成功帶來的滿足與喜悅,願你看完這篇文章,能感受到我秀璋的真誠。希望你能從這篇文章中學到一些簡單的資料分析知識。
(By:Eastmount 2017-12-01 深夜12點  http://blog.csdn.net/eastmount/ )



相關文章