HealthIT.CN.AI培训(2)乳腺癌分类

  • A+
所属分类:医信大学


1.    
基本介绍

数据集介绍

名称:美国威斯康辛州乳腺癌临床诊断数据

特点:多变量

样本量:569

特征数量:30

适用于:分类问题

目标:基于数据集中包含的某些诊断测量来预测患者是否患有乳腺癌

主要特征:

radius半径,即病灶中心点离边界的平均距离
texture纹理,灰度值的标准偏差
perimeter周长,即病灶大小的一个指标
area面积,也是反应病灶大小的一个指标
smoothness平滑度,即半径的变化幅度
compactness密实度,周长的平方除以面积的商,再减1
concavity凹度,凹陷部分轮廓的严重程度
Concave points凹点,凹陷轮廓的严重程度
symmetry对称性
Fractal dimension分型维度

数据预览

SVM算法

支持向量机简称SVM(Support Vector Machine),是一种分类算法,最大的特点是能构造出最大间距的决策边界,从而提高分类算法的鲁棒性。

SVM是有监督的学习模型,我们需要事先对数据打上分类标签,通过求解最大分类间隔来求解二分类问题。如果要求解多分类问题,可以将多个二分类器组合起来形成一个多分类器。

基本介绍

SVM 既可以做回归,也可以做分类器。当用 SVM 做回归的时候,使用 SVR 或LinearSVR。当做分类器的时候,使用的是 SVC 或者LinearSVC。LinearSVC是个线性分类器,用于处理线性可分的数据,只能使用线性核函数。如果是针对非线性的数据,需要用到 SVC。在 SVC 中,既可以使用到线性核函数(进行线性划分),也能使用高维的核函数(进行非线性划分)。

如何创建一个 SVM 分类器

使用 SVC 的构造函数:model = svm.SVC(kernel=‘rbf’,C=1.0, gamma=‘‘auto’),这里有三个重要的参数kernel、C 和 gamma。

(1)kernel 代表核函数的选择,它有四种选择,只不过默认是 rbf,即高斯核函数。

A.linear:线性核函数 

B.poly:多项式核函数

C.rbf:高斯核函数(默认) 

D.sigmoid:sigmoid 核函数

线性核函数,是在数据线性可分的情况下使用的,运算速度快,效果好。不足在于它不能处理线性不可分的数据。

多项式核函数可以将数据从低维空间映射到高维空间,但参数比较多,计算量大。

高斯核函数同样可以将样本映射到高维空间,但相比于多项式核函数来说所需的参数比较少,通常性能不错,所以是默认使用的核函数。

sigmoid 经常用在神经网络的映射中。因此当选用 sigmoid 核函数时,SVM 实现的是多层神经网络。

(2)参数 C 代表目标函数的惩罚系数,惩罚系数指的是分错样本时的惩罚程度,默认情况下为 1.0。当 C 越大的时候,分类器的准确性越高,但同样容错率会越低,泛化能力会变差。相反,C 越小,泛化能力越强,但是准确性会降低。

(3) 参数 gamma 代表核函数的系数,默认为样本特征数的倒数,即 gamma = 1 / n_features。

实现思路

首先进行数据分析,查看样本量和特征数,阳性阴性数据比等。根据特征选择核函数进行模型训练,这里对三种核函数分别实验,将三者的训练结果和测试结果做对比,对三种核函数的支持向量机算法有更深刻的理解。

2.    开发工具

Anaconda3下的spyder

3.    模型训练过程

(主要代码)

数据分析

可以看出:数据集较小,高斯核函数太复杂,同意造成过拟合,模型效果应该不是很好。先用高斯核函数试一下看与我们猜测的是否一致:

#高斯核函数

clf=SVC(C=1.0,kernel='rbf',gamma=0.1)clf.fit(X_train,y_train)train_score=clf.score(X_train,y_train)test_score=clf.score(X_test,y_test)print('train score:{0};test score:{1}'.format(train_score,test_score))

训练数据集分数接近满分,而交叉验证数据集评分很低,这是典型的过拟合现象。代码中选择了gamma参数为0.1,这个值相对已经较小了。

当然,我们可以自动来选择参数。使用GridSearchCV来自动选择参数。看看如果使用高斯模型,最优的gamma参数值是多少,其对应的模型交叉验证评分是多少。

#高斯核函数自动选择参数

gammas=np.linspace(0,0.0003,30)param_grid={'gamma':gammas}clf=GridSearchCV(SVC(),param_grid,cv=5)clf.fit(X,y)print("best param:{0}\nbestscore:{1}".format(clf.best_params_,clf.best_score_))plt.figure(figsize=(10,4),dpi=144)plot_param_curve(plt,gammas,clf.cv_results_,xlabel='gamma');

运行结果:

 由此可见: 即使是最好的gamma参数下,其平均最优得分也只是0.9367,选择在gamma为0.01时,画出学习曲线,更直观地观察模型拟合情况

#gamma=0.1时的高斯核函数

cv = ShuffleSplit(n_splits=10, test_size=0.2,random_state=0)title = 'Learning Curves for Gaussian Kernel'start = time.clock()plt.figure(figsize=(10, 4), dpi=144) plot_learning_curve(plt, SVC(C=1.0, kernel='rbf',gamma=0.1),                       title, X, y, ylim=(0.5, 1.01), cv=cv) print('elaspe: {0:.6f}'.format(time.clock()-start))

这是明显的过拟合现象,交叉验证数据集的评分非常低,且离训练数据集评分非常远。

接下来换一个模型,使用二阶多项式核函数来拟合模型,看看结果如何。

#二阶核函数

clf=SVC(C=1.0,kernel='poly',degree=2)

clf.fit(X_train,y_train)

train_score=clf.score(X_train,y_train)

test_score=clf.score(X_test,y_test)

print('train score:{0};testscore:{1}'.format(train_score,test_score))

 结果如下:

看起来结果好多了。作为对比,画出一阶多项式和二阶多项式的学习曲线,观察模型的拟合情况。

#一阶二阶多项书核函数

cv = ShuffleSplit(n_splits=5, test_size=0.2,random_state=0)title = 'Learning Curves with degree={0}'degrees = [1, 2] start = time.clock()plt.figure(figsize=(12, 4), dpi=144)for i in range(len(degrees)):   plt.subplot(1, len(degrees), i + 1)   plot_learning_curve(plt, SVC(C=1.0, kernel='poly', degree=degrees[i]),                       title.format(degrees[i]), X, y, ylim=(0.8, 1.01), cv=cv, n_jobs=4) print('elaspe: {0:.6f}'.format(time.clock()-start))

输出结果如下:

从图中可以看出,二阶多项式核函数的拟合效果更好。平均交叉验证数据集评分可达0.950,最高时达到0.975。

4.    总结

对乳腺癌数据集进行了分析和预处理,使用SVM算法,选择三种核函数:一阶多项式核函数、二阶多项式核函数、高斯核函数,对训练结果和测试结果作对比,探索了高斯核函数在此数据集上的最佳gamma值,及其最佳gamma值下的testcost。结果显示,使用二阶多项式核函数的拟合效果更好,平均交叉验证集可达0.95。

作业任务:

  1.  使用支持向量机(一阶、二阶、高斯核函数)对乳腺癌数据进行分类。
  2. (选做)特征筛选,尝试选择相关性较大的特征作为输入,与题1结果做对比。
  • HealthIT.CN小程序
  • 产学研医创新平台
  • weinxin
  • 健康数据
  • HealthIT公众号
  • weinxin
admin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: