使用libsvm对MNIST数据集进行实验
在學(xué)SVM中的實(shí)驗(yàn)環(huán)節(jié),老師介紹了libsvm的使用。當(dāng)時看完之后感覺簡單的說不出話來。
1. libsvm介紹
雖然原理要求很高的數(shù)學(xué)知識等,但是libsvm中,完全就是一個工具包,拿來就能用。當(dāng)時問了好幾遍老師,公司里做svm就是這么簡單的?敲幾個命令行就可以了。。。貌似是這樣的。當(dāng)然,在大數(shù)據(jù)化的背景下,還會有比如:并行SVM、多核函數(shù)SVM等情況的研究和應(yīng)用。
實(shí)驗(yàn)環(huán)節(jié)老師給的數(shù)據(jù)很簡單,也就1000個數(shù)據(jù)點(diǎn),使用svm進(jìn)行分類。沒有太多好說的。于是自己想要試試做手寫字體分類檢測,類似于行車違章拍照后的車牌識別。從網(wǎng)上搜到了數(shù)據(jù)集為MNIST數(shù)據(jù)集,是一個入門的基本數(shù)據(jù)集。
關(guān)于libsvm的介紹和使用參考:libSVM介紹。不過,svm-toy是最多支持三分類的,而不是只是二分類。
使用windows文件夾下的svm-train.exe,svm-predict.exe命令可以來進(jìn)行建模和預(yù)測,具體參數(shù)看文檔。
svm-train的主要可選參數(shù)有:
-s 選擇SVM類型。一般選的是C-SVM
-c 選擇松弛變量的權(quán)重系數(shù)。C越大,對松弛變量的懲罰越大,兩個支持向量直線之間的間隔就越小,模型就越精確苛刻,對噪聲數(shù)據(jù)點(diǎn)容忍小,越容易過擬合;C越小,兩個支持向量直線之間的距離越大,對噪聲的容忍能力就越大,最終效果越好。但是,模型分錯的數(shù)據(jù)點(diǎn)就越多,容易欠擬合。
-t 選擇核函數(shù)。一般是線性和RBF做對比,線性速度更快,但要求數(shù)據(jù)可分;RBF更通用,默認(rèn)選擇RBF。
-g garma系數(shù)。是exp(-gamma*|u-v|^2),相當(dāng)于gamma=1/(2τ^2)。τ表示高斯函數(shù)中的寬度,g與τ成反比。g越大,τ越小,則高斯函數(shù)越窄,覆蓋面積小,這樣需要的支持向量越多,模型越復(fù)雜,容易過擬合。
-wi 對樣本分類的權(quán)重分配。因?yàn)?#xff0c;在分類中,某些分類可能更加重要。
-v 交叉驗(yàn)證的參數(shù)。用來做交叉檢驗(yàn)。
svm-predict只有一個可選參數(shù),一般也不用。
2. 數(shù)據(jù)處理
從MNIST官網(wǎng)下載,解壓,按照其中的數(shù)據(jù)格式對byte數(shù)據(jù)進(jìn)行讀取,提取到了train和test的圖片灰度數(shù)據(jù)。圖片均為28*28像素。其中,train數(shù)據(jù)為60000張,test數(shù)據(jù)10000張。 先使用svm測試了一下1000個數(shù)據(jù),結(jié)果發(fā)現(xiàn)效果很差!只有11%左右的正確率。經(jīng)過檢查和實(shí)驗(yàn),發(fā)現(xiàn)是沒有對原始數(shù)據(jù)進(jìn)行scale,可能導(dǎo)致數(shù)據(jù)差距過大,從而對結(jié)果產(chǎn)生影響。? 實(shí)驗(yàn)記錄如下: 使用SVM在MNIST的十分類,在不對圖像灰度數(shù)據(jù)進(jìn)行scale的情況下,即:直接使用圖像的像素值進(jìn)行建模,最終得到只有11%左右的正確率,相當(dāng)于十分之一。檢查predict結(jié)果驗(yàn)證,發(fā)現(xiàn)predict都預(yù)測為1(這樣差不多正好是十分之一的正確率)。因此,猜測數(shù)據(jù)若相差過大的情況下,不進(jìn)行scale會嚴(yán)重影響SVM的性能。 閱讀libsvm的文檔后,將圖像灰度數(shù)據(jù)scale到[0,1]之間,之后再使用小數(shù)據(jù)集測試得到80%+的正確率。使用c=2,其他參數(shù)默認(rèn)的情況下,對train_60k_scale.txt數(shù)據(jù)集進(jìn)行建模,對test_10k_scale.txt測試數(shù)據(jù)集進(jìn)行驗(yàn)證,得到95.02%的正確率。
使用./tools/grid.py方法(需修改內(nèi)容參數(shù),參看:libsvm 使用介紹),使用文檔中的方法對1k的測試數(shù)據(jù),對c和g都以(-10,10,1)為參數(shù)來尋找最優(yōu)參數(shù)(實(shí)際上即是grid.py使用交叉驗(yàn)證法來尋找),最終得到最優(yōu)參數(shù)為:c=4.0 g=0.015625 rate=91.1。按照該參數(shù)進(jìn)行設(shè)定、使用train_60k_scale.txt數(shù)據(jù)集訓(xùn)練SVM模型,并對test_10k_scale.txt測試數(shù)據(jù)集進(jìn)行驗(yàn)證,最終得到98.46%的正確率! 最終訓(xùn)練出來的SVM模型參數(shù)如下: svm_type c_svc
kernel_type rbf
gamma 0.015625
nr_class 10
total_sv 12110
rho -0.409632 -0.529655 -0.842478 -0.567781 -0.125654 -0.34742 -0.696415 -0.191642 -1.4011 -0.0458988 -0.303381 0.0614391 0.420461 0.266255 -0.0264913 0.0878689 0.0784119 0.167691 0.0910791 0.577181 0.395401 0.0896789 0.381334 0.134266 -0.0137303 0.902749 0.779241 0.120543 0.203025 -0.523485 0.3886 0.468605 -0.14921 1.10158 -0.320523 -0.120132 -0.656063 -0.44432 -0.925911 -0.421136 -0.176363 -1.16086 0.0610109 0.0764374 -0.192982
label 5 0 4 1 9 2 3 6 7 8
nr_sv 1466 843 1229 516 1531 1419 1373 948 1101 1684
可以看出,在這60000個訓(xùn)練模型樣本中,最終使用的支持向量有12110個。
3. 模型解釋
對于支持向量模型中的參數(shù)解釋,使用二分類的結(jié)果比較好解釋,如下: svm_type c_svckernel_type linear 使用線性分類器
nr_class 2 二分類
total_sv 15 支持向量個數(shù)
rho 0.307309
label 1 -1
nr_sv 8 7 正負(fù)類的支持向量(SV)個數(shù)
SV
1 1:7.213038 2:0.198066?
1 1:-4.405302 2:0.414567?
1 1:8.380911 2:0.210671?
1 1:3.491775 2:0.275496?
1 1:-0.926625 2:0.220477?
1 1:-2.220649 2:0.406389?
0.4752011717540238 1:1.408517 2:0.377613?
0.4510429211309505 1:-8.633542 2:0.546162?
-1 1:8.869004 2:-0.343454?
-1 1:7.263065 2:-0.239257?
-1 1:-4.2467 2:0.057275?
-0.9262440928849748 1:0.755912 2:-0.225401?
-1 1:-9.495737 2:-0.027652?
-1 1:9.100554 2:-0.297695?
-1 1:-3.93666 2:-0.047634?
支持向量分三種:對于正類數(shù)據(jù):C(也就是參數(shù)-c:C設(shè)置的值)表示邊界內(nèi)的支持向量、0<x<C表示邊界上的支持向量(即:在wx+b=±1和wx+b=0之間的支持向量)。對于負(fù)類數(shù)據(jù)也同理。支持向量機(jī)就主要是根據(jù)這兩類支持向量來建立模型的。對于第三類數(shù)據(jù),也就是錯分?jǐn)?shù)據(jù),他們的位置是在支持向量的平面之外,也就是在另一類的區(qū)域,并且|wx+b|>1。這一類的點(diǎn),在訓(xùn)練數(shù)據(jù)時并不存在,因此,不會出現(xiàn)在支持向量SV中。
總結(jié)
以上是生活随笔為你收集整理的使用libsvm对MNIST数据集进行实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。