機器學習之線性分類SVM

2021-09-02 07:25:40 字數 3372 閱讀 7496

# -*- coding: utf-8 -*-

"""created on fri nov 30 21:05:40 2018

@author: muli

"""import matplotlib.pyplot as plt

import numpy as np

from sklearn import datasets,cross_validation,svm

def load_data_classfication():

'''載入用於分類問題的資料集

:return: 乙個元組,用於分類問題。元組元素依次為:訓練樣本集、測試樣本集、訓練樣本集對應的標記、測試樣本集對應的標記

'''iris=datasets.load_iris() # 使用 scikit-learn 自帶的 iris 資料集

x_train=iris.data

y_train=iris.target

return cross_validation.train_test_split(x_train, y_train,test_size=0.25,

random_state=0,stratify=y_train) # 分層取樣拆分成訓練集和測試集,測試集大小為原始資料集大小的 1/4

def test_linearsvc(*data):

'''測試 linearsvc 的用法

:param data: 可變引數。它是乙個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記

:return: none

'''x_train,x_test,y_train,y_test=data

cls=svm.linearsvc()

cls.fit(x_train,y_train)

print('coefficients:%s'%cls.coef_,)

print("------------")

print('intercept %s'%cls.intercept_)

print('score: %.2f' % cls.score(x_test, y_test))

def test_linearsvc_loss(*data):

'''測試 linearsvc 的**效能隨損失函式的影響

:param data: 可變引數。它是乙個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記

:return: none

'''x_train,x_test,y_train,y_test=data

losses=['hinge','squared_hinge']

for loss in losses:

cls=svm.linearsvc(loss=loss)

cls.fit(x_train,y_train)

print("loss:%s"%loss)

print('coefficients:%s, intercept %s'%(cls.coef_,cls.intercept_))

print('score: %.2f' % cls.score(x_test, y_test))

print("---------------")

def test_linearsvc_l12(*data):

'''測試 linearsvc 的**效能隨正則化形式的影響

:param data: 可變引數。它是乙個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記

:return: none

'''x_train,x_test,y_train,y_test=data

l12=['l1','l2']

for p in l12:

cls=svm.linearsvc(penalty=p,dual=false)

cls.fit(x_train,y_train)

print("penalty:%s"%p)

print('coefficients:%s, intercept %s'%(cls.coef_,cls.intercept_))

print('score: %.2f' % cls.score(x_test, y_test))

print("*****************")

def test_linearsvc_c(*data):

'''測試 linearsvc 的**效能隨引數 c 的影響

:param data: 可變引數。它是乙個元組,這裡要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記

:return: none

'''x_train,x_test,y_train,y_test=data

cs=np.logspace(-2,1)

train_scores=

test_scores=

for c in cs:

cls=svm.linearsvc(c=c)

cls.fit(x_train,y_train)

## 繪圖

fig=plt.figure()

ax=fig.add_subplot(1,1,1)

ax.plot(cs,train_scores,label="traing score")

ax.plot(cs,test_scores,label="testing score")

ax.set_xlabel(r"c")

ax.set_ylabel(r"score")

ax.set_xscale('log')

ax.set_title("linearsvc")

ax.legend(loc='best')

# 設定 x 軸的網格線,風格為 點畫線

plt.grid(axis='x',linestyle='-.')

plt.show()

if __name__=="__main__":

x_train,x_test,y_train,y_test=load_data_classfication() # 生成用於分類的資料集

# test_linearsvc(x_train,x_test,y_train,y_test) # 呼叫 test_linearsvc

# test_linearsvc_loss(x_train,x_test,y_train,y_test) # 呼叫 test_linearsvc_loss

# test_linearsvc_l12(x_train,x_test,y_train,y_test) # 呼叫 test_linearsvc_l12

test_linearsvc_c(x_train,x_test,y_train,y_test) # 呼叫 test_linearsvc_c

機器學習之SVM多分類

以下內容參考 王正海 基於決策樹多分類支援向量機岩性波譜分類 svm本身是應用於二分類的,所以在處理多分類並且想應用svm有必要進行改進svm如果直接在目標函式上進行修改的話,就是將多個分類面的引數合併到乙個最優化問題上,顯然難度太大。但是對於lr的話,可以直接拓展為softmax多分類。常見的方法...

機器學習演算法之SVM的多分類

一 svm可以直接進行多分類嗎 svm本身是對付二分類問題的,所以在處理多分類的時候需要進行必要的改造。同樣是二分類的情況,logistic回歸可以直接拓展為softmax多分類。但是svm如果直接在目標函式上進行修改的話,就是將多個分類面的引數求解合併到乙個最優化問題上,顯然難度太大,目前也沒有任...

機器學習之SVM

支援向量機是一種二類分類模型。在介紹svm之前,需要先了解支援向量這一概念,支援向量是訓練樣本的乙個子集,這一子集是二類分類的決策邊界。在二類分類過程中,可能存在無數個能夠正確分離二類資料的超平面,如圖1所示。但是不是所有的超平面都在未知資料上執行的都很好,例如圖2中的超平面b 1 就比超平面b 2...