原數(shù)據(jù)地址:
https://aistudio.baidu.com/aistudio/projectdetail/1096669
任務(wù)描述:
構(gòu)建一個(gè)模型,根據(jù)鳶尾花的花萼和花瓣大小將其分為三種不同的品種。
數(shù)據(jù)集
總共包含150行數(shù)據(jù)
每一行數(shù)據(jù)由 4 個(gè)特征值及一個(gè)目標(biāo)值組成,。
4 個(gè)特征值分別為:萼片長度,、萼片寬度、花瓣長度,、花瓣寬度
目標(biāo)值為三種不同類別的鳶尾花,分別為: Iris Setosa,、Iris Versicolour、Iris Virginica
首先導(dǎo)入必要的包:
numpy :python第三方庫,用于科學(xué)計(jì)算
matplotlib :python第三方庫,主要用于進(jìn)行可視化
sklearn :python的重要機(jī)器學(xué)習(xí)庫,其中封裝了大量的機(jī)器學(xué)習(xí)算法,如:分類,、回歸,、降維以及聚類
import numpy as np
from matplotlib import colors
from sklearn import svm
from sklearn. svm import SVC
from sklearn import model_selection
import matplotlib. pyplot as plt
import matplotlib as mpl
Step1.數(shù)據(jù)準(zhǔn)備
(1)從指定路徑下加載數(shù)據(jù)
(2)對加載的數(shù)據(jù)進(jìn)行數(shù)據(jù)分割,x_train,x_test,y_train,y_test分別表示訓(xùn)練集特征、訓(xùn)練集標(biāo)簽,、測試集特征,、測試集標(biāo)簽
#*************將字符串轉(zhuǎn)為整型,便于數(shù)據(jù)加載***********************
def iris_type ( s) :
it = { b'Iris-setosa' : 0 , b'Iris-versicolor' : 1 , b'Iris-virginica' : 2 }
return it[ s]
#加載數(shù)據(jù)
data_path= '/home/aistudio/data/data5420/iris.data' #數(shù)據(jù)文件的路徑
data = np. loadtxt( data_path, #數(shù)據(jù)文件路徑
dtype= float , #數(shù)據(jù)類型
delimiter= ',' , #數(shù)據(jù)分隔符
converters= { 4 : iris_type} ) #將第5列使用函數(shù)iris_type進(jìn)行轉(zhuǎn)換
#print(data) #data為二維數(shù)組,data.shape=(150, 5)
#print(data.shape)
#數(shù)據(jù)分割
x, y = np. split( data, #要切分的數(shù)組
( 4 , ) , #沿軸切分的位置,第5列開始往后為y
axis= 1 ) #代表縱向分割,按列分割
x = x[ : , 0 : 2 ] #在X中我們?nèi)∏皟闪凶鳛樘卣?#xff0c;為了后面的可視化。x[:,0:4]代表第一維(行)全取,第二維(列)取0~2
#print(x)
x_train, x_test, y_train, y_test= model_selection. train_test_split( x, #所要?jiǎng)澐值臉颖咎卣骷?/span>
y, #所要?jiǎng)澐值臉颖窘Y(jié)果
random_state= 1 , #隨機(jī)數(shù)種子
test_size= 0.3 ) #測試樣本占比
Step2.模型搭建
C越大,相當(dāng)于懲罰松弛變量,希望松弛變量接近0,即對誤分類的懲罰增大,趨向于對訓(xùn)練集全分對的情況,這樣對訓(xùn)練集測試時(shí)準(zhǔn)確率很高,但泛化能力弱,。 C值小,對誤分類的懲罰減小,允許容錯(cuò),將他們當(dāng)成噪聲點(diǎn),泛化能力較強(qiáng),。
kernel='linear’時(shí),為線性核
decision_function_shape='ovr’時(shí),為one v rest,即一個(gè)類別與其他類別進(jìn)行劃分,
decision_function_shape='ovo’時(shí),為one v one,即將類別兩兩之間進(jìn)行劃分,用二分類的方法模擬多分類的結(jié)果。
#**********************SVM分類器構(gòu)建*************************
def classifier ( ) :
#clf = svm.SVC(C=0.8,kernel='rbf', gamma=50,decision_function_shape='ovr')
clf = svm. SVC( C= 0.5 , #誤差項(xiàng)懲罰系數(shù),默認(rèn)值是1
kernel= 'linear' , #線性核 kenrel="rbf":高斯核
decision_function_shape= 'ovr' ) #決策函數(shù)
return clf
# 2.定義模型:SVM模型定義
clf = classifier( )
Step3.模型訓(xùn)練
#***********************訓(xùn)練模型*****************************
def train ( clf, x_train, y_train) :
clf. fit( x_train, #訓(xùn)練集特征向量
y_train. ravel( ) ) #訓(xùn)練集目標(biāo)值
#***********************訓(xùn)練模型*****************************
def train ( clf, x_train, y_train) :
clf. fit( x_train, #訓(xùn)練集特征向量
y_train. ravel( ) ) #訓(xùn)練集目標(biāo)值
# 3.訓(xùn)練SVM模型
train( clf, x_train, y_train)
Step4.模型評估
#**************并判斷a b是否相等,計(jì)算acc的均值*************
def show_accuracy ( a, b, tip) :
acc = a. ravel( ) == b. ravel( )
print ( '%s Accuracy:%.3f' % ( tip, np. mean( acc) ) )
def print_accuracy ( clf, x_train, y_train, x_test, y_test) :
#分別打印訓(xùn)練集和測試集的準(zhǔn)確率 score(x_train,y_train):表示輸出x_train,y_train在模型上的準(zhǔn)確率
print ( 'trianing prediction:%.3f' % ( clf. score( x_train, y_train) ) )
print ( 'test data prediction:%.3f' % ( clf. score( x_test, y_test) ) )
#原始結(jié)果與預(yù)測結(jié)果進(jìn)行對比 predict()表示對x_train樣本進(jìn)行預(yù)測,返回樣本類別
show_accuracy( clf. predict( x_train) , y_train, 'traing data' )
show_accuracy( clf. predict( x_test) , y_test, 'testing data' )
#計(jì)算決策函數(shù)的值,表示x到各分割平面的距離
print ( 'decision_function:\n' , clf. decision_function( x_train) )
# 4.模型評估
print_accuracy( clf, x_train, y_train, x_test, y_test)
Step5.模型使用
def draw ( clf, x) :
iris_feature = 'sepal length' , 'sepal width' , 'petal lenght' , 'petal width'
# 開始畫圖
x1_min, x1_max = x[ : , 0 ] . min ( ) , x[ : , 0 ] . max ( ) #第0列的范圍
x2_min, x2_max = x[ : , 1 ] . min ( ) , x[ : , 1 ] . max ( ) #第1列的范圍
x1, x2 = np. mgrid[ x1_min: x1_max: 200j , x2_min: x2_max: 200j ] #生成網(wǎng)格采樣點(diǎn)
grid_test = np. stack( ( x1. flat, x2. flat) , axis= 1 ) #stack():沿著新的軸加入一系列數(shù)組
print ( 'grid_test:\n' , grid_test)
# 輸出樣本到?jīng)Q策面的距離
z = clf. decision_function( grid_test)
print ( 'the distance to decision plane:\n' , z)
grid_hat = clf. predict( grid_test) # 預(yù)測分類值 得到【0,0.,。,。。2,2,2】
print ( 'grid_hat:\n' , grid_hat)
grid_hat = grid_hat. reshape( x1. shape) # reshape grid_hat和x1形狀一致
#若3*3矩陣e,則e.shape()為3*3,表示3行3列
cm_light = mpl. colors. ListedColormap( [ '#A0FFA0' , '#FFA0A0' , '#A0A0FF' ] )
cm_dark = mpl. colors. ListedColormap( [ 'g' , 'b' , 'r' ] )
plt. pcolormesh( x1, x2, grid_hat, cmap= cm_light) # pcolormesh(x,y,z,cmap)這里參數(shù)代入
# x1,x2,grid_hat,cmap=cm_light繪制的是背景,。
plt. scatter( x[ : , 0 ] , x[ : , 1 ] , c= np. squeeze( y) , edgecolor= 'k' , s= 50 , cmap= cm_dark) # 樣本點(diǎn)
plt. scatter( x_test[ : , 0 ] , x_test[ : , 1 ] , s= 120 , facecolor= 'none' , zorder= 10 ) # 測試點(diǎn)
plt. xlabel( iris_feature[ 0 ] , fontsize= 20 )
plt. ylabel( iris_feature[ 1 ] , fontsize= 20 )
plt. xlim( x1_min, x1_max)
plt. ylim( x2_min, x2_max)
plt. title( 'svm in iris data classification' , fontsize= 50 )
plt. grid( )
plt. show( )