实操项目 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.加载数据集,然后查看样本特征和特征值和样本特征值的描述信息

python实现贝叶斯优化lstm参数 贝叶斯优化svm_python实现贝叶斯优化lstm参数

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

python实现贝叶斯优化lstm参数 贝叶斯优化svm_数据集_02

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

python实现贝叶斯优化lstm参数 贝叶斯优化svm_数据集_03

4.模型评估

python实现贝叶斯优化lstm参数 贝叶斯优化svm_数据集_04

 

实验总结

1.通过此实验了解了SVM分类算法,学会了如何构建模型,训练模型,评估模型和模型预测。

2.通过此实验,我了解了热力图的原理与画法,了解了在热力图中,颜色越浅代表相关性越大,我们通过热力图找到相关性大的几个属性,每组相关性大的属性只选一个属性做代表。这样就可以把10个属性缩小。

3.学会了如何进行数据清洗,删除无用的行或列,如在本实验中,id无实际意义,可以把他删除。

4.学会了在训练数据之前,需要对数据进标准化,让数据处于同一个量级上,避免因为维度问题造成数据误差。