一、實驗目的和內容
(一)實驗目的
1、熟悉支持向量機SVM(Support Vector Machine)模型分類算法的使用。
2、用svm-train中提供的代碼框架(填入SVM分類器代碼)用train.data訓練數據提供的矩陣來訓練參數得到訓練模型model,利用libsvm進行模型的訓練,分類預測等。
3、利用model和svm-train的代碼來分類測試數據集test.data,並報告其分類正確率。
(二)實驗內容
支持向量機將向量映射到一個更高維的空間裡,在這個空間里建立有一個最大間隔超平面。在分開數據的超平面的兩邊建有兩個互相平行的超平面。分隔超平面使兩個平行超平面的距離最大化。假定平行超平面間的距離或差距越大,分類器的總誤差越小。
1、數據預處理(將原始數據格式做一定的處理,轉換成libsvm能夠使用的而數據)
2、訓練數據集的訓練,產生訓練模型。
3、測試數據集的分類預測,觀察分析實驗結果。
二、實驗過程
實驗步驟和詳細實驗內容
(一)實驗步驟
1、對原始數據集進行預處理,將文本數據集轉換成為libsvm能夠使用的數據。
(1)原始數據格式:
條件屬性a |
條件屬性b |
條件屬性c |
條件屬性d |
條件屬性e |
條件屬性f |
條件屬性g |
條件屬性h |
條件屬性i |
條件屬性j |
決策屬性 |
0.006129 |
-0.029258 |
-1.000000 |
-1.000000 |
-1.000000 |
-1.000000 |
-1.000000 |
-1.000000 |
-1.000000 |
-1.000000 |
1 |
(2)數據格式轉換需要:
當數據較少時,可以用formatdatalibsvm輕松地將文本數據轉換成為svm工具使用的數據。使用方法為:
打開train.data然后將數據粘貼到sheet1的單元格中。
再"工具"-->"宏"-->執行下面有一個選項(FormatDatatoLibsvm)-->執行,要選中這個然后運行就可以了 ,這時數據轉換的問題就解決了(如果沒有宏選項,點擊“開始--excel選項---在功能區顯示“開發工具”選項卡”)
可以copy到一個記事本中即可。但是注意在用libsvm的時候要在命令行輸入.txt后綴。
決策屬性 |
條件屬性a |
條件屬性b |
條件屬性c |
條件屬性d |
條件屬性e |
條件屬性f |
條件屬性g |
條件屬性h |
條件屬性i |
條件屬性j |
1 |
1:.006129 |
2:-.029258 |
3:-1 |
4:-1 |
5:-1 |
6:-1 |
7:-1 |
8:-1 |
9:-1 |
10:-1 |
2、將處理好的數據集train.txt通過libsvm包中的svm-train進行訓練,生成訓練模型train.model。
3、利用訓練好的模型對測試數據集test.txt進行分類預測,觀其分類結果和識別正確率。
4、分析得到的實驗結果,思考有什么問題以及改進辦法等。
(二)詳細實驗內容
1、對實驗中給出的數據集train.data進行數據格式轉換,能夠更有效地將文本數據轉換成為svm工具使用的數據。
2、利用1轉換好的數據,通過實驗指導書中給出的通用SVM 軟件包Libsvm建立分類模型,生成訓練模型train.model。
3、利用2所訓練好的模型對測試數據集test.txt進行分類預測,觀察分類結果以及分類正確率。
三、實驗結果
實驗結果數據(如果有評測要求應包括評測結果,例如分類的准確率)
分析:在原始訓練數據集中可以發現,這實際上是一個非均衡數據集,正樣本的數據和負樣本的數據數量偏差十分大,決策屬性1很少,而決策屬性-1較多。
分析:自動選擇最優參數,自動進行歸一化。利用我們生成的模型對測試數據集進行預測,得到的預測准確率為94.3533%。
四、實驗總結
完成試驗后對實驗中的問題進行總結(可包括實驗結果討論及下一步工作)
本次實驗是通過LIBSVM進行模型的構建與預測,使用libsvm進行分類,只需要有屬性矩陣和標簽,然后就可以建立分類模型(model),然后利用得到的這個model進行分類預測了。對數據進行預處理之后,調用相關的軟件包能夠將訓練數據集轉換出訓練模型,並且對測試數據集進行簡單的分類,得到了最后的分類結果。
在實驗過程中也發現了一些問題,就是訓練數據樣板不平衡。這本身是一個二元分類問題,分類器是由訓練數據訓練出來的模型,所以訓練數據肯定會對其造成直接的影響,這里所說的不平衡性就是各個類別的訓練 sample 數目不平衡。比如,在二元分類的情況下在原始訓練數據集中可以發現,這實際上是一個非均衡數據集,正樣本的數據和負樣本的數據數量偏差十分大。因此導致測試的結果分類正確率accuracy只有94.3533%,最后的分類輸出也只有-1了。
通過調研和分析,我收集到一些方法可以解決樣本為非均衡數據集的方法:
1、在兩類正負樣本比例非常不均衡的情況下,就不能再用「分類正確率」(accuracy)來衡量模型性能,而要用少數類的「准確率」(precision)和「召回率」(recall),或者二者的綜合(F1, equal error rate, area under curve 等等)。
2、增加數量較少決策屬性的樣本特征,把少數類的數據復制幾份,並適當加噪聲。這可以增強模型的魯棒性,調整兩類訓練樣本的權重,使得兩類的總權重相等。
3、采樣,選擇每個正樣本的k近鄰,然后在該樣本和近鄰樣本的連線上隨機采樣。
4、數據預處理。基本的目標就是把數據變平衡,常見的方法有over-sample,under-sample,smote等。
總結:
1、支持向量機的關鍵技術:支持向量機性能的優劣主要取決於核函數的選取,所以對於一個實際問題而言,如何根據實際的數據模型選擇合適的核函數從而構造SVM算法.目前比較成熟的核函數及其參數的選擇都是人為的,根據經驗來選取的,帶有一定的隨意性.在不同的問題領域,核函數應當具有不同的形式和參數,所以在選取時候應該將領域知識引入進來.
2、在使用libsvm進行分類訓練時,也要注意正負樣本的均衡問題,我們可以采用上面提到的一些方法進行解決。
3、在接下來需要嘗試將不同的訓練樣本訓練出模型,調整正負樣本的比例,尋找最優參數的設置,提高模型的分類預測正確率。
參考文獻:
[1]姬水旺,姬旺田,支持向量機訓練算法綜述[J],微機發展,14(1),2004。
[2]劉江華,程君實,陳佳品,支持向量機訓練算法綜述[J],信息與控制,31(1),2002。
[3]Libsvm學習筆記(http://mirrorlake.bokee.com/5133582.html)
[4]LIBSVM使用方法及參數設置(http://blog.sina.com.cn/s/blog_60f842960101j5rw.html)