机器学习实验之肿瘤分类与预测(SVM)
肿瘤分类与预测(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)的数字化图像计算出来的。它们描述了图像中细胞核的特征。
特征值很多,涉及一定的医学知识。(具体特征及含义见此节实验指导书)
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()
# 特征选择
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!