Skip to content

肿瘤分类与预测(SVM)

【实验内容】

采用SVM方法,对美国威斯康星州的乳腺癌诊断数据集进行分类,实现针对乳腺癌检测的分类器,以判断一个患者的肿瘤是良性还是恶性。

【实验要求】

参考实现步骤:(具体实现可以不同)

1.加载data文件夹里的数据集:威斯康星乳腺肿瘤数据集(数据集路径:data/data74924/data.csv)。

2.查看样本特征和特征值,查看样本特征值的描述信息。

3.进行数据清洗(如删除无用列,将诊断结果的字符标识B、M替换为数值0、1等)。

4.进行特征选取(方便后续的模型训练)。用热力图呈现features_mean字段之间的相关性,从而选取特征。
  
  注:(1)热力图中,颜色越浅代表相关性越大。
  
     (2)通过热力图找到相关性大的几个属性,每组相关性大的属性只选一个属性做代表。这样就可以把10个属性缩小。

5.进行数据集的划分(训练集和测试集),抽取特征选择的数值作为训练和测试数据。

6.进行数据标准化操作(可采用Z-Score规范化数据)。

7.配置模型,创建SVM分类器。

8.训练模型。

9.模型预测。

10.模型评估。

【数据集】:威斯康星乳腺肿瘤数据集

该数据集中肿瘤是一个非常经典的用于医疗病情分析的数据集,包括569个病例的数据样本,每个样本具有30个特征。

样本共分为两类:恶性(Malignant)和良性(Benign)。

该数据集的特征是从一个乳腺肿块的细针抽吸(FNA)的数字化图像计算出来的。它们描述了图像中细胞核的特征。

特征值很多,涉及一定的医学知识。(具体特征及含义见此节实验指导书)
python
import numpy as np
import pandas as pd
import seaborn as sn
from jupyterthemes import jtplot

jtplot.style(theme='monokai')  # 选择一个绘图主题
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report  # 导入分类报告模板
from sklearn.naive_bayes import GaussianNB  # 导入先验概率为高斯分布的朴素贝叶斯
from sklearn import svm
from sklearn import metrics
from sklearn.preprocessing import StandardScaler

加载data文件夹里的数据集:威斯康星乳腺肿瘤数据集

python
dataset = pd.read_csv("./datasets/TumorClassify.csv")

查看样本特征和特征值,查看样本特征值的描述信息。

python
print(dataset.info())

<class 'pandas.core.frame.DataFrame'> RangeIndex: 569 entries, 0 to 568 Data columns (total 32 columns):

Column Non-Null Count Dtype


0 id 569 non-null int64 1 diagnosis 569 non-null object 2 radius_mean 569 non-null float64 3 texture_mean 569 non-null float64 4 perimeter_mean 569 non-null float64 5 area_mean 569 non-null float64 6 smoothness_mean 569 non-null float64 7 compactness_mean 569 non-null float64 8 concavity_mean 569 non-null float64 9 concave points_mean 569 non-null float64 10 symmetry_mean 569 non-null float64 11 fractal_dimension_mean 569 non-null float64 12 radius_se 569 non-null float64 13 texture_se 569 non-null float64 14 perimeter_se 569 non-null float64 15 area_se 569 non-null float64 16 smoothness_se 569 non-null float64 17 compactness_se 569 non-null float64 18 concavity_se 569 non-null float64 19 concave points_se 569 non-null float64 20 symmetry_se 569 non-null float64 21 fractal_dimension_se 569 non-null float64 22 radius_worst 569 non-null float64 23 texture_worst 569 non-null float64 24 perimeter_worst 569 non-null float64 25 area_worst 569 non-null float64 26 smoothness_worst 569 non-null float64 27 compactness_worst 569 non-null float64 28 concavity_worst 569 non-null float64 29 concave points_worst 569 non-null float64 30 symmetry_worst 569 non-null float64 31 fractal_dimension_worst 569 non-null float64 dtypes: float64(30), int64(1), object(1) memory usage: 142.4+ KB None

进行数据清洗(如删除无用列,将诊断结果的字符标识B、M替换为数值0、1等)。

python
dataset.drop('id', axis=1, inplace=True)
dataset['diagnosis'] = dataset['diagnosis'].replace(['M', 'B'], ['1', '0'])
features_mean, features_se, features_worst = [], [], []
for feat in dataset.columns:
  if "mean" in feat:
    features_mean.append(feat)
  elif "se" in feat:
    features_se.append(feat)
  elif "worst" in feat:
    features_worst.append(feat)
python
data = dataset.columns[0:11]

进行特征选取(方便后续的模型训练)。用热力图呈现features_mean字段之间的相关性,从而选取特征。

python
# 用热力图呈现features_mean字段之间的相关性
corr = dataset[features_mean].corr()
plt.figure(figsize=(14, 14))
# annot=True显示每个方格的数据
sn.heatmap(corr, annot=True)
plt.show()

python
# 特征选择
features_remain = ['radius_mean', 'texture_mean', 'smoothness_mean', 'compactness_mean', 'symmetry_mean',
                   'concavity_mean']
features_remain

['radius_mean', 'texture_mean', 'smoothness_mean', 'compactness_mean', 'symmetry_mean', 'concavity_mean']

进行数据集的划分(训练集和测试集),抽取特征选择的数值作为训练和测试数据。

python
train, test = train_test_split(dataset, test_size=0.3)
train_x = train[features_remain]
train_y = train['diagnosis']
test_x = test[features_remain]
test_y = test['diagnosis']

进行数据标准化操作(可采用Z-Score规范化数据)

python
ss = StandardScaler()
train_x = ss.fit_transform(train_x)
test_x = ss.transform(test_x)
print(train_x, test_x)

[[ 0.46405817 -1.91589741 0.56970711 0.45329675 -0.07765649 0.38739097] [ 1.98818207 0.30478251 0.04971252 0.22851059 -0.90501621 0.86270989] [-1.24171179 -0.24798414 -1.8560049 -1.47660125 -0.54889181 -1.09844847] ... [-0.53499512 -0.2960508 -0.26604826 -0.6008416 -0.39780873 -0.55052178] [-1.22269571 0.16538918 0.43726881 -0.94055875 -1.63884831 -1.01325285] [ 2.88222123 0.22787585 3.38576358 3.29575407 3.05551881 4.22612143]] [[-0.26820248 -0.94014411 -0.15940058 -0.36100926 0.05903773 0.06090552] [-1.43414307 -0.08455748 0.24767293 1.67330554 1.88642355 1.36547504] [-0.3590255 -0.84641412 -0.39918361 -0.40252219 -0.36183657 -0.37049942] ... [-1.19743556 -0.4763008 0.8903472 -0.59050868 0.46192594 -0.8793776 ] [-1.28513654 -0.80315412 -0.80068077 -1.16063166 -0.91580786 -0.89235218] [-0.08087999 1.08105915 2.52142942 1.30349604 1.60224347 0.8452441 ]]

配置模型,创建SVM分类器

python
model = svm.SVC()

训练模型

python
model.fit(train_x, train_y)

SVC()

模型预测

python
prediction = model.predict(test_x)

模型评估

python
print('准确率: ', metrics.accuracy_score(prediction, test_y))

准确率: 0.9649122807017544