問題:高斯核在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...