SVM 中的成本 (C) 參數是什麼意思?
我正在嘗試使 SVM 適合我的數據。我的數據集包含 3 個類,我正在執行 10 折交叉驗證(在 LibSVM 中):
./svm-train -g 0.5 -c 10 -e 0.1 -v 10 training_data
幫助指出:
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
對我來說,提供更高的成本 (C) 值可以讓我獲得更高的準確性。SVM中的C實際上是什麼意思?為什麼以及何時應該使用 C 的更高/更低值(或 LibSVM 給定的默認值)?
我試圖給出一個簡單易懂的答案。一個完整的答案可能需要涵蓋從支持向量機背後的目的到損失和支持向量的更精細細節的所有內容。如果您想更深入地研究這些細節,您可能需要查看例如機器學習書籍中有關 SVM 的章節。
SVM 是大邊距分類器。這意味著黑白類樣本之間的(假設是線性的)分離不僅是一種可能的分離,而且是可能的最佳分離,通過獲得兩類樣本之間的最大可能間隔來定義。這將是在示例圖像中:
如果您考慮一下這一點,您會得出結論,分離僅來自那些更接近“另一類”的樣本,因此那些接近邊緣的樣本(準確地說:邊緣的那些*)*。在示例圖像中,這些樣本用與樣本正交的灰線標記. 這種行為會導致一個問題:由於用於推導分離的樣本量在很大程度上是子集,影響這些樣本的噪聲很可能會導致分離對於大多數數據來說不是最佳的。這就是我們都知道的過度擬合:從所用訓練的大邊距的角度來看,分離將是最佳的,但會泛化得很差,因此對於其他/尚未看到的數據來說不是最佳的。
到目前為止,我們討論的是“硬邊距分類”:我們不允許任何樣本位於邊距內,因為這是迄今為止定義邊距的方式。當我們現在放鬆這個硬屬性時,我們最終會進行“軟邊距分類”。因此,margin 背後的想法保持不變——但我們現在可以允許某些樣本位於 margin 內。這樣做的核心好處是,模型對數據的整體擬合可能比硬邊距分類更好(以一些偏差為代價減少方差)。
因此,一方面,我們仍然必須解決我們的簡單優化問題(如何最好地擬合模型 = 線與我們的數據)。另一方面,我們不想讓所有/許多樣本都在邊距中——我們想以某種方式調整讓多少樣本進入邊距,這樣邊距既不會完全過擬合,也不會完全失去其大邊距屬性。
**這就是參數進入階段。核心思想很簡單:我們修改優化問題以優化線與數據的擬*合併同時懲罰*邊緣內的樣本量,其中定義邊緣內有多少樣本對整體誤差有貢獻的權重。因此,與你可以調整你的大邊距分類應該有多硬或多軟。用低, 邊緣內的樣本受到的懲罰少於具有更高. 帶一個0,邊緣內的樣本不再受到懲罰 - 這是禁用大邊緣分類的一種可能的極端。帶著無限你有另一個可能的極端硬利潤。
這是一個小例子,可視化由更改引起的效果使用眾所周知的 iris 數據集(在包中
R
並使用caret
包,當然這同樣適用libsvm
)。這就是原始數據的樣子(這是一個二元分類問題):library(caret) d <- iris[51:150,c(1,2,5)] plot(d[,c(2,1)], pch = ifelse(d[,3]=='versicolor', 1, 2))
這是如何改變會影響模型的性能:
m <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', trControl = trainControl(method = 'repeatedcv', 10, 20), tuneGrid = expand.grid(C=3**(-7:7))) plot(m, scales=list(x=list(log=3)))
這就是兩個不同選擇之間的分離差異值(請注意,分隔線具有不同的傾斜度!):
m1 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(-7))) plot(m1$finalModel)
m2 <- train(d[,1:2], factor(d[,3]), method = 'svmLinear', preProcess = c('center', 'scale'), trControl = trainControl(method = 'none'), tuneGrid = expand.grid(C=3**(7))) plot(m2$finalModel)
因此,實際上,您最有可能在 ML 設置中做的是正確調整,例如使用調諧網格。您可以考慮例如此出版物以獲取更多詳細信息。它來自 LibSVM 人員,他們提供了很多有用的信息,從解釋 SVM 如何與很好的示例一起工作到代碼片段,例如如何將參數網格與 LibSVM 一起使用:
許等人。(2003 年)。“支持向量分類的實用指南。” 國立台灣大學計算機科學與信息工程系。
順便說一句:人們對 SVM 的看法有一小部分參數,我也發現它有助於理解它:http ://www.svms.org/parameters/