Advertisement

数据分析实战之SVM(如何进行乳腺癌预测)

阅读量:

本文基于美国威斯康星州的乳腺癌诊断数据集,通过以下步骤构建了一个乳腺癌诊断的SVM分类器并计算了其准确率:首先从GitHub加载数据集,并对数据进行探索和清洗;接着进行了特征选择以减少维度;随后将数据划分为训练集和测试集,并对训练集进行标准化处理;最后使用SVM模型进行训练和预测,并获得91.23%的准确率。

本文基于美国威斯康星州乳腺癌诊断数据集,开发了一个用于乳腺癌诊断的SVM分类模型,并评估该模型在测试集上的准确率。

数据源:https://github.com/cystanford/breast_cancer_data/

1、加载数据源

复制代码
 import pandas as pd

    
 data = pd.read_csv(r'C:\Users\hzjy\Desktop\data.csv')

2、数据探索

查看数据的基本情况:可以看到各字段数据没有缺失

mean用于表示平均值计算结果,se用于表示标准差计算结果,worst用于表示最大值计算结果;最后30个特征量实际上是基于前10个形态学特异性参数(即radius, texture, perimeter, area, smoothness, compactness, concavity, concave points, symmetry以及fractal_dimension)的均值及其方差和最大统计量进行计算得到的结果

3、数据清洗

1)“id”没有实际意思,可以去掉

复制代码
    data.drop('id',axis = 1,inplace=True)

2)“diagnosis”字段的取值即分类结果为B或M,可以用0和1来替代

复制代码
    data['diagnosis'] = data['diagnosis'].map({'M':1,'B':0})

3)后面30个字段可以分成3组

复制代码
 featurs_mean = list(data.columns[1:11])

    
 featurs_se = list(data.columns[12:21])
    
 featurs_worst = list(data.columns[22:31])

4、特征字段的筛选

1)看整体良性、恶性肿瘤的诊断情况

复制代码
 import seaborn as sns

    
 import matplotlib.pyplot as plt
    
 %matplotlib inline
    
 sns.countplot(data['diagnosis'],label = 'Count')

2)观察下featurs_mean各变量之间的关系

复制代码
 corr = data[featurs_mean].corr()

    
 plt.figure(figsize=(14,14))
    
 sns.heatmap(corr,annot=True)     #annot = True 显示每个方格的数据

热力图的对角线元素显示了单变量与其自身之间的相关系数为1。颜色较浅则反映较高的相关性。

radius\_meanperimeter\_meanarea\_mean 之间具有高度相关性,并与 compactness\_meanconcavity\_meanconcave\_points\_mean 的相关性较低。

这3个字段也是相关的,因此我们可以取其中的一个作为代表。

3)进行特征选择

特征选择的主要目标是实现降维,在减少维度的同时仅需少数特征即可反映数据的关键属性。这也有助于提升分类器的一般化能力,并避免其因过拟合而失去泛化性能。

可以从相关性大的的每类属性中任意选一个作为代表,

依据三个指标:Mean值、Standard Error和Worst Case,在这三个特征中挑选出表现最佳的参数。

此外,在分析特征时可从compactness_mean、concavity_mean和concave_points_mean这三个指标中选择compactness_mean这一项指标,并由此能够将原本的10个属性数量减少到6个。

复制代码
    features_remain = ['radius_mean','texture_mean', 'smoothness_mean','compactness_mean','symmetry_mean', 'fractal_dimension_mean']

5、准备训练集和测试集

复制代码
 from sklearn.cross_validation import train_test_split

    
 train,test = train_test_split(data,test_size = 0.3)  #抽取30%的数据作为测试集,其余作为训练集
    
 train_X = train[features_remain]   #抽取特征选择的数值作为训练和测试数据
    
 train_y = train['diagnosis']
    
 test_X = test[features_remain]
    
 test_y = test['diagnosis']

在对训练数据进行处理之前, 需要完成数据的标准化处理. 使所有特征具有相似的尺度, 并避免由于维度差异带来的影响.

复制代码
 from sklearn.preprocessing import StandardScaler

    
 ss = StandardScaler()               #采用Z-Score标准化,保证每个特征维度的数据均值为0,方差为1
    
 train_X = ss.fit_transform(train_X)
    
 test_X = ss.transform(test_X)

6、让SVM做训练和预测

复制代码
 from sklearn import svm

    
 from sklearn import metrics
    
 model = svm.SVC()                   #创建SVM分类器
    
 model.fit(train_X,train_y)          #用训练集做训练
    
 prediction = model.predict(test_X)  #用测试集做预测
    
 print('准确率:',metrics.accuracy_score(prediction,test_y))
    
  
    
  
    
 准确率: 0.9122807017543859

得出结果准确率在90以上,说明训练结果还不错。

全部评论 (0)

还没有任何评论哟~