基于SVM的乳腺癌数据集分类
目录
-
1.作者介绍
-
2.SVM算法介绍
-
- 2.1 SVM算法
- 2.2 SVM算法理解与分析
-
- 详细介绍了乳腺癌相关的标准数据集
-
- 系统阐述了基于支持向量机(SVM)的方法用于乳腺癌的数据分类
-
4.1 加载必要的库模块
-
4.2 加载乳腺癌的数据集
-
4.3 展示 loaded dataset 的基本信息以及其特征属性
-
4.4 通过可视化技术展示了 loaded dataset 的分布情况
-
4.5 构建并训练了机器学习模型用于对 loaded dataset 进行分类
-
4.6 计算并报告了模型在训练集和测试集上的准确率指标
-
4.7 完整提供了用于实现上述流程的Python代码
-
5.结论
-
6.参考
1.作者介绍
车晨洁女士(已婚),现为西安工程大学电子与信息学院硕士研究生二一届学生 研究方向为计算机视觉与智能系统 电子邮箱地址为692604135@qq.com
刘帅(性别),来自西安工程大学下的电子信息学院,在读硕士研究生二〇二一年级(学制两年制),所属人工智能创新研究团队
2.SVM算法介绍
2.1 SVM算法
支持向量机(support vector machines, SVM)是一种二类分类模型,在二维空间中它通过确定一条最佳直线来区分两类数据点,并使新增数据点也能得到准确分类。同样,在高维空间中我们利用超平面来区分两类样本数据。SVM特别适用于中等规模的数据集、非线性分类问题以及高维空间中的分类任务。
"三八线"这一概念可以用二维空间中的SVM方法直观形象地解释清楚,并传递了以下关键信息:
(1)它是一条明确的直线(即线性函数);
(2)它能够将平面分成两个区域分别对应两种类别(具备明确的分类功能,并且是一种二值分类方法);
(3)它位于两区域之间最中间的位置上(体现了公平原则并能最大限度保障双方利益)。
这些核心要素正是SVM算法的基本思想所在。

2.2 SVM算法理解与分析
SVM 旨在识别能够将两类样本明显区分且使其间隔(margin)最大化的关键超平面。其中性能卓越的划分超平面具有以下特点:当样本发生局部扰动时对它的抗扰动能力最强;其分类效果最为稳定;在面对未见示例时表现出最佳的泛化能力。通过分析可知,在该示例中H1为线性不可分的情况;而H2与H3则均为线性可分情形。基于最大间隔原则选择具有最优分类效果的超平面即为H3选项所对应的分类界面图中所展示的情形

如图所示,在分界面线上分布着一组数据点它们与分类边界面的距离完全一致这些关键的数据点共同决定了分类面的位置从而得名‘支持向量(support vectors)’ 而‘支持向量机’也由此发展而来


事实上,在大多数情况下(即通常情况下),数据并不是线性可分的;此时满足这种条件下的超平面也就根本不存在。针对非线性问题而言,在支持向量机(SVM)中通常采用核函数 κ(⋅,⋅) 来解决这一难题:即通过将输入的数据映射至高维特征空间,并在此过程中构造出最优分离超平面的能力;从而使原本难以实现有效区分的数据得以分类。如图所示,在二维空间中的大量数据无法实现有效的分类;因此可以通过将这些数据映射至三维特征空间来进行分类

该课题涉及了线性核、多项式核、高斯核(rbf)以及sigmoid核函数,并进行了相应的测试和分析。

3.乳腺癌数据集介绍
我们采用的是威斯康星州乳腺癌(诊断)数据集(Breast Cancer Wisconsin (Diagnostic) Data Set),该数据集中共有569个样本,并包含三个部分:每个部分包含十个指标(包括十个平均值、十个标准差和十个最大最小值)。这些分类标签分为两种类型,并记录了每种类型的数量分布。图中展示了该数据集的整体结构及其各个关键特征的详细信息。以下是对这两种分类标签的具体分析及其数量分布,并附有部分原始数据样本。


30个特征以及对应的解释具体如下:

4.基于SVM的乳腺癌数据集分类实验
4.1 导入所需要的包
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
代码解释
4.2 导入乳腺癌数据集
cancers = load_breast_cancer() #下载乳腺癌数据集
X = cancers.data #获取特征值
Y = cancers.target #获取标签
代码解释
4.3 输出数据集、特征等数据
print("数据集,特征",X.shape) #查看特征形状
print(Y.shape) #查看标签形状
#print(X)#输出特征值
#print(Y)#输出特征值
#print(cancers.DESCR) #查看数据集描述
print('特征名称')#输出特征名称
print(cancers.feature_names) # 特征名
print('分类名称')#输出分类名称
print(cancers.target_names) # 标签类别名
# 注意返回值: 训练集train,x_train,y_train,测试集test,x_test,y_test
# x_train为训练集的特征值,y_train为训练集的目标值,x_test为测试集的特征值,y_test为测试集的目标值
# 注意,接收参数的顺序固定
# 训练集占80%,测试集占20%
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
print('训练集的特征值和目标值:', x_train, y_train)
#输出训练集的特征值和目标值
print('测试集的特征值和目标值:', x_test, y_test)
#输出测试集的特征值和目标值
#print(cancers.keys())
#可以根据自己写代码的习惯输出上述参数
代码解释

4.4 可视化乳腺癌数据集
np.unique(Y) # 查看label都由哪些分类
plt.scatter(X[:, 0], X[:, 1], c=Y)
plt.show() #显示图像
代码解释

4.5 建模训练
#下面是四种核函数的建模训练
# 线性核
model_linear = SVC(C=1.0, kernel='linear')
# 多项式核
#degree表示使用的多项式的阶数
model_poly = SVC(C=1.0, kernel='poly', degree=3)
# 高斯核(RBF核)
#gamma是核函数的一个参数,gamma的值会影响测试精度
model_rbf = SVC(C=1.0, kernel='rbf', gamma=0.1)
# sigmoid核
gammalist=[] #把gammalist定义为一个数组
score_test=[] #把score_test定义为一个数组
gamma_dis=np.logspace(-100,-5,50)
#gamma_dis从10-100到10-5平均取50个点
for j in gamma_dis:
model_sigmoid = SVC(kernel='sigmoid', gamma=j,cache_size=5000).fit(x_train, y_train)
gammalist.append(j)
score_test.append(model_sigmoid.score(x_test, y_test))
#找出最优gammalist值
print("分数--------------------",score_test)
print("测试最大分数, gammalist",max(score_test),gamma_dis[score_test.index(max(score_test))])
plt.plot(gammalist,score_test) #横轴为gammalist纵轴为score_test
plt.show()#显示图片
代码解释
输出结果如下:


根据输出数据及图像信息可以看出,在γ取值为1.1513953993264481e-07时达到最大精度水平,在此情况下我们将这一γ值定义为最佳γ值
4.6 输出训练分数以及测试分数
model_linear.fit(x_train, y_train)
train_score = model_linear.score(x_train, y_train)
test_score = model_linear.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
model_poly.fit(x_train, y_train)
train_score = model_poly.score(x_train, y_train)
test_score = model_poly.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
model_rbf.fit(x_train, y_train)
train_score = model_rbf.score(x_train, y_train)
test_score = model_rbf.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
model_sigmoid.fit(x_train, y_train)
train_score = model_sigmoid.score(x_train, y_train)
test_score = model_sigmoid.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score,test_score))
代码解释
输出结果如下:

4.7 完整代码
from sklearn.datasets import load_breast_cancer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import numpy as np
cancers = load_breast_cancer() #下载乳腺癌数据集
X = cancers.data #获取特征值
Y = cancers.target #获取标签
print("数据集,特征",X.shape) #查看特征形状
print(Y.shape) #查看标签形状
#print(X)#输出特征值
#print(Y)#输出特征值
#print(cancers.DESCR) #查看数据集描述
print('特征名称')#输出特征名称
print(cancers.feature_names) # 特征名
print('分类名称')#输出分类名称
print(cancers.target_names) # 标签类别名
# 注意返回值: 训练集train,x_train,y_train,测试集test,x_test,y_test
# x_train为训练集的特征值,y_train为训练集的目标值,x_test为测试集的特征值,y_test为测试集的目标值
# 注意,接收参数的顺序固定
# 训练集占80%,测试集占20%
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
print('训练集的特征值和目标值:', x_train, y_train)
#输出训练集的特征值和目标值
print('测试集的特征值和目标值:',x_test, y_test)
#输出测试集的特征值和目标值
#print(cancers.keys())
#可以根据自己写代码的习惯输出上述参数
np.unique(Y) # 查看label都由哪些分类
plt.scatter(X[:, 0], X[:, 1], c=Y)
plt.show() #显示图像
#下面是四种核函数的建模训练
#下面是四种核函数的建模训练
# 线性核
model_linear = SVC(C=1.0, kernel='linear')
# 多项式核
#degree表示使用的多项式的阶数
model_poly = SVC(C=1.0, kernel='poly', degree=3)
# 高斯核(RBF核)
#gamma是核函数的一个参数,gamma的值会影响测试精度
model_rbf = SVC(C=1.0, kernel='rbf', gamma=0.1)
# sigmoid核
gammalist=[] #把gammalist定义为一个数组
score_test=[] #把score_test定义为一个数组
gamma_dis=np.logspace(-100,-5,50)
#gamma_dis从10-100到10-5平均取50个点
for j in gamma_dis:
model_sigmoid = SVC(kernel='sigmoid', gamma=j,cache_size=5000).fit(x_train, y_train)
gammalist.append(j)
score_test.append(model_sigmoid.score(x_test, y_test))
#找出最优gammalist值
print("分数--------------------",score_test)
print("测试最大分数, gammalist",max(score_test),gamma_dis[score_test.index(max(score_test))])
plt.plot(gammalist,score_test) #横轴为gammalist纵轴为score_test
plt.show()#显示图片
# 线性核
model_linear.fit(x_train, y_train)
train_score = model_linear.score(x_train, y_train)
test_score = model_linear.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
model_poly.fit(x_train, y_train)
train_score = model_poly.score(x_train, y_train)
test_score = model_poly.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
model_rbf.fit(x_train, y_train)
train_score = model_rbf.score(x_train, y_train)
test_score = model_rbf.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
model_sigmoid.fit(x_train, y_train)
train_score = model_sigmoid.score(x_train, y_train)
test_score = model_sigmoid.score(x_test, y_test)
print('train_score:{0}; test_score:{1}'.format(train_score, test_score))
#sigmoid函数输出训练精度和测试精度
代码解释
5.结论
通过对比分析不同内核函数的表现,在本课题中选择线性和多项式内核进行实验验证后发现其分类准确率较高(建议后续优化rbf内核参数以进一步提高分类性能);
采用rbf高斯内 kernel时的分类准确率达到100%;
在sigmoid kernel函数中, gamma参数值的变化直接影响分类效果.具体而言,当设置gamma参数为1.1513953993264481e-07时,分类准确率达到最高值为0.9298245614035088
6.参考
乳腺癌相关数据集链接:
https://pan.baidu.com/s/1DN4AlRzDkmBSZlnk8dY15g 提取码:i6u6
博客参考链接:
.net/qq_42363032/article/details/107210881
