HealthIT.CN.AI培训(2)乳腺癌分类
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结果做对比。
相关课程:
上海理工大学医学信息工程专业HealthIT.CN AI暑期研修班:
关注“健康数据”或者HealthDT,查看更多...