SVM实战:如何进行乳腺癌检测
如何在 sklearn 中使用 SVM
SVM 既可以做回归,也可以做分类器。
当我们采用支持向量机来进行回归分析时,在回归任务中选择模型时可以选择支持向量回归(Support Vector Regression, SVR)或线性支持向量回归(LinearSVR),其中一种方法是支持向量回
Linear SVR主要用于处理可分于线性空间的数据。换句话说,在这种情况下,默认会采用的是一个线性的核函数。
如果面对的是非线性数据,则需要使用SVC。
在SVC中既可以采用到一个基于低维空间的核函数来进行简单的分类(即实现基于特征向量的直接分类),也可以通过引入高维映射来实现对复杂模式的学习。
在机器学习中构建支持向量机分类器的过程相对复杂但非常有效我们可以采用scikit-learn库中的支持向量分类器(SVC)来实现这一目标具体来说在Python环境中我们可以编写如下代码:from sklearn.svm import SVC然后根据需求配置其属性如核函数选择、惩罚系数设置以及Gamma值的选择这些参数将直接影响模型的性能表现其中最为关键的是正确配置这些超参数以确保最佳的分类效果
kernel 参数决定了核函数的选择,在此方案中存在四种可能选项,默认采用径向基函数(Radial Basis Function, RBF),即高斯型核函数。

线性核函数的优点在于其在数据线性可分的情况下表现出良好的性能,并且具有高效的计算速度和较高的分类准确率。
但是,在面对非线性可分的数据问题时,则无法直接处理。
多项式核函数能够将数据从低维空间映射至更高维度的空间中进行处理,在一定程度上增强了模型的非线性建模能力。
然而,在这种转换过程中需要考虑较大的参数数量以及较高的计算复杂度。
相比之下, 高斯核函数同样实现了对低维到高维空间的映射, 但其主要优势在于所需的参数数量相对较少, 同时还能保持较好的分类性能。
对于熟悉深度学习的同学而言, 在神经网络模型中常用的sigmoid 函数确实用于实现非线性变换的功能;当选择sigmoid 核函数时, 则使SVM模型具备了与多层神经网络相似的学习能力。
参数C扮演着目标函数的惩罚因子角色,在机器学习中被定义为误分类样本所受到的处罚程度,默认情况下设置为1.0。随着C值增大,模型的正确分类率提高;然而,在提升准确性的同时,模型对错误样本的学习能力减弱,并且其一般化能力相应降低。
参数设置gamma由核函数决定,默认值设定为其数量的倒数值,具体而言,则定义为gamma = 1 / n_features。
我们通过 model.fit()函数对训练集进行拟合,并将模型中的训练数据集输入至模型中进行拟合操作。该模型采用在进行变量筛选之后所提取出的关键变量集合作为输入数据;而如果愿意的话,则可以选择不执行变量筛选直接使用所有原始变量构成的数据集。具体而言,则是指人工为每一个样本预先设定好对应的类别标签或标记的结果集合。
通过将 test_X 作为输入传递给 model=... ,我们可以生成相应的分类标签;将测试集中的样本特征矩阵 test_X 作为输入传递给 model=... ,模型将根据输入数据生成相应的分类标签 prediction。
同样我们可以构建线性 SVM 分类器,并采用 model=svm.LinearSVC() 作为实现。LinearSVC 通过优化线性分类算法,在处理大规模的线性可分数据集时展现出比 SVC 更高的效率。
如果你不知道数据集是否为线性,可以直接使用 SVC 类创建 SVM 分类器。
如何用 SVM 进行乳腺癌检测
所选用的数据集为:点击下载;该数据集源自美国威斯康星州的乳腺癌诊断相关数据集;图片展示了该数据集的相关信息;请通过链接点击下载获取该数据集

涉及的字段名解释如下:

从569名患者中开展研究发现,在这当中共有357例为良性的病例;另外212例则属于恶性的病例。研究涉及的字段共计有30项指标;然而,在这些指标中实际提取出的有效特征仅限于10项。
处理步骤如下:
1、第一步是需要加载数据源;
2、通过"完全整合"的方式对数据进行可视化展示与处理;在此基础上依据具体需求选择相应的特征变量或进行特征工程优化;
3、分别在训练集和测试集上进行模型训练与评估
# encoding=utf-8
import pandas as pd
import numpy as np
data = pd.read_csv("C://Users//baihua//Desktop//data.csv",encoding='utf-8') #这里要注意,如果文件中有中文,本地文件一定要转换成 UTF-8的编码格式
# 数据探索
# 因为数据集中列比较多,我们需要把 dataframe 中的列全部显示出来
pd.set_option('display.max_columns', None)
print(data.columns)
print(data.head(5))
print(data.describe())
# 将 B 良性替换为 0,M 恶性替换为 1
data['diagnosis']=data['diagnosis'].map({'M':1,'B':0})
代码解释

#数据清洗
# 将特征字段分成 3 组
import pandas as pd
import numpy as np
features_mean= list(data.columns[2:12])
features_se= list(data.columns[12:22])
features_worst=list(data.columns[22:32])
# 数据清洗
# ID 列没有用,删除该列
#ata.drop(columns=['id'],axis=1,inplace=True)
代码解释
# 将肿瘤诊断结果可视化
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics
from sklearn.preprocessing import StandardScaler
plt.show()
# 用热力图呈现 features_mean 字段之间的相关性
corr = data[features_mean].corr()
plt.figure(figsize=(14,14))
# annot=True 显示每个方格的数据
sns.heatmap(corr, annot=True)
plt.show()
代码解释

热力图矩阵中主对角线元素等于 1,在该矩阵中颜色越浅表示相关性越高。
因此我们可以观察到 radius_mean, perimeter_mean 和 area_mean 的相关性非常高。
而 compactness_mean, concavity_mean 和 concave_points_mean 这三个字段之间也表现出高度的相关性。
因此我们可以从中选取一个具有代表性的指标来反映这一组变量的主要特征。
如何有效实现特征筛选?我们通过筛选相关性较高的特征来实现对重要属性的聚焦。例如,在本研究中采用radius_mean和compactness_mean作为主要指标。
这样我们就可以把原来的 10 个属性缩减为 6 个属性,代码如下:
# 特征选择,只选择了平均值这一维度,并且还去除了相关系数较大的特征值
features_remain = ['radius_mean','texture_mean', 'smoothness_mean','compactness_mean','symmetry_mean', 'fractal_dimension_mean']
代码解释
完成特征选择后, 我们便准备好训练集与测试集:
在开始训练前, 我们需将数据进行归一化处理, 使所有数据处于同一数量级, 以消除维度差异可能带来的误差影响:
# 抽取 30% 的数据作为测试集,其余作为训练集
train, test = train_test_split(data, test_size = 0.3)# in this our main data is splitted into train and test
# 抽取特征选择的数值作为训练和测试数据
train_X = train[features_remain]
train_y=train['diagnosis']
test_X= test[features_remain]
test_y =test['diagnosis']
# 采用 Z-Score 规范化数据,保证每个特征维度的数据均值为 0,方差为 1
ss = StandardScaler()
train_X = ss.fit_transform(train_X)
test_X = ss.transform(test_X)
``
最后我们可以让 SVM 做训练和预测了:
代码解释
创建 SVM 分类器
model = svm.SVC()
用训练集做训练
model.fit(train_X,train_y)
用测试集做预测
预测结果 = 模型预测(test_X)
输出准确率:使用metrics模块计算的预测结果与真实标签之间的准确性。
![在这里插入图片描述]()
提问:本例中我们使用默认核函数,请你用 LinearSVC,选取全部的特征(除了 ID 以外)作为训练数据,看下你的分类器能得到多少的准确度呢?
上例中,只换核函数:
代码解释
model = svm.LinearSVC()
![在这里插入图片描述]()
现在,我们将原来平均值特征,换成所有的特征值,
代码解释
特征选择
输出内容
![在这里插入图片描述]()
代码解释
