美文网首页
SVM:如何进行乳腺癌检测?

SVM:如何进行乳腺癌检测?

作者: 疯狂的小强_94ee | 来源:发表于2019-04-21 21:38 被阅读0次

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

    1 基本介绍

    SVM 既可以做回归,也可以做分类器。

    当用 SVM 做回归的时候,我们可以使用 SVR 或 LinearSVR。SVR 的英文是 Support Vector Regression。

    当做分类器的时候,我们使用的是 SVC 或者LinearSVC。SVC 的英文是 Support Vector Classification。

    LinearSVC 是个线性分类器,用于处理线性可分的数据,只能使用线性核函数。

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

    2 如何创建一个 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。

    3 代码实现

    # 加载数据集,你需要把数据放到目录中

    data = pd.read_csv("./../data/svm/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})

    #print(data.head(5))

    # 将肿瘤诊断结果可视化

    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)# 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 分类器

    #model = svm.SVC()

    #model = svm.SVC(kernel="linear")

    model = svm.LinearSVC()

    # 用训练集做训练

    model.fit(train_X, train_y)

    # 用测试集做预测

    prediction = model.predict(test_X)

    print('准确率: ', metrics.accuracy_score(prediction,test_y))

    相关文章

      网友评论

          本文标题:SVM:如何进行乳腺癌检测?

          本文链接:https://www.haomeiwen.com/subject/itwowqtx.html