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

这篇博客介绍了如何利用SVM进行乳腺癌检测,通过美国威斯康星州的乳腺癌数据集,进行了数据预处理,包括相关性分析和主成分分析(PCA)两种降维方法。相关性分析选择了radius_mean和compactness_mean作为代表特征,PCA降维保留了98%以上的数据贡献率。最终,PCA降维后的模型得分0.9357,优于手动降维的0.9298。

        数据集来自美国威斯康星州的乳腺癌诊断数据集. 由于数据特征较多, 本例使用相关性分析与主成分分析两种方法进行降维了处理, 再通过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

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值