sklearn的機器學習之路 支援向量機(SVM)

2021-08-15 16:53:34 字數 2464 閱讀 7587

什麼是svm:支援向量機就是使用一條直線(二維)或超平面(多維)將資料分成兩類,同時保證離超平面最近的點與超平面的間隔盡可能小。

支援向量:離超平面最近的幾個訓練樣本,且滿足

間隔(margin):分類不同的支援向量之間的距離γ=

對偶問題:在求解分類器時過於複雜,為了簡化問題,我們將目標函式和約束函式融入新的函式,即使用拉格朗日乘子法得到「對偶問題」。

核函式:當訓練樣本不是線性可分時,需要使用到核函式。核函式將樣本維數對映到更高維的空間,使得樣本在高維空間中線性可分。核函式k(

⋅,⋅)

=ϕ(x

i)tϕ

(xj)

k (⋅

,⋅)=

ϕ(xi

)tϕ(

xj),ϕ(

x)ϕ (x

)表示x對映後的特徵向量。

常用核函式

軟間隔:在現實生活中很難找到合適的核函式使得訓練樣本線性可分,因此需要引入「軟間隔」。軟間隔是指允許某些樣本出錯,但是要讓錯誤盡可能小。三種常見的替代損失函式:

支援向量回歸(svr):傳統的回歸模型是計算模型輸出f(

x)f (x

)與真實值輸出y之間的差別來計算損失,而支援向量回歸有個容忍偏差

ϵ ϵ

,即僅當f(

x)f (x

)與y差值大於

ϵ ϵ

時才計算損失。

選取了機器學習實戰第6課的資料進行實驗,相關資料和**可前往:

from sklearn import metrics

from sklearn.svm import svc

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import minmaxscaler

import matplotlib.pyplot as plt

import numpy as np

# 讀取資料

x =

y =

fr = open("testsetrbf.txt")

index = 0

forline

in fr.readlines():

line = line.strip()

line = line.split('\t')

plt.scatter(np.array(x)[:,0],np.array(x)[:,1])

plt.show()

#歸一化

scaler = minmaxscaler()

x = scaler.fit_transform(x)

# 交叉分類

train_x,test_x, train_y, test_y = train_test_split(x,

y,test_size=0.2) # test_size:測試集比例20%

# knn模型,選擇3個鄰居

model = svc(kernel='rbf', degree=2, gamma=1.7)

model.fit(train_x, train_y)

print(model)

expected = test_y

predicted = model.predict(test_x)

print(metrics.classification_report(expected, predicted)) # 輸出分類資訊

label = list(set(y)) # 去重複,得到標籤類別

print(metrics.confusion_matrix(expected, predicted, labels=label)) # 輸出混淆矩陣資訊

sklearn機器學習 PCA

pca使用的資訊量衡量指標,就是樣本方差,又稱可解釋性方差,方差越大,特徵所帶的資訊量越多 原理推導 class sklearn decomposition.pca n components none,copy true whiten false svd solver auto tol 0.0,it...

sklearn 機器學習庫

pipeline parameters steps 步驟 列表 list 被連線的 名稱,變換 元組 實現擬合 變換 的列表,按照它們被連線的順序,最後乙個物件是估計器 estimator memory 記憶體引數,instance of sklearn.external.joblib.memory...

機器學習 Sklearn 除錯模型

1 過擬合 處理過擬合的方法有 a 減少特徵,降低模型的複雜度 b 減小除錯引數 c 增加訓練資料量 常用的調參方法就是通過在懲罰函式中新增乙個正則化引數c來控制分類邊界對樣本的辨識度,如果是用權重的二次方,則是l2正則化,如果是 w c則是l1正則化。l2損失函式 x是訓練集,w權重矩陣,b是偏置...