關於少量數據的多分類問題

問題陳述和分析

     原始數據可以從鏈接中下載,是一關於某項疾病的分類問題,表格中最後一列爲標籤,前面的278列是各項特徵指標。其中標籤爲1 的爲爲患病樣本,標籤爲2——15的爲確定的患病的樣本,標籤爲16的爲不確定的患病樣本。標籤中缺少11、12、13的樣本。對於這類問題首先想到的就是傳統的機器學習方法SVM,再比較新穎的是lasso還有xgboost等方法。對於SVM分類器直接將特徵送入模型中,用不超過70% 的數據訓練,用剩餘的數據進行測試。對於xgboost可以直接進行處理。對於lasso,可以用於特徵降維與特徵選擇,將選擇後的特徵送入xgboost進行學習。整個工程代碼和數據在這裏

SVM 三分類

        因爲從患病和不患病的角度看,這其實就是一個二分類問題,但是考慮到還有一種不確定的心臟病類型,問題可以看成一個三分類問題。首先將數據集分成訓練集和測試集,其中訓練集的樣本數量爲310個,測試集的樣本數量爲142個。

在數據處理的時候將空值置爲0,將label放在數據的第一列,並保存爲csv格式文件。訓練集文件名爲data_two_test.csv,測試集文件爲data_two_test.csv。

訓練過程與測試結果

        整個框架是在tensorflow下進行的,訓練和測試被我寫在一個工程裏,命名爲svm_3_c權值文件保存在model1_1裏。Batch設爲100,迭代次數也是100。Optimizer是梯度下降法。

在迭代100次後學習到的結果如下:

 

測試仍然是每次取100組數據進行測試,取10次最後取平均值。考慮其穩定性繼續做了四次測試,測試精度在0.9附近。可以認爲三分類有較高的精度。

雖然三分類具有較高的精度,但是這並不是我們想得到的結果。想象病人得知自己得了某種確定的疾病,但是還不知道是哪一種確定的疾病,無論是心情還是對於整個治療都沒有什麼幫助。但是三分類對於醫生做進一步的診斷提供了有效且高精度的參考,如果患者得了某種確定的疾病,仍需人工的介入才能得到準確的診斷。

Xgboost + Lasso六分類

慮到xgboost的良好表現試着採用xgboost進行多分類。xgboost的數據需要進行預處理。還有一點就是標籤不平衡問題,爲了解決這個問題,又進行了六分類。六分類主要是考慮到不確定的心臟病類型僅有22個樣本,所以我對確定的心臟病類型的185個樣本重新分組得到六分類的結果。

 

訓練過程與測試結果

xgboost的相關實驗做了四組。第一組實驗是源數據在無特徵降維與選擇下的實驗,第二組是在lasso二分類標籤下特徵選擇後再進行分類,第三組是在lasso三分類標籤下特徵選擇後再進行分類,第四組是lasso六分類標籤下特徵選擇後再進行實驗。這幾個實驗分別在test_exp1、test_exp2、test_exp3、test_exp4文件夾中。

在第二組實驗中,使用特徵從279維降到25維準確率比沒有使用特徵選擇時降低了。第三組實驗中特徵從279維降到30維,準確率有所提高。第四組實驗將特徵維度降低到36維,準確率已經比沒有降低特徵維度要高。所以使用特徵選擇可以有效的提升分類的準確度。

SVM 十三分類

由特徵降維和特徵選擇能有效改善分類結果的啓示,我又將這279個特徵進行了特徵排序,排序用的是ensemble裏的隨機森林迴歸。在此基礎上對svm分類器進行優化。

由於每個score是一個三維向量,我的操作是求得平均值後在進行指數操作,底數是100000,這個數沒有任何含義,只是爲了將每個特徵得分很好的區分開。這樣操作的結果使這279個特徵的得分變換範圍變成0.27-4.13之間。得分最高的特徵是‘V2 R wave amplitude’特徵,得分最低的是‘Height’特徵。

這個小節的實驗將分成兩個部分,一個是沒有進行特徵選擇的svm分類器,一個是進行特徵選擇的svm分類器。

訓練過程與測試結果

實驗一

不進行特徵選的svm13分類器的訓練類似三分類,仍然在tensorflow框架下迭代100次,這裏選擇100次是因爲實驗室電腦比較老的原因。在編程實現要注意幾個維度的變化即可。

測試結果準確率分別是0.86100006、0.796、0.88500005、0.80200005。

實驗二

只提取得分前名的20個特徵進行分類,同樣迭代100次,做四次得到訓練結果如下圖所示。只提取得分前名的20個特徵進行分類,同樣迭代100次,做四次得到訓練結果如下圖所示。

測試結果分別爲0.8549999、0.8809999、0.82、0.857。個人感覺對比不明顯,我將迭代次數從100升至1000。沒有進行特徵選擇,做了兩組實驗結果分別爲0.897、0.866。進行了特徵選擇的結果分別是0.916、0.896我將迭代次數上升至10000次,沒有進行特徵選擇的測試精度分別爲0.872、0.77,進行了特徵選擇的0.878、0.866。

總結

        整個實驗的實現以及完成是在不斷學習和改進的過程中進行的。從前期模型論證,到特徵工程是不斷的實驗論證,改代碼的過程。尤其是最近實驗室換電腦來回折騰耽擱了很多工作,思路也從svm轉移到了xgboost,還有laasso。

        之所以從xgboost又回到svm是因爲做了一些實驗發現精度很難提高,尤其是在svm還保持比較高的精度的前提下,xgboost的精度仍然在0.6左右徘徊時,毅然放棄了使用xgboost方法。

         後來想了想,有一個原因非常重要,就是數據集不夠大。傳統的svm方法在針對小數據集類問題表現非常好,而xgboost相關方法從2014年開始在各大數據挖掘類比賽中表現搶眼,一個關鍵問題就是,比賽中的數據集基本上都是百萬級別的,所以精度不高是情有可原的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章