Advertisement

SVM(下):如何进行乳腺癌检测

阅读量:

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

如何在 sklearn 中使用 SVM
在 Python 的 sklearn 工具包中有 SVM 算法,首先需要引用工具包:

复制代码
    from sklearn import svm

SVM 既可以做回归,也可以做分类器。
当用 SVM 做回归的时候,我们可以使用 SVR 或 LinearSVR。
当做分类器的时候,我们使用的是 SVC 或者 LinearSVC。

简单说一下这两者之前的差别。
从名字上能看出 LinearSVC 是个线性分类器,用于处理线性可分的数据,只能使用线性核函数。 SVM 是通过核函数将样本从原始空间映射到一个更高维的特质空间中,这样就使得样本在新的空间中线性可分。

如果是针对非线性的数据,需要用到 SVC。在 SVC 中,既可以使用到线性核函数(进行线性划分),也能使用高维的核函数(进行非线性划分)。

如何创建一个 SVM 分类器呢?
我们首先使用 SVC 的构造函数:

复制代码
    model = svm.SVC(kernel=‘rbf’, C=1.0, gamma=‘auto’)

这里有三个重要的参数 kernel、C 和 gamma。
kernel 代表核函数的选择,它有四种选择:

  • 默认是 rbf,即高斯核函数。
  • linear:线性核函数
  • poly:多项式核函数
  • sigmoid:sigmoid 核函数

这四种函数代表不同的映射方式,如何选择这 4 种核函数呢?
线性核函数 ,是在数据线性可分 的情况下使用的,运算速度快,效果好。不足在于它不能处理线性不可分的数据。
多项式核函数 可以将数据从低维空间映射到高维空间 ,但参数比较多,计算量大。
高斯核函数 同样可以将样本映射到高维空间,但相比于多项式核函数来说所需的参数比较少,通常性能不错,所以是默认使用的核函数。
上面介绍的 4 种核函数,除了第一种线性核函数外,其余 3 种都可以处理线性不可分的数据。

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

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

在创建 SVM 分类器之后,就可以输入训练集对它进行训练。我们使用 model.fit(train_X,train_y),传入训练集中的特征值矩阵 train_X 和分类标识 train_y。

特征值矩阵就是我们在特征选择后抽取的特征值矩阵(当然你也可以用全部数据作为特征值矩阵);分类标识就是人工事先针对每个样本标识的分类结果。这样模型会自动进行分类器的训练。我们可以使用 prediction=model.predict(test_X) 来对结果进行预测,传入测试集中的样本特征矩阵 test_X,可以得到测试集的预测分类结果 prediction。

同样我们也可以创建线性 SVM 分类器,使用 model=svm.LinearSVC()。在 LinearSVC 中没有 kernel 这个参数,限制我们只能使用线性核函数。由于 LinearSVC 对线性分类做了优化,对于数据量大的线性可分问题,使用 LinearSVC 的效率要高于 SVC。

如果不知道数据集是否为线性,可以直接使用 SVC 类创建 SVM 分类器。
在训练和预测中,LinearSVC 和 SVC 一样,都是使用 model.fit(train_X,train_y) 和 model.predict(test_X)。

如何进行乳腺癌检测

复制代码
    # -*- coding: utf-8 -*-
    # 乳腺癌诊断分类
    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 
    
    # 加载数据集,需要把数据放到目录中
    data = pd.read_csv("./data.csv") 
    # 数据探索
    # 因为数据集中列比较多,我们需要把dataframe中的列全部显示出来
    pd.set_option('display.max_columns', None)
    print(data.columns)
    print(data.head(5))
    print(data.describe()) 
    # 将特征字段分成3组
    features_mean= list(data.columns[2:12])
    features_se= list(data.columns[12:22])
    features_worst=list(data.columns[22:32]) 
    # 数据清洗
    # ID列没有用,删除该列
    data.drop("id",axis=1,inplace=True)
    # 将B良性替换为0,M恶性替换为1
    data['diagnosis']=data['diagnosis'].map({'M':1,'B':0}) 
    # 将肿瘤诊断结果可视化
    sns.countplot(data['diagnosis'],label="Count")plt.show()
    # 用热力图呈现features_mean字段之间的相关性
    corr = data[features_mean].corr()
    plt.figure(figsize=(14,14))
    # annot=True显示每个方格的数据
    sns.heatmap(corr, annot=True)plt.show() 
    # 特征选择
    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)
    # 抽取特征选择的数值作为训练和测试数据
    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分类器
    model = svm.SVC()
    # 用训练集做训练
    model.fit(train_X,train_y)
    # 用测试集做预测
    prediction=model.predict(test_X)
    print('准确率: ', metrics.accuracy_score(test_y,prediction))

准确率: 0.9181286549707602

全部评论 (0)

还没有任何评论哟~