機器學習識別cfDNA
最近在學習機器學習,研究了使用機器學習識別cfDNA序列特徵的項目:CfdnaPattern,它使用scikit-learn實現,這裡分享出來,希望給大家帶來啟發。
一般一個機器學習的過程可以粗略分為兩步:
訓練模型
選擇預測變數(feature)和模型
數據預處理:比如要不要做 data scale,使不同變數的單位量級統一;需不需要數據降維,以消除變數之間可能存在的冗餘,減少計算量
數據拆分:通常把數據分成訓練數據和測試數據,前者用於模型訓練和評估,很多時候又細分成訓練數據和驗證數據(validate data,確認參數調整優化後結果是否有提升);後者用於最終評估模型的表現。
使用模型:將模型用於實際數據
cfDNA(cell-free DNA,細胞遊離DNA)是細胞程序性死亡而釋放到血液中的一類DNA片段,通常由一類特殊物質包被(核小體),因而一般長度固定,可以用來監測人體的狀態,這也是近年來大火的液體活檢的研究對象。
首先是預測變數的選取,序列一般是由「ATCG」四種鹼基組成,每一條序列都是如此。很自然就會想到,可以統計序列每個位點4種鹼基的比例(ratio),這樣就得到我們要的,可以代表序列特徵的變數。作者實際上也是這樣做的,統計reads上1-10位「ATCG」的比例,由於前1000條reads測序質量不穩定,如果輸入reads足夠,統計時跳過前1000條,如果不足,再回頭統計這部分reads。這部分對應的就是選擇預測變數和數據預處理。
def preprocess(options): #數據特徵提取,預處理函數 data = [] samples = [] fq_files = get_arg_files() number = 0 for fq in fq_files: number += 1 extractor = FeatureExtractor(fq) extractor.extract() feature = extractor.feature() #對於reads足夠多的樣本,統計了1001-10000範圍的reads上『ATCG』的比例,這裡是通過作者自己寫的FeatureExtractor這個類實現的 if feature == None: continue data.append(feature) #將每一個樣本的鹼基比例信息保存到data列表 samples.append(fq)
訓練的演算法,可有多種選擇,包括K近鄰、SVM、隨機森林等,項目自帶訓練好的模型,使用的是第一種。使用的訓練數據有:
陽性: 真實的cfDNA序列
陰性:基因組DNA序列和FFPE樣本測序數據
以上數據在文件名中分別標明(如cfdna/ffpe/gDNA)。訓練完成後,使用Python的pickle模塊把結果保存,以備以後預測使用。
結果的準確度,可能這也是大家很關心的問題,當然我也不例外。我從SRA隨便挑了一個cfDNA的樣品,SRX1591729測試結果是符合的,除了預測結果,還會畫鹼基比例分布圖,如果同時做了非cfDNA樣本的預測,放在一起看會發現明顯不同的分布模式。
更多準確度的信息,軟體的作者沒有給出,這裡憑我自己的理解給出提高準確度的一些方向:
採用更多的訓練數據,把對reads的掃描範圍延長(比如0-30)
預測時增加統計的reads數(比如2w-5w)
沿著這個思路,其實還可以做更多有意思的分類,比如甲基化和RNA,動植物和微生物可能都有獨特的鹼基分布模式,但是也要注意,不同測序平台可能對鹼基分布模式也有一定影響。
參考:OpenGene/CfdnaPattern
本文同步發佈於知乎和公眾號JackTalk
http://weixin.qq.com/r/tETI0BDESU02rVSz9xGm (二維碼自動識別)
推薦閱讀:
※梯度下降法求解logisitic回歸及其python代碼實現
※數學 · 神經網路(二)· BP(反向傳播)
※Python · 神經網路(三*)· 網路
※【啄米日常】3:一個不負責任的Keras介紹(下)
※CTR預估[四]: Algorithm-LR Bias和Q分布