用SVM分类模型处理iris数据集
文章目錄
- 一、實驗簡介:
- 二、實驗環境
- 三、第三方函數庫
- 1. Sklearn函數庫(用于構建SVM模型和數據集劃分)= Sci-Kit learn庫
- 2. Numpy函數庫(用于基本數據清洗和對數據格式進行處理會用于數據可視化過程中)
- 3. Matplotlib函數庫(用于數據可視化過程便于對比實驗結果)
- 四、實驗目標:
- 五、實驗過程
- 六、實驗代碼
- 七、實驗結果分析及結論
一、實驗簡介:
本次數據集很經典,實驗本身是基于SVM支持向量機技術對數據集Iris進行特征分類。實驗采取Sklearn函數庫來實現SVM,并使用SVM對提取好的特征進行分類,結果的展示方面進行了數據可視化保證觀測結果清晰可見。
首先,Iris數據集的中文名是安德森鳶尾花卉數據集,Iris包含150個樣本,對應數據集的每行數據。每行數據包含每個樣本的四個特征和樣本的類別信息,所以iris數據集是一個150行5列的二維表形式的樣本,被應用于多類模型的實驗當中。
還需要進一步介紹數據集的內容:數據集當中,每個樣本包含了花萼長度、花萼寬度、花瓣長度、花瓣寬度四個特征(前4列),我們需要建立一個分類器,分類器可以通過樣本的四個特征來判斷樣本屬于山鳶尾、變色鳶尾還是維吉尼亞鳶尾(‘Iris-setosa’, ‘Iris-versicolor’ , ‘Iris-virginica’)。當然數據集默認為str分類的,位于第五列,而由于在分類中類別標簽必須為數字量,所以應將Iris.data中的第5列的類別(字符串)轉換為數字形式。這是需要進行人工清洗的一個過程。
數據清洗完畢后就開始利用數據集進行分類器的構建,Sklearn非常方便可以根據需要將原始數據集按照比例依據類別標簽劃分成訓練集和測試集,本次實驗過程中分別按照默認比例和個人設置比例作了5組對照實驗。劃分好訓練集和測試集之后,就可以開始訓練SVM模型了,對核函數和參數的選擇將直接影響到模型的泛化誤差和預測準確度,在此處按照之前寫過的文章分成四組進行對照。在訓練完模型之后,采用可視化方法將預測區域和樣本呈現出來,可以比較直觀地觀測到模型的預測精度。具體對照組的對照情況和具體實驗過程將在后文中寫出。
二、實驗環境
Windows 10操作系統,Jupyter Notebook環境。
三、第三方函數庫
1. Sklearn函數庫(用于構建SVM模型和數據集劃分)= Sci-Kit learn庫
2. Numpy函數庫(用于基本數據清洗和對數據格式進行處理會用于數據可視化過程中)
3. Matplotlib函數庫(用于數據可視化過程便于對比實驗結果)
四、實驗目標:
我們現在得到了一組蘭花數據集,在這組數據中包含三種不同種類的蘭花,我們打算使用SVM對其進行分類,并通過這組實驗來評價SVM的分類效果和參數設置對模型泛化誤差的影響。
五、實驗過程
首先數據集是.data格式的文件,根據觀察和了解得知,其中包括4維特征值,和1維的標志位,而標志位還是以字符串形式給出的,所以需要先對數據集進行清洗和特征提取,為了方便后期可視化展示,在本次實驗過程中只取其中前兩維特征來進行實驗。
數據清洗可以通過字典過濾來實現,使用loadtxt函數中的參converters來實現字典轉換。將第五列特征特征提取過程使用的是numpy庫當中的split函數,該函數可以實現將前四維特征與后面的部分分離,這里用到一個以前不太常見的切片寫法(4,),在這里特別記錄一下。具體代表的含義為以4,5列中心點未劃分劃為兩個array保存在兩個參數中(注意結果為兩個輸出)。所以我們可以通過這個函數來實現將數據和標志分離,并保持其一一對應,相對位置不變。
為了實驗能夠有顯著的結果,而且為了保證訓練集和測試集能有著良好的數據一致性,使用train_test_split函數將原始數據集對訓練集和測試及進行劃分,該方法是有默認分配比例的(訓練集:測試集=7.5:2.5),但也可以認為指定參數來進行修改。本次試驗分別取了5組比例進行對照。由于,數據集包含兩部分(數據和標簽),所以當分離結束后,需要使用4個變量來接收返回值(train_data, test_data, train_label, test_label)。
當以上對數據的處理結束,就可以開始構建SVM分類器了,Sklearn提供了很好的分類器實現,我將在這里介紹其參數配置,以及實驗的對照設計。分類器的實現總共含3個主要參數(訓練對應關系decision_function_shape,學習步長c和核函數的選擇kernel),當選擇的核為rbf高斯核的時候還會需要配置gamma徑向基核速度參數。本次試驗中步長給定為5且對應關系為一對多ovr,這兩個變量作為控制變量保持不變。對照組分別使用高斯核(不同gamma)和線性核,進行對照設計實驗。
設計好對照組之后,將不同對照組的實驗數據跑出進行對比。同時給出可視化展示。
六、實驗代碼
第三方函數庫的導入部分:
函數定義部分:
具體實現部分:(事實上我重點做了以下本實驗的可視化部分并設置了對照)
關于接下來分類器定義這一部分:我需要詳細講一下參數問題,雖然上文中講到了一部分,但還不夠詳細:
首先關于核函數的選取,kernel='linear’時,為線性核,C越大分類效果越好,但有可能會過擬合(defaul C=1)。而當kernel=‘rbf’(default),為高斯核,gamma值越小,分類界面越連續;gamma值越大,分類界面越“散”,分類效果越好,但有可能會過擬合(在后面的圖中能看出來)。
其次關于決策函數對應關系問題,當decision_function_shape='ovr’時,為one v rest(一對多),即一個類別與其他類別進行劃分,而當decision_function_shape='ovo’時,為one v one(一對一),即將類別兩兩之間進行劃分,用二分類的方法模擬多分類的結果。
關于數據可視化部分,我再做一些補充,大家會發現我在這里使用grid,這個來自numpy庫函數,詳細解釋一下:
要想理解mgrid的參數,我們先假設現在要實現一個目標函數f(x,y) = x + y。x軸范圍13,y軸范圍46,當繪制圖像時主要分四步進行:
step1:x方向上的擴展(即沿x軸向右擴展):
[1 1 1]
[2 2 2]
[3 3 3]
step2:y方向上的擴展(即沿y軸向下擴展):
[4 5 6]
[4 5 6]
[4 5 6]
step3:定位(xi,yi)(其實就是合并兩個矩陣):
[(1,4) (1,5) (1,6)]
[(2,4) (2,5) (2,6)]
[(3,4) (3,5) (3,6)]
step4:將(xi,yi)代入F(x,y) = x+y表示出來
因此這里x1, x2 = np.mgrid[x1_min:x1_max:200j,x2_min:x2_max:200j]后的結果可以看做是將兩個矩陣拼合之后,創造了一片布滿點的區域出來。
七、實驗結果分析及結論
首先,我們先來看一下數據集劃分對照的結果,我們這時候規定C=5,核為rbf核,ovr模式,gamma=10。
Chart1:數據集劃分對照結果
根據劃分結果看,在接近7580%:2520%的訓練集測試集比例時,結果開始趨于穩定,同時為了避免測試集數據過少缺乏一般性,可以認為默認的7.5:2.5的比例已經具備相對較好的觀測水平(接下來的實驗對照組均是以7.5:2.5來進行的)。
接下來開始對不同參數的分類器模型進行對照觀測:
Chart2:分類器對照結果
我們和之前對手寫輸入識別的數據計處理方法一樣,主要針對的是徑向基核的實驗效果(因為速度快),當然也加入了一組線性核做對照。單從數據來看的話似乎,gamma取5的時候測試集表現出了很好的預測效果,但是竟然超過了訓練集得分,我們認為這是不可靠的,事實上很好理解,gamma過低會導致徑向基核欠擬合(當然過高也會過擬合),所以結果不可靠,不能認為是得到了很好的預測結果和模型參數。事實上,這一點也可以從下文的圖中直觀地感受到,因為我們繪制了預測區域,而這個區域和我們最終預測的部分重合度很低,是欠擬合的。
所以,我們應該關注的是,當gamma達到10-20的時候,測試集得分趨于穩定,我們認為在這個區間上的gamma值才是相對可靠的,這一點也可以通過下文的圖來印證。有趣的是,我引入了一組線性核發現表現并不是很差(無論是在訓練集還是在測試集),也許當實際應用需要的時候,也會選擇犧牲linear核的錯誤率來提高分類速度。這在現實應用中往往是可以接受的。我在我的前一篇文章也就是手寫輸入識別案例報告中對這一部分也是有所提及的。
接下來展示不同的參數對照組的預測效果圖像,一方面這可以幫助我們更直觀的觀察結果,另一方面這也是為了印證我剛剛所得出的結論:(三種不同的花類別用三種顏色代表,高亮區域是我們用grid構造的預測區域(也就是我們的模型),樣本點的顏色代表著其數據集中的標簽顏色,有白色環的為測試集樣本)
Chart3:RBF核Gamma = 1實驗結果
Chart4:RBF核Gamma = 5實驗結果
Chart5:RBF核Gamma = 10實驗結果
Chart6:RBF核Gamma = 20實驗結果
Chart7:Linear核實驗結果
總結
以上是生活随笔為你收集整理的用SVM分类模型处理iris数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ESP32 coredump 分析
- 下一篇: SQL 插入时直接插入当前时间