項目二:使用機器學習(SVM)進行基因預測


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).

官網學習資料:

LibSVM學習(一)- 初識LibSVM

libsvm的原理及使用方法介紹(文庫,全面,是對上面博客的總結)

libsvm-2.8程序代碼導讀

libsvm安裝教學(文庫繁體)

 

練手項目(百度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)

SVM - 知乎精華

支持向量機請通俗介紹 高中文化

交叉驗證

深入理解參數選優時交叉檢驗的作用:libsvm交叉驗證(講得很好)

 

歐式空間的基本概念

矩陣的特征值與特征向量

特征空間(特征提取和特征選擇)

決策樹學習筆記整理

SVM入門(一)至(三)Refresh

 

基因注釋概念

基因組注釋介紹  注釋四部分:重復序列;非編碼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()函數詳解

總結經驗

數據版本的控制,很大的問題,有時候只對數據做很小的修改,然后重新跑,改多了,對數據版本的控制的需求就來了,否則時間一久,根本就不知道自己當初每次都做了啥。(重在項目記錄)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM