實戰演練 | 支持向量機預測與調參——前列腺癌腫瘤惡性程度

實戰演練 | 支持向量機預測與調參——前列腺癌腫瘤惡性程度

案例背景

今年上半年,中國與美國分別發布了2017年癌症大數據報告。兩份報告最明顯的區別在於癌症發病率的趨勢:美國癌症發病率隨著藥物研發技術的快速發展穩步下降,而中國的癌症發病率反而在逐漸上升。趨勢圖如下:

中美各癌症發病率趨勢圖

在中國城市地區,男性最容易患肺癌與胃癌,而女性最容易患乳腺癌與胃癌。在美國,肺癌、結直腸癌、前列腺癌與乳腺癌是最常見的四種癌症。前列腺癌依然是美國男性最常見的癌症。但是從1976年以來,美國前列腺癌的發病率下降了超過50%,這也直接導致了美國癌症的總發病率的下降。

美國男性與女性各癌症發病率趨勢圖

有研究發現,美國前列腺發病率的下降與血液前列腺特異抗原(PSA)篩查技術的普及相關聯。對高危人群進行定期PSA篩查有助於及早發現還沒有癥狀的前列腺腫瘤。今天我們就一起從數據的角度來研究一下這個困擾美國男性的疾病。小派會用一份github上的前列腺腫瘤數據,對前列腺腫瘤惡性程度用支持向量機進行預測。

數據源:前列腺腫瘤數據

涉及工具:Python;AtomPai

預計耗時:約20-25分鐘

數據詳情

前列腺腫瘤數據預覽

在利用Atompai進行數據統計之前,我們對數據做了一些基本處理。原始數據有ID, Age(年齡), Race(種族), Dpros, Dcaps, Psa, Vol, GLEASON評分一共8個變數。我們首先刪除了ID,其次對被認為是標籤變數的GLEASON評分(量化評估腫瘤分化程度)做了重新編碼,其規則如下:

GLEASON gscore

0-6 → 1

>6 → 2

在這裡之所以將0-6全部歸為1,是因為這份數據本身幾乎無小於5的GLEASON值,所以我們不再單獨將小於5的值進行歸類。

GLEASON評分

在開始處理數據前,我們也為大家科普一下GLEASON評分的含義。

前列腺腫瘤示圖

Gleason評分是用來評價前列腺癌細胞的分化程度的一個評價體系。一般來說,癌細胞分化越差,腫瘤的惡性程度就越高。前列腺癌Gleason評分區間為2分到10分。評分為2~4分的說明腫瘤分化良好,惡性度較低,5~6分說明腫瘤分化程度為中等,腫瘤為中度惡性,7~10分說明腫瘤分化很差,腫瘤惡性程度高。

所以本次案例中,我們通過設置Gleason為標籤變數,對腫瘤的分化程度進行預測,以此來評判其惡性程度。

搭建模型(Python)

數據統計

從數據統計中我們看到這份數據沒有缺失值,全部為數值型數據。我們首先在Python中利用Sklearn直接建立一個所有參數為默認值的支持向量機。

from sklearn import svmfrom sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)svc = svm.SVC()svc.fit(x_train, y_train)

這樣我們的模型就已經搭建並訓練好了,在代碼中模型為svc,我們再來看看模型效果。

prediction = svc.predict(x_test)from sklearn.metrics import accuracy_scoreprint(accuracy_score(y_test,prediction))

結果如下:

ROC曲線圖

整個預測集的accuracy rate為55%,AUC(曲線下面積)為0.57,ROC(接收機操作特性)曲線如上圖。整體預測效果不好。

模型優化

在進行模型優化之前,我們先回顧一下AtomPai中的數據統計表,發現各個變數之間的均值,標準差的差異很大,整個數據不在同一個衡量區間上,會造成建模時模型對各個變數有偏差(bias)。我們來嘗試一下對自變數數據集進行歸一化是否能提高模型的結果:

x_norm = (x - x.mean()) / (x.max() - x.min())x_train, x_test, y_train, y_test = train_test_split(x_norm, y, test_size=0.3, random_state=0)svc = svm.SVC()svc.fit(x_train,y_train)prediction = svc.predict(x_test)print(%accuracy_score(y_test,prediction))

結果如下:

ROC曲線

果然,accuracy rate和AUC都提升到了0.74,整個模型預測效果大幅度提升。可見,當數據的衡量區間大小差異較大的時候,將他們映射在同一衡量區間上非常重要。

第二步,我們開始進行模型的參數優化,Sklearn中支持向量機模型的所有參數如下:

既然有這麼多參數,如何去找到最好的參數組合呢?Python中有一個GridSearchCV包,不僅可以通過對比結果找到最好的參數組合,同時還可以進行交叉驗證(cross-validation),從而盡量減少過擬合對真實結果的干擾。接下來我們就嘗試用GridSearchCV進行模型調參。

svc = svm.SVC()grid = GridSearchCV(svc, parameters,cv=10)grid.fit(x_train, y_train)best_para = grid.best_estimator_ print(best_para)

由此得到的最好參數組合為:

最後再來檢驗一下這個參數組合對整個模型結果的提升效果:

ROC曲線

最終測試集的準確率(accuracy rate)為79%,AUC(曲線下面積)為0.79。模型效果提升5%,效果明顯。

我們將整個建模與優化的過程總結為下:

搭建原始模型,作為對比 → 數據預處理 → 模型調參優化 → 對比最終效果

那麼,這是不是就是最好的預測結果了呢?若想有更好的預測效果,可以通過其他手段進一步優化模型。小派的建議是:

1. 檢查數據分布與線性關係,選擇最適合該數據的模型

2. 搭建深度學習模型進行訓練

那麼,如何能快速高效地找到最適合數據的模型並進行模型優化呢?其實,AtomPai平台的【智能建模】功能可以完美地解決這個問題,數據訓練的步驟也十分簡單。

AtomPai搭建模型

AtomPai智能搭建模型

上傳數據後,AtomPai會自動識別所有變數類型,並根據用戶需求做出全自動化歸一化、降維、分布轉換等預處理。

我們點開建模後,將自變數、因變數拖入相應的位置,點擊【開始建模】,將跳出結果如下:

AtomPai模型評分

AtomPai自動測試了最適合這組數據的5個模型,並按F1 score對模型進行了推薦排序,每一個模型都經歷過超參數優化與交叉驗證,總共耗時僅為26秒。

通過結果,我們得知了對這份前列腺腫瘤表現最好的模型為邏輯回歸(Logistic

Regression),其F1值在78.4(根據測試集和訓練集的選取,預測效果會有稍許不同)。

接下來只需保存訓練好的模型,就隨時都可以對新的數據就進行預測。只需要簡單的操作,就可以為你的數據找到最好的模型,並優化出最好的參數組合。

最後,根據上海衛計委的推薦,小派建議大家:

多攝入西紅柿、大豆食品、葡萄、綠茶,可以降低前列腺癌症的發病風險。所以今天的午飯不防點份兒番茄豆腐?

更多內容請關注微信公眾號:"小派看數據"

推薦閱讀:

直腸癌術後應用葛森療法是否有治療效果?
從患者開始談基因檢測的整個流程
肝癌晚期的人,怎麼樣能夠讓他更舒適不痛苦?有什麼可以推薦一下?
市場上為什麼沒有pd-1單抗的仿製葯?
應不應該幫癌症母親解脫?

TAG:癌症 | 數據分析 | 機器學習 |