1. 程式人生 > >【機器學習】基於機器學習的乳腺癌預測模型

【機器學習】基於機器學習的乳腺癌預測模型

基於機器學習的乳腺癌預測模型(附Python程式碼)

前提說明

此部落格內容為2018年山東省人工智慧大賽曲阜師範大學青春夢想隊所創作,未經授權,禁止使用。

專案介紹

這個專案是針對乳腺癌進行分類的一個專案,使用的乳腺癌資料集,具有如下特點:
①所以特徵數字都是數字,不需要考慮如何匯入以及如何處理資料
②特徵列第一列為使用者ID資訊,不參與此次機器學習模型構建
③這是一個分類問題,可通過有監督學習演算法來解決問題,這是一個二分類問題,無需進行特殊處理
④所有特徵的數值採用相同的單位,即特徵按照程度劃分為1~10,無需進行尺度的轉換
⑤在某些特徵列資料缺失,需要進行資料缺失處理
接下來,我們會對這一些特點進行分析,以下為相關步驟:
①匯入資料
②概述資料並進行資料缺失處理
③資料視覺化
④評估演算法
⑤實施預測

匯入資料

首先,需要匯入專案所需的類庫和資料集,類庫包括numpy、pandas、sklearn、matplotlib庫,資料集為之前介紹的乳腺癌資料集,在這裡將採用Pandas來匯入資料。在接下來的部分將採用Pandas來對資料進行描述性統計分析和資料視覺化。需要注意的是,在匯入資料時,給每個資料特徵設定了名稱,進一步解決了在醫療上名稱過長的問題,這有助於後面對資料的展示工作。

概述資料

接下來對資料我們做一些理解,以便於選擇合適的演算法,我們會通過以下幾個角度審查資料,並附上概述結果:
I.資料的維度
II.檢視資料自身及其描述
III.統計描述所有的資料特徵
IV.資料分類分佈
以下為概述結果:
資料的維度概述結果:
在這裡插入圖片描述


檢視資料自身及其描述概述結果:
在這裡插入圖片描述
統計描述所有的資料特徵概述結果:
在這裡插入圖片描述
資料分佈情況概述結果:
在這裡插入圖片描述

資料視覺化

我們對我們所處理的資料有了基本的瞭解,將通過圖表來檢視資料的分佈情況和資料不同特徵直接的相互關係,其中單變數圖表更好地理解每一個特徵屬性,多變數圖表來理解不同特徵屬性的關係。
3.1箱線圖
首先從單變數圖表開始顯示每一個單獨的特徵屬性,因為每個特徵屬性都是數字,因此我們可以通過箱線圖來展示的屬性和與中位值的離散速度,其執行結果如下:
在這裡插入圖片描述

3.2直方圖
接下來通過直方圖來顯示每個特徵屬性的分佈狀況,在輸出的圖表中,我們看到特徵符合高斯分佈,執行結果如下:
在這裡插入圖片描述
3.3散點矩陣圖
接下來通過多變數圖表來看一下不同特徵屬性之間的關係。在這裡我們通過散點矩陣圖來檢視屬性的倆倆之間的影響關係。
在這裡插入圖片描述

評估演算法

我們會通過六種不同的演算法來建立模型,並評估他們的準確度,以便於我們找到合適的演算法。我們會通過以下步驟進行:
I. 分離出評估資料集。
II. 採用10交叉折驗證來評估演算法模型。
III. 生成5各不同的模型來預測新資料。
IV. 選擇最優模型。
4.1分離出評估資料集
建立的模型是否足夠好。後面我們會採用統計學的方法來評估我們建立的模型。但是,我們更想實際看一下我們的模型對真實的資料的準確度是什麼情況,這是我們要保留一部分資料用來評估演算法模型的主要原因。我們將會按照80%的訓練資料集,20%的評估資料集來分離資料。於是就分離出了X_train,y_train用來訓練演算法建立模型,X_validation,y_validation在後面用來驗證評估模型。
4.2評估模型
在這裡將通過10折交叉驗證來分離訓練資料集,並評估演算法模型的準確度。10折交叉驗證是隨機的將資料分成10份,8份用來訓練模型,2份用來評估演算法。在接下來的部分,將會對每一個演算法,使用相同的資料進行訓練和評估,並從中選擇最好的模型。
4.3建立模型
我們不知道哪個演算法對這個問題比較有效。通過前邊的圖表,我們發現有些資料特徵線性分佈,所有可以期待演算法會得到比較好的結果。接下來評估6種不同的演算法:
· 線性迴歸(LR)
· 線性判別分析(LDA)
· k近鄰(KNN)
· 分類與迴歸樹(CART)
· 貝葉斯分類器(NB)
· 支援向量機(SVM)
這個演算法列表中包含了線性演算法(LR、LDA),非線性演算法(KNN、CART、NB、SVM)。在每次對演算法進行評估前都會重現設定隨機數的種子,以確保每次對演算法的評估採用相同的資料集,保證對演算法評估的公平性。接下來就建立並評估這六種演算法模型。
4.4選擇最優模型
現在我們有6各模型,並且評估了它們的精確度。我們需要比較這六個模型,並從中選出準確度最高的演算法。執行程式碼結果如下:
在這裡插入圖片描述
選擇最優模型執行結果
通過以上結果,我們會發現,針對乳腺癌預測模型,我們選擇KNN(非線性演算法)的準確度相對於其他演算法更高,為了進一步比較演算法之間的優劣關係,我們製作了演算法比較的箱線圖,其結果如下:
在這裡插入圖片描述
由此我們可以最終得出結論,選擇KNN演算法其準確度最高,模型最優。

實施預測

評估的結果顯示,支援KNN演算法是準確度最高的的演算法。現在我們需要使用我們預留的評估資料集來驗證這個演算法模型。接下來我們可以使用我們得出的KNN的演算法模型,並用評估資料集給出一個演算法模型的報告。
執行程式碼,我們會看到其準確度為0.97。通過觀察衝突矩陣,我們發現對於乳腺癌良性及惡性症狀型別,每個分類僅有兩例預測錯誤,其下為其準確度、召回率、F1值的資料。
在這裡插入圖片描述

程式碼

# 匯入類庫
from pandas import read_csv
import pandas as pd
from sklearn import datasets
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import LogisticRegression

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns #要注意的是一旦匯入了seaborn,matplotlib的預設作圖風格就會被覆蓋成seaborn的格式

import numpy as np



#breast_cancer_data = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',header=None
#                               ,names = ['C_D','C_T','U_C_Si','U_C_Sh','M_A','S_E_C_S'
#                                        ,'B_N','B_C','N_N','M','Class'])
breast_cancer_data = pd.read_csv('breast_data.csv',header=None
                               ,names = ['C_D','C_T','U_C_Si','U_C_Sh','M_A','S_E_C_S'
                                        ,'B_N','B_C','N_N','M','Class'])
#列印資料
print(breast_cancer_data)

#檢視維度
print('檢視維度:')
print(breast_cancer_data.shape)
#檢視資料
print('檢視資料')
breast_cancer_data.info()
breast_cancer_data.head(25)

#資料統計描述
print('資料統計描述')
print(breast_cancer_data.describe())
#資料分佈情況
print('資料分佈情況')
print(breast_cancer_data.groupby('Class').size())

#缺失資料處理
mean_value = breast_cancer_data[breast_cancer_data["B_N"]!="?"]["B_N"].astype(np.int).mean()
breast_cancer_data = breast_cancer_data.replace('?',mean_value)
breast_cancer_data["B_N"] = breast_cancer_data["B_N"].astype(np.int64)

#資料的視覺化處理
    #單變數圖表
    #箱線圖
breast_cancer_data.plot(kind='box',subplots=True,layout=(3,4),sharex=False,sharey=False)
pyplot.show()
    #直方圖
breast_cancer_data.hist()
pyplot.show()
#多變數的圖表
    #散點矩陣圖
scatter_matrix(breast_cancer_data)
pyplot.show()


#評估演算法
    #分離資料集
array = breast_cancer_data.values
X = array[:,1:9]
y = array[:,10]

validation_size = 0.2
seed = 7
#train訓練,validation驗證確認
X_train,X_validation,y_train,y_validation = train_test_split(X,y,test_size=validation_size,random_state=seed)

    #評估演算法(演算法審查)
models = {}
models['LR'] = LogisticRegression()
models['LDA'] = LinearDiscriminantAnalysis()
models['KNN'] = KNeighborsClassifier()
models['CART'] = DecisionTreeClassifier()
models['NB'] = GaussianNB()
models['SVM'] = SVC()



num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,random_state=seed)

    #評估演算法(評估演算法)
results = []
for name in models:
    result = cross_val_score(models[name],X_train,y_train,cv=kfold,scoring='accuracy')
    results.append(result)
    msg = '%s:%.3f(%.3f)'%(name,result.mean(),result.std())
    print(msg)
    #評估演算法(圖示顯示)
fig = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()


#實施預測
#使用評估資料集評估演算法
knn = KNeighborsClassifier()
knn.fit(X=X_train,y=y_train)
predictions = knn.predict(X_validation)

print('最終使用KNN演算法')
print(accuracy_score(y_validation,predictions))
print(confusion_matrix(y_validation,predictions))
print(classification_report(y_validation,predictions))


參考

https://read.douban.com/reader/column/6939417/chapter/35867190/#
https://blog.csdn.net/ruoyunliufeng/article/details/79369142

如有侵權,請及時聯絡。