实操项目 2——肿瘤分类与预测(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.模型评估。
实验过程
1.对该题目的理解
本项目是对美国威斯康星州的乳腺癌诊断数据集进行分类,该数据集包括569个病例的数据样本,每个样本具有30个特征值,而样本共分为两类:分别是恶性和良性,我们要利用热力图来选取特征,然后配置模型,创建SVM分类器,训练模型,并对该模型进行评估和预测。
2.实现过程
(1)导入包
代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import svm
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler#预处理数据
(2)加载数据集,然后查看样本特征和特征值和样本特征值的描述信息
代码如下:
data=pd.read_csv("data/data74924/data.csv")
feature_names=data.columns
print(feature_names)
data.info()
(3)进行数据清洗(如删除无用列,将诊断结果的字符标识 B、M 替换为数值 0、1 等)
代码如下:
#drop方法有一个可选参数inplace,表明可对原数组作出修改并返回一个新数组。
#删除无用列的id
data.drop('id',axis=1,inplace=True)
#将诊断结果diagnosis的字符标识B,M替换为数值0,1等
data['diagnosis']=data['diagnosis'].map({'M':1,'B':0})
data.info()
#后面30个字段可以分成3组
#将mean(平均值),se(标准误差),worst(最坏值)分组
feature_mean=list(data.columns[1:11])
feature_se=list(data.columns[11:21])
feature_worst=list(data.columns[21:31])
(4)进行特征选取(方便后续的模型训练)。用热力图呈现features_mean字段之间的相关性,从而选取特征。
代码如下:
#构建热力图
corr=data[feature_mean].corr()
plt.figure(figsize=(10,6))
sns.heatmap(corr,annot=True)
#annot为True表示在表格中显示数据
#If True, write the data value in each cell.
#If an array-like with the same shape as data, then use this to annotate the heatmap instead of the raw data.
#根据热力图进行特征选择
#特征选择的目的是降维,用少量的特征代表数据的特性,这样也可以增强分类器的泛化能力,避免数据过拟合。
#可以从相关性大的的每类属性中任意选一个作为代表,
#所以从mean、se、worst中选择mean,从radius_mean、perimeter_mean 、 area_mean中选择radius_mean
#以及从compactness_mean、concavity_mean、concave_points_mean中选择compactness_mean,这样就可以把原来的10个属性缩减为6个属性
feature_remain = ['radius_mean','texture_mean', 'smoothness_mean','compactness_mean','symmetry_mean', 'fractal_dimension_mean']
(5)进行数据集的划分(训练集和测试集),抽取特征选择的数值作为训练和测试数据
代码如下:
train,test=train_test_split(data,test_size=0.2)#20%为测试集,80%为训练集
train_X=train[feature_remain]#抽取特征选择的数值作为训练和测试数据
train_y=train['diagnosis']
test_X=test[feature_remain]
test_y=test['diagnosis']
(6)进行数据标准化操作
代码如下:
#在训练数据之前,需要对数据进标准化,让数据处于同一个量级上,避免因为维度问题造成数据误差。
ss=StandardScaler()
train_X=ss.fit_transform(train_X)
test_X=ss.transform(test_X)
(7)配置模型,创建 SVM 分类器,然后训练模型,对模型进行预测,最后模型评估。
代码如下:
from sklearn.metrics import accuracy_score,precision_score
model=svm.SVC()
#8.训练模型。
model.fit(train_X,train_y)
#9.模型预测。
pre_y=model.predict(test_X)
#10.模型评估。
print("准确率:",accuracy_score(test_y,pre_y))
3.遇到的问题及解决办法
(1)问题:如何进行数据清洗?
由于对python不熟悉,通过查询博客等学会如何进行数据清洗,删除无用的数据便于后续的操作。
实验结果
1.加载数据集,然后查看样本特征和特征值和样本特征值的描述信息
进行数据清洗(如删除无用列,将诊断结果的字符标识 B、M 替换为数值 0、1 等)
3. 进行特征选取(方便后续的模型训练)。用热力图呈现features_mean字段之间的相关性,从而选取特征。
4.模型评估
实验总结
1.通过此实验了解了SVM分类算法,学会了如何构建模型,训练模型,评估模型和模型预测。
2.通过此实验,我了解了热力图的原理与画法,了解了在热力图中,颜色越浅代表相关性越大,我们通过热力图找到相关性大的几个属性,每组相关性大的属性只选一个属性做代表。这样就可以把10个属性缩小。
3.学会了如何进行数据清洗,删除无用的行或列,如在本实验中,id无实际意义,可以把他删除。
4.学会了在训练数据之前,需要对数据进标准化,让数据处于同一个量级上,避免因为维度问题造成数据误差。