SVM軟件包
LIBSVM -- A Library for Support Vector Machines(本項目所用到的SVM包)(目前最新版:libsvm-3.21,2016年7月8日)
C-SVC(C-support vector classification), nu-SVC(nu-support vector classification), one-class SVM(distribution estimation), epsilon-SVR(epsilon-support vector regression), nu-SVR(nu-support vector regression).
官網學習資料:
- A practical guide to SVM classification(guide.pdf)(官網有配套練手數據)
- 官網程序壓縮包里的幫助文檔 程序 README 文檔(核心); 以及 FAQ.html(常見問題){每個單獨模塊都有 README 文檔}
- libsvm官方下載鏈接(有時首頁的下載鏈接打不開)
libsvm的原理及使用方法介紹(文庫,全面,是對上面博客的總結)
libsvm安裝教學(文庫繁體)
- gnuplot安裝及使用(Linux)
- Linux下使用Libsvm
練手項目(百度libsvm項目):
說一說我對用LIBSVM進行回歸預測的粗淺認識(整理完成於2012年5.11)
LIBSVM的縮放和結果分析(轉載)
本項目中需要用到預測的概率,所以在訓練和預測時,均要加上-b參數。
>svm-train.exe -b 1 scaled_1 scaled_1_model
>svm-predict.exe -b 1 test_1 scaled_1_model scaled_1_output_file
我們還更改了流程化腳本easy.py和grid.py:
主要為了解決交叉檢驗的效率,參數選優的效率(內存和並行),以及概率輸出。
我做的工作:
曹老師給了我原始數據(正負訓練集,測試集),我首先寫perl腳本,進行格式轉換;轉化為libsvm可用的格式;
其次搞懂libsvm的使用,主要是scale、train、predict,比較簡單;其中scale必須保證縮放規則相同,-s,-r;train選c-svc,內核選RBF,-b概率輸出;predict就是-b概率預測就好了;整個流程都被寫在easy.py腳本里了,看懂腳本,對命令做簡單的修改,就可以一步執行了;其中參數選優最為耗時,需適當修改grid.py腳本。
最后,我還做了one-class的建模和預測;這個沒有參數尋優的腳本,也不支持概率輸出,所以我就選了幾個參數試了試;其中-n非常重要。
后續工作:
accuracy、sensitivity、specificity等統計指標的分析
用coreset來限制訓練集,建立模型,來預測訓練集中其他的部分;
SVM基礎知識
支持向量機通俗導論(理解SVM的三層境界)(全) (分3章,文章末尾有很多SVM的學習資料)
Coursera的ML視頻:Machine Learning - 第7周(Support Vector Machines)
深入理解參數選優時交叉檢驗的作用:libsvm交叉驗證(講得很好)
基因注釋概念
基因組注釋介紹 注釋四部分:重復序列;非編碼RNA;基因結構;功能注釋。
真核基因組注釋方法與流程的文章 : A beginner's guide to eukaryotic genome annotation
轉座子 - 可移動的遺傳因子, 一段DNA順序可以從原位上單獨復制或斷裂下來,環化后插入另一位點,並對其后的基因起調控作用,此過程稱轉座。
coreset
數據前處理
注意:
- 去掉此列95_IsLongerGeneCover(這個特征值會影響預測結果,不需要它,所以除去,很簡單一個last搞定)
- 訓練集正負樣本有嚴重的數量差距,這也會影響訓練和預測的結果的准確度。測試發現:pos = 29778, neg = 2238.
1.我拿到的數據有兩種,一個是用於二分類的數據;一個是用於4分類的數據。
2.二分類的數據曹老師已經幫我提取好了,我只需要處理成libsvm的輸入格式就行;四分類的數據則需要我自己處理,曹老師只給了我總表,已經相應的基因序列號,我需要單獨提取處理出來,轉成libsvm所需的格式。(里面有5個數據,一個總表,另外四種類型的基因數據。總表中,剛剛說的,前5列不用考慮,然后把非數值型轉成數值型再做。如果結果 不好的話,將四種訓練集中的樣本數目降成相當的數目,以免引起偏差。)
3.數據格式處理?這個需要詳細說明
首先,明確libsvm的格式要求,+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 (行末尾有空格);
其次,我們的表格數據里的哪些數據是無用的?非數值列如何轉換為數值型數據?如何合理制作標簽?數據按列進行處理;前5列:1_Chrom 2_GeneID 3_Start 4_End 5_Strand是無用的,因為它們只是基因的基本信息,需要去掉;最后一列是預測目標,需要提到第一列;其他的列數值化比較簡單。
麻煩的是6_Evidence列的處理,根據曹老師要求,根據優先級進行分類,凡是有PROTEIN的歸一類;否則,凡是有cDNA歸一類;否則,凡是有oest的歸一類;否則,凡是有EST的歸一類;其他的歸為最后一類(可能不存在這一類,因為都有證據)。
perl腳本得出的第6列(共15種):
PROTEIN|cDNA|oest AND EST|PROTEIN|cDNA AND PROTEIN|cDNA AND EST|PROTEIN AND EST|PROTEIN|oest AND EST|PROTEIN|cDNA|oest AND PROTEIN AND PROTEIN|oest = 1
EST|cDNA AND cDNA AND cDNA|oest AND EST|cDNA|oest = 2
oest AND EST|oest = 3
EST = 4
perl腳本得出的第8列(共5種):
protein_coding_partial = 1
protein_coding = 2
untranslated = 3
pseudogene = 4
protein_coding_short = 5
參考:
perl 提取文件的指定列
perl split()函數詳解
總結經驗
數據版本的控制,很大的問題,有時候只對數據做很小的修改,然后重新跑,改多了,對數據版本的控制的需求就來了,否則時間一久,根本就不知道自己當初每次都做了啥。(重在項目記錄)