机器学习实验之肿瘤分类与预测(SVM)

肿瘤分类与预测(SVM)

【实验内容】

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

【实验要求】

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

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

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

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

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

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

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

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

8.训练模型。

9.模型预测。

10.模型评估。       

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

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

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

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

特征值很多,涉及一定的医学知识。(具体特征及含义见此节实验指导书)
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文件夹里的数据集:威斯康星乳腺肿瘤数据集

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

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

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等)。

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)
data = dataset.columns[0:11]

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

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

paaanag

# 特征选择
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']

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

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规范化数据)

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分类器

model = svm.SVC()

训练模型

model.fit(train_x,train_y)
SVC()

模型预测

prediction=model.predict(test_x)

模型评估

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

posted @   嘿,抬头!  阅读(961)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示