使用K近邻算法诊断乳腺癌
使用K近邻算法诊断乳腺癌
一、设计内容及目的
(一)设计内容
数据收集:收集包含乳腺癌相关特征的数据集,例如肿块大小、肿块形状、肿块表面的光滑度、肿块边缘的均匀性等。这些特征可以从乳腺癌病例的医疗记录中获取。
数据预处理:对数据进行清洗、特征选择和编码。确保数据格式的一致性和可用性。
数据划分:将数据集分为训练集和测试集,通常按照70%的数据用于训练,30%的数据用于测试。
特征标准化:对特征进行标准化处理,使其在同一尺度上,以确保不同特征对结果的影响是一致的。
模型训练:使用训练集训练KNN模型,选择适当的K值(最近邻数)。
模型预测:使用测试集评估KNN模型的性能,并对乳腺癌进行诊断预测。
模型评估:使用评估指标(如准确率、精确率、召回率、F1分数等)来评估模型的性能,查看模型的准确性和泛化能力。
超参数调优:通过交叉验证等技术调整KNN模型的超参数,以提高模型的预测性能。
(二)设计目的
近年我国乳腺癌发病率的增长速度却高出高发国家1~2个百分点。据国家癌症中心和卫生部疾病预防控制局2012年公布的2009年乳腺癌发病数据显示:全国肿瘤登记地区乳腺癌发病率位居女性恶性肿瘤的第1位,女性乳腺癌发病率(粗率)全国合计为42.55/10万,城市为51.91/10万,农村为23.12/10万。
早期的乳腺癌检测主要检查乳腺组织的异常肿块。如果发现一个肿块,那么就需要进行细针抽吸活检,然后在显微镜下检查细胞,从而确定肿块是良性还是恶性。如果能够通过机器学习建模,通过乳腺肿块的检测数据自动进行诊断,将会给医疗系统带来很大的益处。一方面,自动诊断能够大大提高检测效率。另一方面,结合大量不同历史案例的自动诊断能够使辅助医生进行决策,降低误判的风险。
二、总体设计
1. 数据源 :使用公开的乳腺癌诊断数据集作为案例的数据源。
2、数据标准化:
2.1、数据标准化:
对数据进行标准化处理,确保不同特征的值处于相同的尺度范围,避免特征值范围差异对算法的影响。
2.2、划分训练集和测试集:
将数据集划分为训练集和测试集,一般用于训练模型的数据为70%,用于测试模型的数据为30%。
3、模型训练:使用KNeighborsClassifier算法在训练集上训练乳腺癌诊断模型。
4、模型性能评估:通过对比我们构建的K近邻模型在测试数据上的预测结果breast_cancer_test_pred和测试样本真实的类标签,我们可以评估我们构建的乳腺癌诊断模型的应用效果。我们使用sklern.metrics包中的相关函数来计算评估结果。
5、模型性能提升
5.1、测试不同k取值对模型效果的影响:
调整KNeighborsClassifier算法中的K值来观察不同K值对模型性能的影响。
5.2、采用Z-score标准化方法:
采用Z-score标准化方法对数据进行标准化处理,可以进一步改善模型性能。
三、详细设计
(一)数据导入与训练模块设计
1.功能设计
1、使用pandas的read_csv()函数将CSV格式的乳腺癌数据集导入数据框中。
2、为了将自变量进行min-max标准化,我们需要实现一个min_max_normalize()函数。该函数输入为数值型向量x,对于x中的每一个取值,减去x的最小值,再除以x中数值的取值范围。
3、 由于缺少这样的未来数据,我们采用一种模拟的方法:将我们的数据集划分为训练集和测试集两部分。
4、为了使用训练数据进行分类,我们使用sklearn.neighbors包的K近邻算法实现类KNeighborsClassifier。
2.代码实现
import pandas as pd
breast_cancer = pd.read_csv("wisc_bc_data.csv")#注意路径
print breast_cancer.shape
breast_cancer.head(5)
(569, 32)
print breast_cancer.diagnosis.value_counts()
print breast_cancer.diagnosis.value_counts()/len(breast_cancer)
dignosis_dict = {"B":0,"M":1}
breast_cancer["diagnosis"] = breast_cancer["diagnosis"].map(dignosis_dict)
breast_cancer[["radius_mean", "area_mean","smoothness_mean"]].describe()
def min_max_normalize(x):
return (x - x.min())/(x.max() - x.min())
现在,我们可以将实现的min_max_normalize()函数对数据集进行标准化。
for col in breast_cancer.columns[1:31]:
breast_cancer[col] = min_max_normalize(breast_cancer[col])
breast_cancer.iloc[:,1:].describe()
from sklearn import cross_validation
y = breast_cancer['diagnosis']
del breast_cancer['diagnosis']
X = breast_cancer
breast_cancer_minmax_train, breast_cancer_minmax_test,\
breast_cancer_train_labels, breast_cancer_test_labels \
= cross_validation.train_test_split(X, y, test_size=0.3, random_state=0)
print breast_cancer_train_labels.value_counts()/len(breast_cancer_train_labels)
print breast_cancer_test_labels.value_counts()/len(breast_cancer_test_labels)
from sklearn.neighbors import KNeighborsClassifier
knn_model = KNeighborsClassifier(n_neighbors = 21)
knn_model.fit(breast_cancer_minmax_train, breast_cancer_train_labels)
breast_cancer_test_pred = knn_model.predict(breast_cancer_minmax_test)
(二)模型性能评估模块设计
1.功能设计
通过对比我们构建的K近邻模型在测试数据上的预测结果breast_cancer_test_pred和测试样本真实的类标签,我们可以评估我们构建的乳腺癌诊断模型的应用效果。我们使用sklern.metrics包中的相关函数来计算评估结果。
2.代码实现
from sklearn import metrics
print metrics.classification_report(breast_cancer_test_labels, breast_cancer_test_pred)
print metrics.confusion_matrix(breast_cancer_test_labels, breast_cancer_test_pred)
print metrics.accuracy_score(breast_cancer_test_labels, breast_cancer_test_pred)
******(三)**模型性能提升模块设计
1.功能设计
对于K近邻算法,K的不同取值选取会影响模型的效果。此外,不同的数据标准化方法也会对模型效果产生影响。 我们将分别探索K取值的改变和数据标准化方法的改变是否能够提升模型的预测结果。
我们将分别测试 k = 1,5,9,11,15,21,27 时模型的效果。由于模型整体预测准确率已经很高。 我们通过观察 假阴性(False Negative) 和 假阳性(False Positive) 的数目和 正确率(Accuracy) 来对比不同k取值下模型的效果。
在上述K近邻算法构建模型的过程中,我们使用min-max方法对数据进行标准化。 现在,现在我们尝试Z-score标准化方法,探索它能够提高我们的乳腺癌诊断模型的预测性能。 可以使用sklearn.preprocessing包中的scale()函数来对数据进行Z-score标准化。
2.代码实现
from sklearn import preprocessing
breast_cancer_zscore = pd.DataFrame(preprocessing.scale(breast_cancer),\
columns = breast_cancer.columns)
breast_cancer_zscore.head(5)
print breast_cancer_zscore.area_mean.mean()
print breast_cancer_zscore.area_mean.std()
breast_cancer_zscore_train, breast_cancer_zscore_test,\
breast_cancer_train_labels, breast_cancer_test_labels \
= cross_validation.train_test_split(breast_cancer_zscore, y, test_size=0.3, random_state=0)
#模型训练
knn_model_z = KNeighborsClassifier(n_neighbors = 5)
knn_model_z.fit(breast_cancer_zscore_train, breast_cancer_train_labels)
#模型预测
breast_cancer_test_pred_z = knn_model_z.predict(breast_cancer_zscore_test)
#性能评估
accuracy_z = metrics.accuracy_score(breast_cancer_test_labels, breast_cancer_test_pred_z)
confusion_mat_z = metrics.confusion_matrix(breast_cancer_test_labels, breast_cancer_test_pred_z)
print "k = 5"
print "\t 正确率: ", '%.2f '%(accuracy_z*100) + "%"
print "\t 假阴性:",confusion_mat_z[0,1]
print "","\t 假阳性:",confusion_mat_z[1,0]
四、程序调试结果及分析
(一)数据导入与训练模块调试
1、通过对csv文件的导入,输出行列

成功输出表示导入正确
2、 diagnosis变量为字符串格式,在正式建模之前需要将其进行整数编码,将良性(B)编码为0,将恶性(M)编码为1。

可见,在我们的569个样本中,良性样本和恶性样本分别有357和212个,占比分别为62.7%和37.3%。
我们详细观察30个自变量中的三个变量:radius_mean, area_mean和smoothness_mean。

观察这三个变量的统计信息,发现它们的取值范围不大一致。 radius_mean取值范围为6.98128.110,area_mean取值范围为143.52501.0,smoothness_mean取值范围为0.05263~0.16340。不同变量的测量尺度不一致会影响K近邻算法中的样本距离计算。 例如,如果上述三个变量直接参与距离计算,则area_mean变量将会对距离计算影响最大,从而会导致我们构建的分类模型过分依赖于area_mean变量。在应用K近邻等涉及距离计算的算法构建预测模型之前,我们需要对变量取值进行标准化。

可见,30个自变量都已经正确地标准化到0和1之间。
3、由于缺少这样的未来数据,我们采用一种模拟的方法:将我们的数据集划分为训练集和测试集两部分。 训练集用来构建模型,而测试集在模型构建中不能使用,只用来评估模型的性能。 在本案例中,我们将数据的70%(398个样本)用来训练模型,30%(171个样本)则用来测试模型。

可见,训练集和测试集中不同类别的样本分布趋向一致。现在,我们可以开始构建乳腺癌诊断模型了。
4、对于测试集中的每一个样本,将使用特定的距离计算方法找出k个近邻,其中k是一个可以指定的参数。 然后,通过这k个近邻样本的类标签进行投票,从而对测试样本进行分类。 如果不同类的票数相等,则测试样本会被随机分类。 当然,为了避免不同类票数相等这种情况的发生,对于二分类问题,通常将k设置成奇数。
(二)模型性能评估模块调试
我们使用sklern.metrics包中的相关函数来计算评估结果。

可见,对于108个良性样本,模型正确预测了106个,只有2个样本预测失败。 对于63个恶性样本,模型预测正确的有56个,正确预测比例为88.9%。 模型的整体预测正确率为 (106 + 56)/ 171 = 94.7%。 虽然这个正确率看起来很高,但是假阳性样本还有7个,这在实际医疗诊断中是严重的失误,因为将一个患有乳腺癌的患者诊断为良性会给患者带来严重的后果。 下一步,我们需要进一步寻找提升模型效果的方法。
(三)模型性能提升模块调试
** 1、测试不同k取值对模型效果的影响**

可见,当 k = 27时,假阴性数量最少,且假阴性数量仅为6,正确率达到最高。当然,这也只是在171个测试样本上的结果。
2、 采用Z-score标准化方法
可以使用sklearn.preprocessing包中的scale()函数来对数据进行Z-score标准化。在进行Z-score标准化后,变量的均值为0,标准差为1。 以area_mean变量为例,我们对我们标准化后的结果进行统计,以检验标准化是否正确。

可见,标准化后均值接近0,标准差为1。

当k=27时,新的模型假阳性数量减少5个。可见在我们的数据集中,使用Z-score标准化方法的模型效果比使用min-max标准化方法的模型效果更好。
五、心得体会
在实验中我们使用K近邻算法对乳腺癌数据集进行了分类,通过对训练集和测试集的正确分类率进行评估,可以得到模型的准确性。实验结果显示K近邻算法在乳腺癌诊断方面表现良好,准确率较高。然而,在实际应用中,还需综合考虑其他指标如召回率、精确率等来评估模型的性能,以更全面地评价算法的效果。
遇到编程中的错误是很正常的,解决问题的过程也是学习和提高技能的重要部分。通过这个问题,我学会了在使用scikit-learn库时要及时更新代码,因为在不同版本中可能会有一些模块被弃用或移除。另外,及时查阅官方文档和社区讨论也是解决问题的好方法,因为这样可以了解到最新的更新和最佳实践。
