网站规划与建设书,58同城最新招聘信息,wordpress301规则,台州专业网站设计系统⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ #x1f434;作者#xff1a;秋无之地 #x1f434;简介#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作#xff0c;主要擅长领域有#xff1a;爬虫、后端、大数据… ⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 作者秋无之地 简介CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作主要擅长领域有爬虫、后端、大数据开发、数据分析等。 欢迎小伙伴们点赞、收藏⭐️、留言、关注关注必回关 上一篇文章已经跟大家介绍过《SVM上如何用一根棍子将蓝红两色球分开》相信大家对SVM上都有一个基本的认识。下面我讲一下SVM下如何进行乳腺癌检测 上一节中讲到了硬间隔、软间隔、非线性 SVM以及分类间隔的公式你可能会觉得比较抽象。这节课我们会在实际使用中讲解对工具的使用以及相关参数的含义。
一、如何在 sklearn 中使用 SVM
在 Python 的 sklearn 工具包中有 SVM 算法首先需要引用工具包
from sklearn import svm
SVM 既可以做回归也可以做分类器。
当用 SVM 做回归的时候我们可以使用 SVR 或 LinearSVR。SVR 的英文是 Support Vector Regression。这篇文章只讲分类这里只是简单地提一下。
当做分类器的时候我们使用的是 SVC 或者 LinearSVC。SVC 的英文是 Support Vector Classification。
我简单说一下这两者之前的差别。
从名字上你能看出 LinearSVC 是个线性分类器用于处理线性可分的数据只能使用线性核函数。上一节我讲到 SVM 是通过核函数将样本从原始空间映射到一个更高维的特质空间中这样就使得样本在新的空间中线性可分。
如果是针对非线性的数据需要用到 SVC。在 SVC 中我们既可以使用到线性核函数进行线性划分也能使用高维的核函数进行非线性划分。
如何创建一个 SVM 分类器呢
我们首先使用 SVC 的构造函数model svm.SVC(kernel‘rbf’, C1.0, gamma‘auto’)这里有三个重要的参数 kernel、C 和 gamma。
kernel 代表核函数的选择它有四种选择只不过默认是 rbf即高斯核函数。
linear线性核函数poly多项式核函数rbf高斯核函数默认sigmoidsigmoid 核函数
这四种函数代表不同的映射方式你可能会问在实际工作中如何选择这 4 种核函数呢我来给你解释一下
线性核函数是在数据线性可分的情况下使用的运算速度快效果好。不足在于它不能处理线性不可分的数据。
多项式核函数可以将数据从低维空间映射到高维空间但参数比较多计算量大。
高斯核函数同样可以将样本映射到高维空间但相比于多项式核函数来说所需的参数比较少通常性能不错所以是默认使用的核函数。
了解深度学习的同学应该知道 sigmoid 经常用在神经网络的映射中。因此当选用 sigmoid 核函数时SVM 实现的是多层神经网络。
上面介绍的 4 种核函数除了第一种线性核函数外其余 3 种都可以处理线性不可分的数据。
参数 C 代表目标函数的惩罚系数惩罚系数指的是分错样本时的惩罚程度默认情况下为 1.0。当 C 越大的时候分类器的准确性越高但同样容错率会越低泛化能力会变差。相反C 越小泛化能力越强但是准确性会降低。
参数 gamma 代表核函数的系数默认为样本特征数的倒数即 gamma 1 / n_features。
在创建 SVM 分类器之后就可以输入训练集对它进行训练。我们使用 model.fit(train_X,train_y)传入训练集中的特征值矩阵 train_X 和分类标识 train_y。特征值矩阵就是我们在特征选择后抽取的特征值矩阵当然你也可以用全部数据作为特征值矩阵分类标识就是人工事先针对每个样本标识的分类结果。这样模型会自动进行分类器的训练。我们可以使用 predictionmodel.predict(test_X) 来对结果进行预测传入测试集中的样本特征矩阵 test_X可以得到测试集的预测分类结果 prediction。
同样我们也可以创建线性 SVM 分类器使用 modelsvm.LinearSVC()。在 LinearSVC 中没有 kernel 这个参数限制我们只能使用线性核函数。由于 LinearSVC 对线性分类做了优化对于数据量大的线性可分问题使用 LinearSVC 的效率要高于 SVC。
如果你不知道数据集是否为线性可以直接使用 SVC 类创建 SVM 分类器。
在训练和预测中LinearSVC 和 SVC 一样都是使用 model.fit(train_X,train_y) 和 model.predict(test_X)。 二、如何用 SVM 进行乳腺癌检测
在了解了如何创建和使用 SVM 分类器后我们来看一个实际的项目数据集来自美国威斯康星州的乳腺癌诊断数据集。
医疗人员采集了患者乳腺肿块经过细针穿刺 (FNA) 后的数字化图像并且对这些数字图像进行了特征提取这些特征可以描述图像中的细胞核呈现。肿瘤可以分成良性和恶性。部分数据截屏如下所示 数据表一共包括了 32 个字段代表的含义如下 上面的表格中mean 代表平均值se 代表标准差worst 代表最大值3 个最大值的平均值。每张图像都计算了相应的特征得出了这 30 个特征值不包括 ID 字段和分类标识结果字段 diagnosis实际上是 10 个特征值radius、texture、perimeter、area、smoothness、compactness、concavity、concave points、symmetry 和 fractal_dimension_mean的 3 个维度平均、标准差和最大值。这些特征值都保留了 4 位数字。字段中没有缺失的值。在 569 个患者中一共有 357 个是良性212 个是恶性。
好了我们的目标是生成一个乳腺癌诊断的 SVM 分类器并计算这个分类器的准确率。首先设定项目的执行流程 首先我们需要加载数据源在准备阶段需要对加载的数据源进行探索查看样本特征和特征值这个过程你也可以使用数据可视化它可以方便我们对数据及数据之间的关系进一步加深了解。然后按照“完全合一”的准则来评估数据的质量如果数据质量不高就需要做数据清洗。数据清洗之后你可以做特征选择方便后续的模型训练在分类阶段选择核函数进行训练如果不知道数据是否为线性可以考虑使用 SVC(kernel‘rbf’) 也就是高斯核函数的 SVM 分类器。然后对训练好的模型用测试集进行评估。
按照上面的流程我们来编写下代码加载数据并对数据做部分的探索
# 加载数据集你需要把数据放到目录中
data pd.read_csv(./data.csv)
# 数据探索
# 因为数据集中列比较多我们需要把dataframe中的列全部显示出来
pd.set_option(display.max_columns, None)
print(data.columns)
print(data.head(5))
print(data.describe())
这是部分的运行结果完整结果你可以自己跑一下。
Index([id, diagnosis, radius_mean, texture_mean, perimeter_mean,area_mean, smoothness_mean, compactness_mean, concavity_mean,concave points_mean, symmetry_mean, fractal_dimension_mean,radius_se, texture_se, perimeter_se, area_se, smoothness_se,compactness_se, concavity_se, concave points_se, symmetry_se,fractal_dimension_se, radius_worst, texture_worst,perimeter_worst, area_worst, smoothness_worst,compactness_worst, concavity_worst, concave points_worst,symmetry_worst, fractal_dimension_worst],dtypeobject)id diagnosis radius_mean texture_mean perimeter_mean area_mean \
0 842302 M 17.99 10.38 122.80 1001.0
1 842517 M 20.57 17.77 132.90 1326.0
2 84300903 M 19.69 21.25 130.00 1203.0
3 84348301 M 11.42 20.38 77.58 386.1
4 84358402 M 20.29 14.34 135.10 1297.0
接下来我们就要对数据进行清洗了。
运行结果中你能看到 32 个字段里id 是没有实际含义的可以去掉。diagnosis 字段的取值为 B 或者 M我们可以用 0 和 1 来替代。另外其余的 30 个字段其实可以分成三组字段下划线后面的 mean、se 和 worst 代表了每组字段不同的度量方式分别是平均值、标准差和最大值。
# 将特征字段分成3组
features_mean list(data.columns[2:12])
features_se list(data.columns[12:22])
features_worstlist(data.columns[22:32])
# 数据清洗
# ID列没有用删除该列
data.drop(id,axis1,inplaceTrue)
# 将B良性替换为0M恶性替换为1
data[diagnosis]data[diagnosis].map({M:1,B:0})
然后我们要做特征字段的筛选首先需要观察下 features_mean 各变量之间的关系这里我们可以用 DataFrame 的 corr() 函数然后用热力图帮我们可视化呈现。同样我们也会看整体良性、恶性肿瘤的诊断情况。
# 将肿瘤诊断结果可视化
sns.countplot(data[diagnosis],labelCount)
plt.show()
# 用热力图呈现features_mean字段之间的相关性
corr data[features_mean].corr()
plt.figure(figsize(14,14))
# annotTrue显示每个方格的数据
sns.heatmap(corr, annotTrue)
plt.show()
这是运行的结果 热力图中对角线上的为单变量自身的相关系数是 1。颜色越浅代表相关性越大。所以你能看出来 radius_mean、perimeter_mean 和 area_mean 相关性非常大compactness_mean、concavity_mean、concave_points_mean 这三个字段也是相关的因此我们可以取其中的一个作为代表。
那么如何进行特征选择呢
特征选择的目的是降维用少量的特征代表数据的特性这样也可以增强分类器的泛化能力避免数据过拟合。
我们能看到 mean、se 和 worst 这三组特征是对同一组内容的不同度量方式我们可以保留 mean 这组特征在特征选择中忽略掉 se 和 worst。同时我们能看到 mean 这组特征中radius_mean、perimeter_mean、area_mean 这三个属性相关性大compactness_mean、daconcavity_mean、concave points_mean 这三个属性相关性大。我们分别从这 2 类中选择 1 个属性作为代表比如 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_ytrain[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)
# 用测试集做预测
predictionmodel.predict(test_X)
print(准确率: , metrics.accuracy_score(test_y,prediction))
运行结果
准确率: 0.9181286549707602
准确率大于 90%说明训练结果还不错。 三、总结
今天我带你一起做了乳腺癌诊断分类的 SVM 实战从这个过程中你应该能体会出来整个执行的流程包括数据加载、数据探索、数据清洗、特征选择、SVM 训练和结果评估等环节。
sklearn 已经为我们提供了很好的工具对上节课中讲到的 SVM 的创建和训练都进行了封装让我们无需关心中间的运算细节。但正因为这样我们更需要对每个流程熟练掌握通过实战项目训练数据化思维和对数据的敏感度。
版权声明
本文章版权归作者所有未经作者允许禁止任何转载、采集作者保留一切追究的权利。