1. 程式人生 > >實現鳶尾花資料集分類

實現鳶尾花資料集分類

轉自:http://blog.csdn.net/jasonding1354/article/details/42143659

引入

一個機器可以根據照片來辨別鮮花的品種嗎?在機器學習角度,這其實是一個分類問題,即機器根據不同品種鮮花的資料進行學習,使其可以對未標記的測試圖片資料進行分類。
這一小節,我們還是從scikit-learn出發,理解基本的分類原則,多動手實踐。

Iris資料集

Iris flower資料集是1936年由Sir Ronald Fisher引入的經典多維資料集,可以作為判別分析(discriminant analysis)的樣本。該資料集包含Iris花的三個品種(Iris setosa, Iris virginica and Iris versicolor)各50個樣本,每個樣本還有4個特徵引數(分別是萼片<sepals>的長寬和花瓣<petals>的長寬,以釐米為單位),Fisher利用這個資料集開發了一個線性判別模型來辨別花朵的品種。
基於Fisher的線性判別模型,該資料整合為了機器學習中各種分類技術的典型實驗案例。


現在我們要解決的分類問題是,當我們看到一個新的iris花朵,我們能否根據以上測量引數成功預測新iris花朵的品種。
我們利用給定標籤的資料,設計一種規則進而應用到其他樣本中做預測,這是基本的監督問題(分類問題)。
由於iris資料集樣本量和維度都很小,所以可以方便進行視覺化和操作。

資料的視覺化(visualization)

scikit-learn自帶有一些經典的資料集,比如用於分類的iris和digits資料集,還有用於迴歸分析的boston house prices資料集。
可以通過下面的方式載入資料:

from sklearn import datasets
iris = datasets.load_iris()
digits = datasets.load_digits()

該資料集是一種字典結構,資料儲存在.data成員中,輸出標籤儲存在.target成員中。

畫出任意兩維的資料散點圖

可以用下面的方式畫出任意兩個維度的散點圖,這裡以第一維sepal length和第二維資料sepal width為例:

from sklearn import datasets
import matplotlib.pyplot as plt
import numpy as np

iris = datasets.load_iris()
irisFeatures = iris["data"]
irisFeaturesName = iris["feature_names"]
irisLabels = iris["target"]

def scatter_plot(dim1, dim2):
    for t,marker,color in zip(xrange(3),">ox","rgb"):
           # zip()接受任意多個序列引數,返回一個元組tuple列表
        # 用不同的標記和顏色畫出每種品種iris花朵的前兩維資料
        # We plot each class on its own to get different colored markers
        plt.scatter(irisFeatures[irisLabels == t,dim1],
                    irisFeatures[irisLabels == t,dim2],marker=marker,c=color)
    dim_meaning = {0:'setal length',1:'setal width',2:'petal length',3:'petal width'}
    plt.xlabel(dim_meaning.get(dim1))
    plt.ylabel(dim_meaning.get(dim2))

plt.subplot(231)
scatter_plot(0,1)
plt.subplot(232)
scatter_plot(0,2)
plt.subplot(233)
scatter_plot(0,3)
plt.subplot(234)
scatter_plot(1,2)
plt.subplot(235)
scatter_plot(1,3)
plt.subplot(236)
scatter_plot(2,3)

plt.show()

效果如圖:


構建分類模型

根據某一維度的閾值進行分類

如果我們的目標是區別這三種花朵,我們可以做一些假設。比如花瓣的長度(petal length)好像將Iris Setosa品種與其它兩種花朵區分開來。我們可以以此來寫一段小程式碼看看這個屬性的邊界是什麼:

petalLength = irisFeatures[:,2] #select the third column,since the features is 150*4
isSetosa = (irisLabels == 0) #label 0 means iris Setosa
maxSetosaPlength = petalLength[isSetosa].max()
minNonSetosaPlength = petalLength[~isSetosa].min()

print ('Maximum of setosa:{0} '.format(maxSetosaPlength))
print ('Minimum of others:{0} '.format(minNonSetosaPlength))

'''
顯示結果是:
Maximum of setosa:1.9 
Minimum of others:3.0 
'''

我們根據實驗結果可以建立一個簡單的分類模型,如果花瓣長度小於2,就是Iris Setosa花朵,否則就是其他兩種花朵。
這個模型的結構非常簡單,是由資料的一個維度閾值來確定的。我們通過實驗確定這個維度的最佳閾值。
以上的例子將Iris Setosa花朵和其他兩種花朵很容易的分開了,然而我們不能立即確定Iris Virginica花朵和Iris Versicolor花朵的最佳閾值,我們甚至發現,我們無法根據某一維度的閾值將這兩種類別很完美的分開。

比較準確率來得到閾值

我們先選出非Setosa的花朵。

irisFeatures = irisFeatures[~isSetosa]
labels = irisLabels[~isSetosa]
isVirginica = (labels == 2)    #label 2 means iris virginica

這裡我們非常依賴NumPy對於陣列的操作,isSetosa是一個Boolean值陣列,我們可以用它來選擇出非Setosa的花朵。最後,我們還構造了一個新的Boolean陣列,isVirginica。
接下來,我們對每一維度的特徵寫一個迴圈小程式,然後看一下哪一個閾值能得到更好的準確率。

# search the threshold between virginica and versicolor
irisFeatures = irisFeatures[~isSetosa]
labels = irisLabels[~isSetosa]
isVirginica = (labels == 2)    #label 2 means iris virginica

bestAccuracy = -1.0
for fi in xrange(irisFeatures.shape[1]):
    thresh = irisFeatures[:,fi].copy()
    thresh.sort()
    for t in thresh:
        pred = (irisFeatures[:,fi] > t)
        acc = (pred == isVirginica).mean()
        if acc > bestAccuracy:
            bestAccuracy = acc;
            bestFeatureIndex = fi;
            bestThreshold = t;

print 'Best Accuracy:\t\t',bestAccuracy
print 'Best Feature Index:\t',bestFeatureIndex
print 'Best Threshold:\t\t',bestThreshold

'''
最終結果:
Best Accuracy:        0.94
Best Feature Index:    3
Best Threshold:        1.6
'''

這裡我們首先對每一維度進行排序,然後從該維度中取出任一值作為閾值的一個假設,再計算這個假設的Boolean序列和實際的標籤Boolean序列的一致情況,求平均,即得到了準確率。經過所有的迴圈,最終得到的閾值和所對應的維度。
最後,我們得到了最佳模型針對第四維花瓣的寬度petal width,我們就可以得到這個決策邊界decision boundary。

評估模型——交叉檢驗

上面,我們得到了一個簡單的模型,並且針對訓練資料實現了94%的正確率,但這個模型引數可能過於優化了。
我們需要的是評估模型針對新資料的泛化能力,所以我們需要保留一部分資料,進行更加嚴格的評估,而不是用訓練資料做測試資料。為此,我們會保留一部分資料進行交叉檢驗。
這樣我們就會得到訓練誤差和測試誤差,當複雜的模型下,可能訓練的準確率是100%,但是測試時效果可能只是比隨機猜測好一點。

交叉檢驗

在許多實際應用中,資料是不充足的。為了選擇更好的模型,可以採用交叉檢驗方法。交叉檢驗的基本想法是重複地使用資料;把給定資料進行切分,將切分的資料集組合為訓練集和測試集,在此基礎上反覆地進行訓練、測試以及模型選擇。

S-fold交叉檢驗

應用最多的是S折交叉檢驗(S-fold cross validation),方法如下:首先隨機地將已給資料切分為S個互不相交的大小相同的子集;然後利用S-1個子集的資料訓練模型,利用餘下的子集測試模型;將這一過程對可能的S種選擇重複進行;最後選出S次評測中平均測試誤差最小的模型。


如上圖,我們將資料集分成5部分,即5-fold交叉檢驗。接下來,我們可以對每一個fold生成一個模型,留出20%的資料進行檢驗。

leave-one-out交叉檢驗方法

留一交叉檢驗(leave-one-out cross validation)是S折交叉檢驗的特殊情形,是S為給定資料集的容量時情形。
我們可以從訓練資料中挑選一個樣本,然後拿其他訓練資料得到模型,最後看該模型是否能將這個挑出來的樣本正確的分類。

def learn_model(features,labels):
    bestAccuracy = -1.0
    for fi in xrange(features.shape[1]):
        thresh = features[:,fi].copy()
        thresh.sort()
        for t in thresh:
            pred = (features[:,fi] > t)
            acc = (pred == labels).mean()
            if acc > bestAccuracy:
                bestAccuracy = acc;
                bestFeatureIndex = fi;
                bestThreshold = t;
    '''
    print 'Best Accuracy:\t\t',bestAccuracy
    print 'Best Feature Index:\t',bestFeatureIndex
    print 'Best Threshold:\t\t',bestThreshold
    '''
    return {'dim':bestFeatureIndex, 'thresh':bestThreshold, 'accuracy':bestAccuracy}

def apply_model(features,labels,model):
    prediction = (features[:,model['dim']] > model['thresh'])
    return prediction

#-----------cross validation-------------
error = 0.0
for ei in range(len(irisFeatures)):
    # select all but the one at position 'ei':
    training = np.ones(len(irisFeatures), bool)
    training[ei] = False
    testing = ~training
    model = learn_model(irisFeatures[training], isVirginica[training])
    predictions = apply_model(irisFeatures[testing],
                              isVirginica[testing], model)
    error += np.sum(predictions != isVirginica[testing])

上面的程式,我們用所有的樣本對一系列的模型進行了測試,最終的估計說明了模型的泛化能力。

小結

對於上面對資料集進行劃分時,我們需要注意平衡分配資料。如果對於一個子集,所有的資料都來自一個類別,則結果沒有代表性。
基於以上的討論,我們利用一個簡單的模型來訓練,交叉檢驗過程給出了這個模型泛化能力的估計。

相關推薦

分類問題(一):SVM(Python——基於skearn實現鳶尾花資料分類)

第一步: # -*- coding: utf-8 -*- """ Created on Fri Sep 21 14:26:25 2018 @author: bd04 """ # !/usr/bin/env python # encoding: utf-8 __auth

實現鳶尾花資料分類

轉自:http://blog.csdn.net/jasonding1354/article/details/42143659 引入 一個機器可以根據照片來辨別鮮花的品種嗎?在機器學習角度,這其實是一個分類問題,即機器根據不同品種鮮花的資料進行學習,使其可以對未標記的測

人工智慧深度學習TensorFlow通過感知器實現鳶尾花資料分類

一.iris資料集簡介 iris資料集的中文名是安德森鳶尾花卉資料集,英文全稱是Anderson’s Iris data set。iris包含150個樣本,對應資料集的每行資料。每行資料包含每個樣本的四個特徵和樣本的類別資訊,所以iris資料集是一個150行5列的二維表。 通俗地說,iris

利用線性函式實現鳶尾花資料分類

在空間中,我們定義分類的線性函式為:g(x)=wTx+bg(x)=w^{T}x+bg(x)=wTx+b 其中樣本x=(x1,x2,...,xl)Tx=(x_{1},x_{2},...,x_{l})^{T}x=(x1​,x2​,...,xl​)T,權向量w=(w1

XGBoost實現鳶尾花資料分類預測

code:import xgboost as xgb import numpy as np import pandas as pd from sklearn.model_selection import

TensorFlow之神經網路簡單實現MNIST資料分類

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist=input_data.read_data_sets("MNIST_data",one_hot=True) ba

TensorFlow之卷積神經網路(CNN)實現MNIST資料分類

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist=input_data.read_data_sets('MNIST_data',one_hot=True) #每

神經網路實現Mnist資料簡單分類

本文針對mnist手寫數字集,搭建了四層簡單的神經網路進行圖片的分類,詳細心得記錄下來分享 我是採用的TensorFlow框架進行的訓練 import tensorflow as tf from tensorflow.examples.tutorials.mnist import in

決策樹分類鳶尾花資料

import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeClassifier iris_

Logistics迴歸分類鳶尾花資料

import numpy as np from sklearn.linear_model import LogisticRegression import matplotlib.pyplot as plt import matplotlib as mpl import pandas as pd fr

[Keras深度學習淺嘗]實戰三·CNN實現Fashion MNIST 資料分類

[Keras深度學習淺嘗]實戰三·RNN實現Fashion MNIST 資料集分類 與我們上篇博文[Keras深度學習淺嘗]實戰一結構相同,修改的地方有,定義網路與模型訓練兩部分,可以對比著來看。通過使用RNN結構,預測準確率略有提升,可以通過修改超引數以獲得更優結果。 程式碼部分

[Keras深度學習淺嘗]實戰四· Embedding實現 IMDB資料影評文字分類

[Keras深度學習淺嘗]實戰四· Embedding實現 IMDB資料集影評文字分類 此實戰來源於TensorFlow Keras官方教程 先更新程式碼在這裡,後面找時間理解註釋一下。 # TensorFlow and tf.keras import os os.environ

[Keras深度學習淺嘗]實戰二·CNN實現Fashion MNIST 資料分類

[Keras深度學習淺嘗]實戰二·CNN實現Fashion MNIST 資料集分類 與我們上篇博文[Keras深度學習淺嘗]實戰一結構相同,修改的地方有,定義網路與模型訓練兩部分,可以對比著來看。通過使用CNN結構,預測準確率略有提升,可以通過修改超引數以獲得更優結果。 程式碼部分

[Keras深度學習淺嘗]實戰一·DNN實現Fashion MNIST 資料分類

[Keras深度學習淺嘗]實戰一·DNN實現Fashion MNIST 資料集分類 此實戰來源於TensorFlow Keras官方教程 Fashion-MNIST是一個替代MNIST手寫數字集的影象資料集。 它是由Zalando(一家德國的時尚科技公司)旗下的研究部門提供。其涵蓋了

Python 3實現k-鄰近演算法以及 iris 資料分類應用

前言 這個周基本在琢磨這個演算法以及自己利用Python3 實現自主程式設計實現該演算法。持續時間比較長,主要是Pyhton可能還不是很熟練,走了很多路,基本是一邊寫一邊學。不過,總算是基本搞出來了。不多說,進入正題。 1. K-鄰近演算法 1.1

樸素貝葉斯對鳶尾花資料進行分類

注:本人純粹為了練手熟悉各個方法的用法 使用高斯樸素貝葉斯對鳶尾花資料進行分類 程式碼: 1 # 通過樸素貝葉斯對鳶尾花資料進行分類 2 3 from sklearn import datasets 4 from sklearn.model_selection import train_

caffe練習例項(4)——caffe實現caltech101資料影象分類

1.準備資料集 caltech101(101類影象資料庫)資料集 資料集地址: http://www.vision.caltech.edu/Image_Datasets/Caltech101/Calt

tensorflow實現LSTM進行MNIST資料分類

大大的部落格講得很詳細,先拿過來分享一下:http://blog.csdn.net/jerr__y/article/details/61195257 自己組合的第一部分程式碼: import sys reload(sys) sys.setdefaultencoding('

做一個logitic分類鳶尾花資料分類

做一個logitic分類之鳶尾花資料集的分類 Iris 鳶尾花資料集是一個經典資料集,在統計學習和機器學習領域都經常被用作示例。資料集內包含 3 類共 150 條記錄,每類各 50 個數據,每條記錄都有 4 項特徵:花萼長度、花萼寬度、花瓣長度、花瓣寬度,可以通過這4個特徵預測鳶尾花卉屬於(iris-set

論文Multi-Perspective Sentence Similarity Modeling with Convolution Neural Networks實現資料製作

1.資料集 本文采用的是STS資料集,如下圖所示,包括所有的2012-2016年的資料,而all資料夾包含2012-2015的所有資料。 每一個檔案的具體資料如下所示,每一行為一個三元組:<相似性得分,句子1,句子2>. 在實現時將all資料夾中的所有資料當作