SVM引數理解和分類實踐

2021-10-23 07:41:30 字數 4028 閱讀 3817

問題:高斯核在delta(方差)變大的情況下,整個模型容易overfitting還是underfitting?

看本文前半部分就明白了 ^_^

sklearn中svm.svc()有比較重要的引數c和gamma,預設使用徑向基核(kernel=『rbf』)。

rbf的核函式:k(x

,z)=

exp(

−γ∥x

−z∥2

),

γ>

0k(x,z)=exp(-\gamma\|x-z\|^2),\, \gamma>0

k(x,z)

=exp

(−γ∥

x−z∥

2),γ

>0

高斯核的rbf時,核函式:k(x

,z)=

exp(

−∥x−

z∥22

⋅δ2)

k(x,z)=exp(-\dfrac)

k(x,z)

=exp

(−2⋅

δ2∥x

−z∥2

​)直覺上來看,rbf核函式的引數γ

\gamma

γ(gamma),效果等同於1δ′

\dfrac

δ′1​

,決定了資料對映到新的特徵空間後的分布(正態分佈)。

gamma較大時,相當於正態分佈中的δ

\delta

δ(方差)較小,對映出的高斯分布又高又瘦較為集中,那麼單個樣本對周圍樣本的影響力度大,範圍窄,比較容易被選為支援向量,或者說整個模型的支援向量也會多,更容易過擬合

反之,當gamma比較小時,單個樣本對整個分類超平面的影響比較小,不容易被選擇為支援向量,整個模型的支援向量較少,不容易過擬合。

scikit-learn中預設值是: 1 / (樣本特徵數*樣本方差)

c是懲罰係數,即對誤差的寬容度。c越高,說明越不能容忍出現誤差,容易過擬合。c越小,容易欠擬合。不管是 svc(分類)還是 svr(回歸),引數c都是為了在模型準確率與模型複雜度之間取得乙個平衡。sklearn中預設值是1.0。

svc的優化目標:min⁡ω

,b,ζ

12ωt

ω+c∑

i=1n

ζis.

t.yi

(ωtϕ

(xi)

+b)≥

1−ζi

,ζi≥

0\mathop_\frac\omega^t\omega+c\sum\limits_^\zeta_i \\ s.t.\quad y_i(\omega^t\phi(x_i)+b)\geq 1-\zeta_i,\, \zeta_i\geq 0

minω,b

,ζ​2

1​ωt

ω+ci

=1∑n

​ζi​

s.t.

yi​(

ωtϕ(

xi​)

+b)≥

1−ζi

​,ζi

​≥0

模型誤差的部分ζ

i\zeta_i

ζi​被乘以乙個係數 c 以後(可以看作正則項),如果 c 比較大,那麼要想達到最小化的目標,模型誤差就會被逼迫著盡量減小,此時模型對異常值的容忍度降低,

會盡可能多地擬合訓練樣本,泛化能力較差。

如果 c 比較小,那麼就會鼓勵模型去尋找乙個較大間隔的決策邊界,不強求對於訓練資料完美得擬合,對極端值的容忍度比較高。此時,會犧牲一定的準確性。

svm對mnist手寫體數字識別的例子

sklearn-svm 網格搜尋官網例子

svm的網格搜尋耗時太久,下面**不要輕易嘗試。

from sklearn import svm, metrics

from sklearn.datasets import fetch_mldata

from sklearn.model_selection import train_test_split

from sklearn.model_selection import gridsearchcv

import matplotlib.pyplot as plt

import numpy as np

import datetime as dt

if __name__ ==

"__main__"

: mnist = fetch_mldata(

'mnist original'

)# dict_keys(['descr', 'col_names', 'target', 'data'])

print

(mnist.keys())

# data field is 70k x 784 array, each row represents pixels from 28x28=784 image

images = mnist.data

targets = mnist.target

print

(images.shape)

x_data = images/

255.0

y = targets

x_train, x_test, y_train, y_test = train_test_split(x_data, y, test_size=

0.15

, random_state=13)

################ classifier with grid search ###########

param_grid =

print

("parameters:{}"

.format

(param_grid)

)# 開始計時

start_time = dt.datetime.now(

)print

('start training at {}'

.format

(str

(start_time)))

# 交叉驗證和訓練

model = gridsearchcv(svm.svc(

), param_grid, n_jobs=-1

, cv=3)

model.fit(x_train,y_train)

print

("test set score:"

.format

(model.score(x_test,y_test)))

print

("best parameters:{}"

.format

(model.best_params_)

)print

("best score on train set:"

.format

(model.best_score_)

)# 計時結束

end_time = dt.datetime.now(

) elapsed_time= end_time - start_time

print

('elapsed training {}'

.format

(str

(elapsed_time)))

################ predict ###########

predicted = model.predict(x_test)

# y_test is the true value

cm = metrics.confusion_matrix(y_test, predicted)

print

("confusion matrix:\n%s"

% cm)

print

("\naccuracy={}"

.format

(metrics.accuracy_score(y_test, predicted)

))

ref:

接地氣的程式媛 - rbf svm 引數解讀

dd sKip 和 seek引數理解

假如我有乙個檔案abc.gz,大小為83456k,我想用dd命令實現如下備份結果 首先將備份分成三個部分,第一部分為備份檔案abc.gz的前10000k,第二部分為中間的70000k,最後備份後面的3456k.備份方法如下三條命令 dd if abc.gz of abc.gz.bak1 bs 1k ...

backlog引數理解

listen函式把乙個由socket函式建立的套接字轉換成乙個被動套接字,指示核心接受指向該套接字的連線請求。該套接字也由closed狀態轉換到listen狀態。函式原型 include int listen int sockfd,int backlog 成功返回0,失敗返回 1。listen之後核...

電感引數理解

1.電感的q值 電感的q值,也叫做電感的品質因素,是衡量電感器件的主要引數。指電感器在某一頻率的交流電壓工作下,所呈現的感抗與其等效損耗電阻之比。電感器的q值越高,損耗越小,效率越高。電感的q值與線圈導線的直流電阻 線圈骨架的介質損耗及鐵心 遮蔽罩等引起的損耗等有關。2.電感q值的換算 1 q 2p...