[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_mean 和compactness_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
