學習總結分享-libSVM從零開始(1+2)

來源:互聯網
上載者:User

標籤:

感謝林智仁教授,轉載請註明出處

(一)準備工作

LibSVM是什嗎?就我的理解而言,LibSVM是一套工具箱,用來實現SVM的基礎功能。它是開源的,可以深挖,玩轉之後可以借鑒、打散、整合到自己的工程裡。同時,它又非常“初學者向”,它將SVM整合化、黑箱化,對於很多不希望深入研究SVM,但是又需要使用SVM的人來說,libSVM能滿足絕大多數要求。

儘管libSVM是初心者向的,但是它還是需要一些知識儲備的。

如果你沒有接觸過機器學習,最好先瞭解一些基礎知識,以便不至於迷失在一些名詞裡,如訓練train,模型model,預測predict,樣本samples,特徵feature,標籤label等。當然對大多數需要使用libSVM的人來說,這一步驟可以跳過。

如果你沒有接觸過SVM,可以瀏覽一下SVM Tutorial。這篇引導的好處是中英文雙語的且直接和libSVM對接,劣勢是比較淺顯。個人建議多花點時間瞭解SVM,這也許會花費幾天,或更久,但對SVM的理解越深刻,在之後使用libSVM時也會更得心應手。反之,如果很多基礎概念混淆的話,在使用中很有可能會犯些愚蠢的錯誤(這些錯誤則可能會花掉更多的時間)。值得注意的是,目前SVM的入門指導大多數是以“最大間隔”的為切入點直接闡述SVM。但同時,另一條路是從logistic的角度,切入SVM。個人認為,從logistic的角度切入更好(如http://blog.csdn.net/sunlylorn/article/details/7885604),尤其是在評價信賴度的時候。

如果你對SVM有一定瞭解了,但還沒有實踐過,或者第一次接觸libSVM。那A Practical Guide to Support Vector Classification值得閱讀,這篇引導也許會花掉你30min或一下午(根據你的英語水平),然而它能給出一個合理的使用libSVM的總綱。再次強調,有條件的話一定要閱讀該指南。

另外,如果閱讀該指南毫無壓力的話,個人建議直接瀏覽林老師的網站http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 來學習libSVM,如果讀英文實在捉急的話,可以先閱讀本文或其他文章,最後再去讀英文。

最後,libSVM提供了很多平台的版本和功能。本文基於windows 32-bit作業系統,利用libSVM做分類,語言上使用matlab+C混編。文中會零星總結、分享一些和libSVM無關,和matlab+C混編的內容,希望有所協助。

(二)第一次使用libSVM

首先,libSVM的是zip file ,下載後解壓就可以得到工具包。解壓後的工具包內有一些檔案夾和一些檔案。之前說過,本文作者在windows下使用matlab+C,所以以後會用到windows檔案夾和matlab檔案夾裡的內容。

我們先使用windows的exe執行程式來做個小例子。

(1)首先,我們來自己編譯一下exe程式。當然,你可以用已經編譯好的exe程式,但是,如果已編譯好的程式是64位的,而我們的系統是32位的,那我們就不得不重新編譯了(註:最新版本的liblinear1.96就是64位的)。編譯方法:a)開啟dos命令列視窗,定位到liblinear目錄下。如果VC++的環境變數還沒設定,敲入以下命令來實現: "C:\Program Files\Microsoft VisualStudio 10.0\VC\bin\vcvars32.bat" (根據具體的安裝路徑調整命令);b)輸入nmake -f Makefile.win clean all。方法來源http://blog.csdn.net/zouxy09/article/details/10947323。

編譯好了exe程式,再確保你明白了一些機器學習的基礎名詞,然後我們可以開始了。

(2)訓練階段。例子中的訓練是利用windows檔案夾下的svm-train.exe,訓練一個分類器。可以把這個exe看做一個函數,輸入是我們標記好類別的特徵檔案,輸出就是分類器模型檔案。請用記事本開啟libsvm根目錄下的heart_scale檔案,如果你閱讀了SVM Tutorial,下面的東西應該很熟悉了。

我們仔細看看,這個檔案是這樣的結構 :

"+1”或"-1”  1:一個數   2:一個數   3:一個數 … 13:一個數

有些時候,1~13之間會有幾個數沒有,比如第一個輪迴:

+1 1:0.708333 2:1 3:1 4:-0.320755 5:-0.105023 6:-1 7:1 8:-0.419847 9:-1 10:-0.225806 12:1 13:-1

它沒有11:一個數,這等價於11後面的數是0,即11:0。之所以這樣是為了讓稀疏的特徵少佔點空間。

從這個例子出發,我們可以更好地理解特徵檔案的結構:

[label] [index1]:[value1] [index2]:[value2] …

[label] [index1]:[value1] [index2]:[value2] …

Label 就是說class(屬於哪一類,剛才的+1或-1), 就是你要分類的種類,通常是一些整數。

index 是有順序的索引,通常是連續的整數。就是指特徵編號(剛才的1~13),必須按照升序排列

value 就是特徵值(剛才的冒號後面的小數),用來 train 的資料。

訓練前我們要做的無非是選一個好特徵,然後把特徵按格式寫好。

(3)訓練。比較簡便的做法是寫一個bat來調用exe(因為我們要輸入一些參數)。進入windows檔案夾,建立一個txt,在txt裡寫如下內容:

svm-train.exe  ../heart_scale  ../heart_scale_model

pause

儲存關閉txt後把txt尾碼名改為bat,雙擊就可以使用了。

由於bat用的人不多,這裡囉嗦一下它的意義。 第一行svm-train.exe是調用本目錄(bat所在目錄)下的svm-train.exe, ‘../’代表本目錄的上級目錄,heart_scale就是剛才看的那個亂糟糟的特徵檔案,’../heart_ scale _model’就是輸出到上級目錄的heart_scale_model檔案,最後第二行的pause是運行完svm-train.exe,命令列暫停(沒有這個命令的話,命令列會一閃而逝,很多東西就看不見鳥)。

至於為什麼格式是svm-train.exe  +  特徵檔案 + 儲存檔案, 請閱讀SVM Tutorial。

(4)預測。和訓練類似,我們也是寫一個bat,不過此時的內容改為:

svm-predict.exe  ../heart_scale  ../heart_scale_model ../heart_scale_model_rst

pause

這個bat就是用剛才的 model,預測heart_scale,並將結果輸入到heart_scale_model_rst。你發現了,我們用的是heart_sacle訓練的模型,再用模型檢測它自己,理論上結果應該棒棒噠,不過看一下命令列,預測程式給出的Accuracy = 86.6667% (234/270)。同時,更具體的輸出結果儲存為heart_scale_model_rst,用記事本開啟可以看到每一行有一個數,這個數代表了預測的類別。順便一提,這裡我們預測heart_scale,就是用heart_scale裡每一個樣本的特徵帶入model,得到的預測結果heart_scale_model_rst和heart_sacle裡特徵對應的label作比較,看是否一致。

總結一下,libSVM的訓練其實就是,搜集樣本->標記label->提取特徵->寫特徵檔案->調用train.exe->得到model,這個model可以用來判斷新的未知label的特徵到底應該屬於哪一個label。

最後,這個分類效果並不理想,至於原因和解決方案我們之後再說。

學習總結分享-libSVM從零開始(1+2)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.