Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

使用 Python + Sklearn 及

SVM 做資料分類
與完整程式碼
淡江資工 LifeLab
目標:讓電腦分類三種鳶尾花
鳶尾花範例集 iris.csv,裡面有150筆資料,每50筆分別為 setosa、versicolor、virginica 三種鳶尾花
辨別區分它們的方法,是藉由它們的四個特徵,即 sepal_length、sepal_width、petal_length、petal_width

右圖為 iris.csv 的檔案內容,包含五個欄位,


前面四個欄位為特徵,最右邊的欄位是該筆資料屬於哪個類別

(習慣上,在監督式學習中,如果資料有 n 個特徵,
那麼第 n+1 個欄位會放上它屬於哪個類別)
需先安裝 Python
來執行本範例的程式碼
使用
Python + Sklearn
做機器學習 因為本範例程式中的機器學習
是使用 Sklearn 函式庫
安裝好 Python 後,接著安裝 Sklearn 函式庫
使程式能夠順利運行
Python 讀取
CSV檔 執行結果

from pandas import read_csv


iris = read_csv("iris.csv")
iris

注意:
請將 iris.csv 檔和你的程式放在同一個
資料夾,這樣程式才找的到該檔案。

此處需要 pandas 函式庫,如果你的


python 沒有內建,請自行安裝
機器學習的目的是,給予一筆資料 X,
透過訓練好的模型,輸出它的答案 Y

機器學習 (監督式) 例如,假如我們訓練的是一個加法模型,


原理 若 X 為 [2,3],那麼 Y 即為 5

亦即,我們要訓練出一個 func,
使 Y = func(X)
在iris.csv資料中,
有一筆資料前四個欄位值為 [6.7, 3.1, 5.6, 2.4]

處理讀進來的 該花為 virginica


因此若我們輸入 X = [6.7, 3.1, 5.6, 2.4]
iris.csv 模型應該要輸出 virginica
使其能被
機器學習模型 因此在鳶尾花的範例中
使用 我們將每筆資料的前四個欄位設為 X
最後一個欄位設為 Y
使 Y = func(X) 可以運作
處理讀進來的
iris.csv 執行結果
使其能被
機器學習模型
使用 因為電腦只能處理數值而非文字
因此透過le.fit_transform
將 setosa 以 0 代替
from pandas import read_csv versicolor 以 1 代替
le = preprocessing.LabelEncoder() virginica 以 2 代替
iris = read_csv("iris.csv")
iris = iris.values …
label_index = 4

X = iris[:,: label_index]

Y = le.fit_transform(iris[:, label_index])

X
Y
將 X 和 Y 準備好後,我們需要一個「引擎」,
讓機器學習模型可以建立。

將 X 和 Y 套入機 本範例使用 SVM

器學習模型 https://en.wikipedia.org/wiki/Support-vector_machine

我們使用sklearn提供的 SVC 來運行 SVM


產生classifier模型的虛擬碼如下
classifier = SVC()
classifier.fit(X, Y)
將 X 和 Y 套入
機器學習模型
from pandas import read_csv
iris = read_csv("iris.csv")
iris = iris.values
執行結果
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
label_index = 4

x_train = iris[:,: label_index] # features


x_test = le.fit_transform(iris[:, label_index]) # target

x_train
x_test

from sklearn.svm import SVC


clf = SVC()
clf.fit(x_train,x_test)

y_test_predict = clf.predict(x_train)

print("Acutal: ");
print(x_test);
print("Predicted: ");
print(y_test_predict);
剛才的範例中,訓練用的題目和測試的題目,完全一樣
clf.fit(x_train,x_test)
y_test_predict = clf.predict(x_train)

將資料拆分為 若未來出現從未看過的題目

訓練集和測試集 該模型可能無法正確答對

因此,我們將 iris.csv 的資料拆成 訓練集 和 測試集


訓練資料不包含於測試資料
而測試資料也不包含訓練資料
將資料拆分為
訓練集和測試集
from pandas import read_csv
iris = read_csv("iris.csv")
iris = iris.values

from sklearn import preprocessing


le = preprocessing.LabelEncoder()
執行結果
label_index = 4
X = iris[:,: label_index] # features
Y = le.fit_transform(iris[:, label_index]) # target

#將資料分割為訓練集與測試集
import numpy as np
np.random.seed(5)

from sklearn.model_selection import train_test_split


x_train, x_test, y_train, y_test = \
train_test_split(X, Y, test_size=0.6, random_state=87)

from sklearn.svm import SVC

clf = SVC()
clf.fit(x_train, y_train)

y_test_predict = clf.predict(x_test)

print("Acutal: ");
print(y_test);
print("Predicted: ");
print(y_test_predict);
結果討論
• 我們發現並不是所有的鳶尾花
的類別都被正確分類

• 如何改進?
• 調整 SVM 的參數
• 捨棄 SVM 改用其他分類器
• 檢討資料本身是否就有問題

You might also like