實戰演練 | 支持向量機預測與調參——前列腺癌腫瘤惡性程度
案例背景
今年上半年,中國與美國分別發布了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))
結果如下:
整個預測集的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))
結果如下:
果然,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)
由此得到的最好參數組合為:
最後再來檢驗一下這個參數組合對整個模型結果的提升效果:
最終測試集的準確率(accuracy rate)為79%,AUC(曲線下面積)為0.79。模型效果提升5%,效果明顯。
我們將整個建模與優化的過程總結為下:
搭建原始模型,作為對比 → 數據預處理 → 模型調參優化 → 對比最終效果
那麼,這是不是就是最好的預測結果了呢?若想有更好的預測效果,可以通過其他手段進一步優化模型。小派的建議是:
1. 檢查數據分布與線性關係,選擇最適合該數據的模型
2. 搭建深度學習模型進行訓練
那麼,如何能快速高效地找到最適合數據的模型並進行模型優化呢?其實,AtomPai平台的【智能建模】功能可以完美地解決這個問題,數據訓練的步驟也十分簡單。
AtomPai搭建模型
上傳數據後,AtomPai會自動識別所有變數類型,並根據用戶需求做出全自動化歸一化、降維、分布轉換等預處理。
我們點開建模後,將自變數、因變數拖入相應的位置,點擊【開始建模】,將跳出結果如下:
AtomPai自動測試了最適合這組數據的5個模型,並按F1 score對模型進行了推薦排序,每一個模型都經歷過超參數優化與交叉驗證,總共耗時僅為26秒。
通過結果,我們得知了對這份前列腺腫瘤表現最好的模型為邏輯回歸(Logistic
Regression),其F1值在78.4(根據測試集和訓練集的選取,預測效果會有稍許不同)。接下來只需保存訓練好的模型,就隨時都可以對新的數據就進行預測。只需要簡單的操作,就可以為你的數據找到最好的模型,並優化出最好的參數組合。
最後,根據上海衛計委的推薦,小派建議大家:
多攝入西紅柿、大豆食品、葡萄、綠茶,可以降低前列腺癌症的發病風險。所以今天的午飯不防點份兒番茄豆腐?
更多內容請關注微信公眾號:"小派看數據"
推薦閱讀:
※直腸癌術後應用葛森療法是否有治療效果?
※從患者開始談基因檢測的整個流程
※肝癌晚期的人,怎麼樣能夠讓他更舒適不痛苦?有什麼可以推薦一下?
※市場上為什麼沒有pd-1單抗的仿製葯?
※應不應該幫癌症母親解脫?