Advertisement

[DA45] 使用SVM进行乳腺癌检测

阅读量:

数据集来自美国威斯康星州的乳腺癌诊断数据集. 由于数据特征较多, 本例使用相关性分析与主成分分析两种方法进行降维了处理, 再通过SVM支持向量机模型对数据进行了分类.

一. 数据预处理

加载数据后对数据进行探索, 可以看到数据可以分为5类:

(一) ID

(二) diagnose

诊断结果. 其中'B'代表良性, 包含357例; 'M'代表恶性, 包含212例.

(三) 包含mean的数据

radius_mean 半径平均值
texture_mean 文理平均值
perimeter_mean 周长平均值
area_mean 面积平均值
smoothness_mean 平滑程度平均值
compactness_mean 紧密度平均值
concavity_mean 凹度平均值
concave points_mean 凹缝平均值
symmetry_mean 对称性平均值
fractal_dimension_mean 分形维数平均值

(四) 包含se的数据

内容与包含mean的数据大致相同, 为各个数据的方差.

(五) 包含worst的数据

内容与包含mean的数据大致相同, 为最严重的数据样例(最坏值).

数据不包含缺失值, 由于包含平均值mean的数据可反应数据的一般情况, 故使用包含平均值的10列进行分析, diagnose列用数字0代表良性, 数字1代表恶性, 作为数据的标签.

相关代码:

复制代码
 # 读取并探索数据

    
 inputfile = './data.csv'
    
 data = pd.read_csv(inputfile)
    
 print(data.head())
    
 print(data.describe())
    
 print(data.info())
    
 print(data.diagnosis.value_counts())
    
  
    
 # 数据清洗与分类
    
 # print(data.columns)
    
 data_y = data.diagnosis.replace(['B', 'M'], [0, 1])
    
 # print(data_y.value_counts())
    
 # 把平均值数据, 方差数据与最坏值数据分开
    
 data_mean = data[data.columns[2:12]]
    
 # print(data_mean.columns)
    
 data_se = data[data.columns[12:22]]
    
 # print(data_se.columns)
    
 data_worst = data[data.columns[22:32]]
    
 # print(data_worst.columns)

(二) 通过相关性分析手动降维

首先对提取出来的data_mean求得各特征之间的相关性系数, 使用seaborn绘制相关性热力图如下:

在图中我们看到, radius_mean与texture_mean, area_mean呈现了非常强的正相关性, compactness_mean也与convavity_mean和concave points_mean有较强的正相关性, 在此我们手动选取 radius_meancompactness_mean 作为各自的代表特征, 把数据从10维降到6维. 在通过sklearn中的StandardScaler与train_test_split方法进行标准化及训练-测试集分割, 最后使用线性支持向量机分类模型进行预测, 模型的评分为0.9298.

相关代码:

复制代码
 # 1. 相关性分析降维

    
 # 画相关性系数图
    
 mean_corr = data_mean.corr()
    
 sns.heatmap(mean_corr, annot=True)
    
 plt.show()
    
 # 特征选择
    
 features1 = data[['radius_mean', 'texture_mean', 'smoothness_mean',
    
               'compactness_mean', 'symmetry_mean', 'fractal_dimension_mean']]
    
 # 标准化
    
 ss = StandardScaler()
    
 features1 = ss.fit_transform(features1)
    
 # 训练集数据集分割
    
 train_x, test_x, train_y, test_y = train_test_split(features1, data_y, test_size=.3, random_state=33)
    
 # LinearSVC模型
    
 model1 = LinearSVC()
    
 model1.fit(train_x, train_y)
    
 pre_1 = model1.predict(test_x)
    
 print('模型1得分:', accuracy_score(test_y, pre_1))

(三) 主成分分析法降维

使用sklearn中的管线pipeline连接Z-Score规范化模型与主成分分析模型, 使原数据在进行标准化后PCA降维, 为保证和相关性分析降维方法的可比性, 在PCA模型中设置参数n_components=6使数据降为6维, 在训练-测试集分割时使用相同随机种子数random_state=33.

通过打印pca.explained_variance_ratio_可以看到经过主成分分析降维后新的维度的贡献率分别为:

[ 0.5478588 0.25187136 0.08806152 0.04990094 0.03725392 0.01241417]

6个新维度的贡献率之和大于98% , 已经可以很好地代表原数据.

PCA降维后的LinearSVC模型评分为0.9357 , 表明在此特定条件下, 使用主成分分析降维方法要好于通过相关性分析手动降维的方法.

相关代码:

复制代码
 # 2. 主成分分析降维

    
 # PCA 模型
    
 pca = PCA(n_components=6)
    
 # pca = PCA(n_components='mle')
    
 model2 = Pipeline([
    
     ('StandardScaler', StandardScaler()),
    
     ('PCA', pca)])
    
 features2 = model2.fit_transform(data_mean)
    
 print(features2.shape)
    
 print('贡献率:', pca.explained_variance_ratio_)
    
 # 训练数据集分割
    
 train_x, test_x, train_y, test_y = train_test_split(features2, data_y, test_size=.3, random_state=33)
    
 # LinearSVC模型
    
 model2 = LinearSVC()
    
 model2.fit(train_x, train_y)
    
 pre_2 = model2.predict(test_x)
    
 print('模型2得分:', accuracy_score(test_y, pre_2))

完整代码及数据请查阅:https://github.com/Vincentchu9527/breast_cancer_01

全部评论 (0)

还没有任何评论哟~