使用svm的一个常见错误
生活随笔
收集整理的這篇文章主要介紹了
使用svm的一个常见错误
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.sina.com.cn/s/blog_6ae183910101cxbv.html
幾天前,我在微博上面問了一個問題“一個兩類分類問題,5400個訓練樣本,600個測試樣本(測試、訓練樣本不交疊),特征10000維,用RBF核的SVM訓練,得到的模型在測試集上測試誤差為50%(和隨機猜想一樣)。而如果改用線性核,則準確率可以達到80%。這正常嗎?”
包括余凱、老師木、山世光在內的很多大牛都熱情回答,在此一并感謝,就不一一點名啦。
大家的討論,從RBF核的特點、特征空間分布、高維幾何反直覺一直到人腦的處理方式,讓人眼花繚亂,同時也受益匪淺。
最終證明,這其實是我在使用RBF Gamma參數時設置不當造成的過訓練。我的修改和結果如下:我將每一個樣本的特征向量都做了L2歸一化(此時,gamma的取值在1附近,對性能影響不大),RBF特征可以得到86%的準確率。未作歸一化的線性核結果可以達到84%(相對發微博時的版本,特征上面有所調整,所以線性核性能有所提高,此外,L2會造成不同樣本同一特征的相對值改變,所以線性版本未用L2歸一化)。
這里面大家需要注意的就是gamma的物理意義,大家提到很多的RBF的幅寬,它會影響每個支持向量對應的高斯的作用范圍,從而影響泛化性能。我的理解:如果設的太大,則會造成只會作用于支持向量樣本附近,對于未知樣本分類效果很差,存在訓練準確率可以很高,而測試準確率不高的可能,就是通常說的過訓練;而如果設的過小,則會造成平滑效應太大,無法在訓練集上得到特別高的準確率,也會影響測試集的準確率。 此外大家注意RBF公式里面的sigma和gamma的關系如下: The rbf kernel is typically defined as k(x,z) = exp(-(d(x,z)^2)/(2*sigma^2)), which can be re-defined in terms of gamma as k(x,z) = exp(-gamma*(d(x,z)^2)), where gamma = 1/(2*sigma^2).?
此外,可以明確的兩個結論是: 結論1:樣本數目少于特征維度并不一定會導致過擬合,這可以參考余凱老師的這句評論: “這不是原因啊,呵呵。用RBF kernel, 系統的dimension實際上不超過樣本數,與特征維數沒有一個trivial的關系。”
結論2:RBF核應該可以得到與線性核相近的效果(按照理論,RBF核可以模擬線性核),可能好于線性核,也可能差于,但是,不應該相差太多。 當然,很多問題中,比如維度過高,或者樣本海量的情況下,大家更傾向于用線性核,因為效果相當,但是在速度和模型大小方面,線性核會有更好的表現。
老師木還有一句評論,可以加深初學者對SVM的理解: “須知rbf實際是記憶了若干樣例,在sv中各維權重重要性等同。線性核學出的權重是feature weighting作用或特征選擇 。”
總結
以上是生活随笔為你收集整理的使用svm的一个常见错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通配符在泛型中的应用
- 下一篇: Twitter Snowflake