数据分析实战 | KNN算法——病例自动诊断分析

news2024/11/18 18:20:16

目录

一、数据及分析对象

二、目的及分析任务

三、方法及工具

四、数据读入

五、数据理解

六、数据准备

七、模型训练

八、模型评价

九、模型调参

十、模型改进

十一、模型预测


一、数据及分析对象

CSV文件——“bc_data.csv”

数据集链接:https://download.csdn.net/download/m0_70452407/88524905

该数据集主要记录了569个病例的32个属性,主要属性/字段如下:

(1)ID:病例的ID。

(2)Diagnosis(诊断结果):M为恶性,B为良性。该数据集共包含357个良性病例和212个恶性病例。

(3)细胞核的10个特征值,包括radius(半径)、texture(纹理)、perimeter(周长)、面积(area)、平滑度(smoothness)、紧凑度(compactness)、凹面(concavity)、凹点(concave points)、对称性(symmetry)和分形维数(fractal dimension)等。同时,为上述10个特征值分别提供了3种统计量,分别为均值(mean)、标准差(standard error)和最大值(worst or largest)。

二、目的及分析任务

理解机器学习方法在数据分析中的应用——KNN方法进行分类分析。

(1)样本为训练集进行有监督学习,并预测——“诊断结果(diagnosis)”。

(2)以剩余记录为测试集,进行KNN建模。

(3)按KNN模型预测测试集的dignosis类型。

(4)按KNN模型给出的diagnosis“预测类型”与数据集bc_data.csv自带的“实际类型”进行对比分析,验证KNN建模的有效性。

三、方法及工具

Python语言及scikit-learn包

四、数据读入

import pandas as pd
bc_data=pd.read_csv("D:\\Download\\JDK\\数据分析理论与实践by朝乐门_机械工业出版社\\第4章 分类分析\\bc_data.csv"
                   ,header=0)
bc_data.head()

五、数据理解

对数据框bc_data进行探索性分析,这里采用的实现方法为调用pandas包中数据框(DataFrame)的describe()方法。

bc_data.describe()

除了describe()方法,还可以调用shape属性和pandas_profiling包对数据框进行探索性分析。

bc_data.shape
(569, 32)

六、数据准备

在数据框bc_data中,对于乳腺癌诊断分析有用的数据为细胞核的10个特征值,为了将该数据值提取出来,需要在数据框bc_data的基础上删除列名为“id”和“diagnosis”的数据,删除后的数据框命名为“data”,实现方式为调用数据框的drop()方法,并使用该包的head()方法观察数据情况。

data=bc_data.drop(['id'],axis=1)
X_data=data.drop(['diagnosis'],axis=1)
X_data.head()

 接着,调用NumPy的ravel()方法对数据框data中命名为“diagnosis”的列信息以视图形式(view)返回,并以一维数组形式输出。

import numpy as np
y_data=np.ravel(data[['diagnosis']])
y_data[0:6]
array(['M', 'M', 'M', 'M', 'M', 'M'], dtype=object)

为了实现基于KNN算法乳腺癌自动诊断的目标,先将data数据框信息随机分为训练集和测试集两部分。采用的实现方式为调用scikit-learn包中model_selection模块的train_test_split()方法,设定训练集数据容量占总数居的75%,剩下的为测试集数据,调用pandas包中数据框(DataFrame)的describe()方法。

from sklearn.model_selection import train_test_split
X_trainingSet,X_testSet,y_trainingSet,y_testSet=train_test_split(
    X_data,y_data,random_state=1,test_size=0.25)
X_trainingSet.describe()

 除了describe()方法,还可以调用shape属性和pandas_profiling包对数据框进行探索性分析。

X_trainingSet.shape
(426, 30)

 同时,对测试集数据框也对其做相同的处理。

X_testSet.describe()

X_testSet.shape
(143, 30)

对训练集数据进行“学习训练”后,自动获取它的均值和方差,再分别对训练集和测试集进行“归一化”处理。采用的实现方式为调用scikit-learn包中的preprocessing模块的StandardScaler()方法。其中,训练集数据的归一化处理如下:

from sklearn.preprocessing import StandardScaler
means_normalization=StandardScaler()   #均值归一化处理
means_normalization.fit(X_trainingSet)   #进行训练集的“诊断学习”,得到均值和方差
X_train_normalization=means_normalization.transform(X_trainingSet)
X_train_normalization
array([[ 0.30575375,  2.59521918,  0.46246107, ...,  1.81549702,
         2.10164609,  3.38609913],
       [ 0.23351721, -0.05334893,  0.20573083, ...,  0.5143837 ,
         0.14721854,  0.05182385],
       [ 0.15572401,  0.18345881,  0.11343692, ...,  0.69446859,
         0.263409  , -0.10011179],
       ...,
       [ 0.85586279,  1.19276558,  0.89773369, ...,  1.12967374,
         0.75591781,  2.97065009],
       [-0.02486734,  0.44095848, -0.08606303, ..., -0.52515632,
        -1.1291423 , -0.45561747],
       [-0.30270019, -0.20968802, -0.37543871, ..., -0.967865  ,
        -1.54361274, -1.31500348]])

对测试集数据也采用相同的方式进行归一化处理。

X_test_normalization=means_normalization.transform(X_testSet)
X_test_normalization
array([[ 0.15850234, -1.23049032,  0.25369143, ..., -0.05738582,
        -0.08689656,  0.48863884],
       [-0.2638036 , -0.15450952, -0.23961754, ...,  1.41330744,
         1.77388495,  2.02105229],
       [-0.32492682, -0.76147305, -0.35407811, ..., -0.1354226 ,
         0.87210827,  0.71179432],
       ...,
       [ 0.25852216, -0.06024625,  0.21500053, ..., -0.03937733,
        -1.03202789, -0.84910706],
       [ 1.46709506,  0.95825694,  1.49824869, ...,  0.62693676,
         0.07438274, -0.45739797],
       [-0.61942964,  0.42256565, -0.6261235 , ..., -0.48013509,
         0.34318156, -0.6134881 ]])

七、模型训练

训练集进行学习概念“诊断结果”,利用测试集进行KNN建模。通过对训练和测试数据进行适当的处理后,接下来进行模型参数的确定。KNN模型类别有暴力法、KD树和球树。暴力法适用于数据较少的形式,而KD树在较多的数据中更有优势,考虑到算法效率问题,结合本项目中数据框的数据量,选择KD树进行建模,首先取得KNN分类器,并使用内置参数调整KNN三要素。

这里采用的模型训练实现方式为scikit-learn包中的neighbors模块的KNeighborsClassifier()方法,其中对于设置的各项参数解释如下:

(1)algorithm表示快速k近邻搜索算法,这里确定的算法模型为KD树。

(2)leaf_size是构造KD树的大小,默认为30。

(3)metric用于距离度量,默认度量是minkowski。

(4)metric_params表示距离公式的其他关键参数,并不是很重要,使用默认的None。

(5)n_jobs是并行处理设置,使用默认的None。

(6)n_neighbors表示初始设定的近邻树,即KNN算法中的k值。

(7)p代表距离度量公式,其中1为哈曼顿距离公式,2为欧氏距离公式,这里使用欧氏距离公式进行距离度量,将p值设置为2。

(8)weights表权重,默认为uniform(均等权重)。

接着,利用训练函数fit()和预测函数predict()实现对训练集已知数据和测试集数据的对比输出。

from sklearn.neighbors import KNeighborsClassifier
myModel=KNeighborsClassifier(algorithm="kd_tree",
                             leaf_size=30,
                             metric="minkowski",
                             metric_params=None,
                             n_jobs=None,
                             n_neighbors=5,
                             p=2,
                             weights="uniform")
myModel.fit(X_trainingSet,y_trainingSet)
y_predictSet=myModel.predict(X_testSet)

 fit()函数数据训练结果如下:

y_testSet
array(['B', 'M', 'B', 'M', 'M', 'M', 'M', 'M', 'B', 'B', 'B', 'M', 'M',
       'B', 'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'M', 'B', 'M', 'B',
       'B', 'M', 'M', 'M', 'M', 'B', 'M', 'M', 'B', 'B', 'M', 'B', 'M',
       'B', 'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'B', 'M', 'M', 'M',
       'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'B', 'M', 'B', 'B', 'B',
       'B', 'B', 'M', 'B', 'B', 'B', 'B', 'M', 'M', 'B', 'M', 'M', 'M',
       'B', 'M', 'B', 'M', 'B', 'M', 'B', 'B', 'M', 'B', 'M', 'B', 'B',
       'M', 'B', 'B', 'M', 'M', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
       'B', 'B', 'B', 'B', 'M', 'M', 'M', 'B', 'B', 'B', 'M', 'M', 'B',
       'B', 'B', 'B', 'B', 'M', 'M', 'B', 'B', 'M', 'M', 'B', 'M', 'M',
       'B', 'B', 'B', 'M', 'B', 'M', 'M', 'B', 'B', 'B', 'M', 'M', 'B'],
      dtype=object)

 用predict()函数进行预测的结果如下:

y_predictSet
array(['M', 'M', 'B', 'M', 'M', 'M', 'M', 'M', 'B', 'B', 'B', 'M', 'M',
       'B', 'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'M', 'B', 'M', 'B',
       'B', 'M', 'M', 'M', 'M', 'B', 'M', 'B', 'B', 'B', 'M', 'B', 'B',
       'B', 'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'B', 'M', 'M', 'M',
       'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'B', 'M', 'B', 'M', 'B',
       'B', 'B', 'M', 'B', 'B', 'B', 'B', 'M', 'M', 'B', 'M', 'B', 'B',
       'B', 'M', 'B', 'M', 'B', 'M', 'B', 'B', 'M', 'B', 'M', 'B', 'B',
       'M', 'B', 'B', 'M', 'M', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
       'B', 'B', 'B', 'B', 'M', 'M', 'B', 'B', 'B', 'B', 'M', 'M', 'B',
       'B', 'B', 'B', 'B', 'M', 'M', 'B', 'B', 'M', 'M', 'M', 'M', 'M',
       'B', 'B', 'B', 'M', 'B', 'M', 'M', 'M', 'B', 'B', 'M', 'M', 'B'],
      dtype=object)

最后,使用get_params()方法实现对模型各参数的查询:

myModel.get_params()
{'algorithm': 'kd_tree',
 'leaf_size': 30,
 'metric': 'minkowski',
 'metric_params': None,
 'n_jobs': None,
 'n_neighbors': 5,
 'p': 2,
 'weights': 'uniform'}

由上述输出结果可以看出,使用get_params()方法查询参数是以字典结构的形式展现,并且可以看到参数结果与之前设置保持一致。

八、模型评价

为了评价所建立模型的性能,采用“预测准确率(Accuracy Score)”参数,具体实现方式是调用scikit-learn包的metrics模块的accuracy_score()方法。

from sklearn.metrics import accuracy_score
accuracy_score(y_testSet,y_predictSet)
0.9370629370629371

 通过结果输出可知,模型预测结果的准确率约为93.71%,可以考虑尝试进一步优化。

九、模型调参

通过前面分析可知,k值的大小对模型预测结果会产生很多的影响。为此,接下来利用准确率函数score()来实现k值范围在1~22的准确率值计算。

import matplotlib.pyplot as plt
NumberOfNeighbors=range(1,23)
KNNs=[KNeighborsClassifier(n_neighbors=i) for i in NumberOfNeighbors]
range(len(KNNs))
scores=[KNNs[i].fit(X_trainingSet,y_trainingSet).score(X_testSet,y_testSet) for i in range(0,22)]
plt.plot(NumberOfNeighbors,scores)
plt.title("Elbow Curve")
plt.xlabel("Number of Neighbors")
plt.ylabel("Score")

通过图标信息可以看到,当k的值(即n_neighbors)为4时,模型预测得分最高,因此接下来对模型参数进行改进。

十、模型改进

myModel_prove=KNeighborsClassifier(algorithm="kd_tree",
                             leaf_size=30,
                             metric="minkowski",
                             metric_params=None,
                             n_jobs=None,
                             n_neighbors=4,
                             p=2,
                             weights="uniform")
myModel_prove.fit(X_trainingSet,y_trainingSet)
y_predictSet=myModel_prove.predict(X_testSet)

十一、模型预测

 fit()函数数据训练结果如下:

y_predictSet
array(['B', 'M', 'B', 'M', 'M', 'M', 'M', 'M', 'B', 'B', 'B', 'B', 'M',
       'B', 'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'M', 'B', 'M', 'B',
       'B', 'M', 'M', 'M', 'M', 'B', 'M', 'B', 'B', 'B', 'M', 'B', 'B',
       'B', 'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'B', 'M', 'M', 'M',
       'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'B', 'M', 'B', 'M', 'B',
       'B', 'B', 'M', 'B', 'B', 'B', 'B', 'M', 'M', 'B', 'M', 'B', 'B',
       'B', 'M', 'B', 'M', 'B', 'M', 'B', 'B', 'M', 'B', 'M', 'B', 'B',
       'M', 'B', 'B', 'M', 'M', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
       'B', 'B', 'B', 'B', 'M', 'M', 'B', 'B', 'B', 'B', 'M', 'M', 'B',
       'B', 'B', 'B', 'B', 'M', 'M', 'B', 'B', 'M', 'M', 'M', 'M', 'M',
       'B', 'B', 'B', 'M', 'B', 'M', 'M', 'B', 'B', 'B', 'M', 'M', 'B'],
      dtype=object)

 用predict()函数进行预测的结果如下:

y_predictSet
array(['B', 'M', 'B', 'M', 'M', 'M', 'M', 'M', 'B', 'B', 'B', 'B', 'M',
       'B', 'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'M', 'B', 'M', 'B',
       'B', 'M', 'M', 'M', 'M', 'B', 'M', 'B', 'B', 'B', 'M', 'B', 'B',
       'B', 'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'B', 'M', 'M', 'M',
       'B', 'B', 'B', 'B', 'B', 'M', 'B', 'B', 'B', 'M', 'B', 'M', 'B',
       'B', 'B', 'M', 'B', 'B', 'B', 'B', 'M', 'M', 'B', 'M', 'B', 'B',
       'B', 'M', 'B', 'M', 'B', 'M', 'B', 'B', 'M', 'B', 'M', 'B', 'B',
       'M', 'B', 'B', 'M', 'M', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
       'B', 'B', 'B', 'B', 'M', 'M', 'B', 'B', 'B', 'B', 'M', 'M', 'B',
       'B', 'B', 'B', 'B', 'M', 'M', 'B', 'B', 'M', 'M', 'M', 'M', 'M',
       'B', 'B', 'B', 'M', 'B', 'M', 'M', 'B', 'B', 'B', 'M', 'M', 'B'],
      dtype=object)

为了评价所建立模型的性能,采用“预测准确率(Accuracy Score)”参数,具体实现方式是调用scikit-learn包的metrics模块的accuracy_score()方法。

accuracy_score(y_testSet,y_predictSet)
0.9440559440559441

从输出结果可以看出,模型的预测准确率提高了,说明对模型进行了优化。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1196464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

万物皆数——用matlab求解二阶微分方程

一、背景 毕达哥拉斯的“万物皆数”哲学观点表达了一个理念,即宇宙万物都可以通过数学语言来描述,数是万物的本原。 勾股定理就是毕达哥拉斯提出,因此在西方勾股定理也被叫做毕达哥拉斯定理。 工科类的专业,越到后面越感觉到数学…

永达理简析:利用保险的“财务规划”功能维持退休后生活水平

现代社会环境背景下,“自养自老”已经是一种未来养老趋势,很多人会为自己准备一份长期、比较周全的保障,这样财务规划不仅会分担子女的压力,也让自己有一个长远的保障。在各种财务储蓄工具中,商业保险占据着不可取代的…

聊聊性能测试的左移右移

前面的文章中,分享过我对于测试左移右移的一些思考和实践方法。有同学在后台留言问我:常规的性能测试一般都是在测试阶段集成测试时候才开始介入,很容易测试时间不够,可不可以借鉴测试左移右移的思路,更早的介入和发现…

CKA认证模块②-K8S企业运维和落地实战

CKA认证模块②-K8S企业运维和落地实战 Pod高级实战-Pod生命周期-启动钩子,停止钩子 Pod生命周期完整流程介绍 容器钩子; 容器探测; Pod重启策略; Pod的终止过程; Init容器; 初始化容器最佳实践 初始化容器与主容器区别是? init容器没有readinessProbe… [rootk8s-mast…

经典的测试开发面试题

1、你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决? 首先,将问题提交到缺陷管理库进行备案。 然后,要获取判断的依据和标准: 根绝需求说明书,产品说明、设计文档等&…

迷雾系统-人物驱散迷雾

使用linerRender,将人物移动数据动态添加进去,同样是特殊层级让FogCamera渲染 EndCapVertices的数量越多,矩形就变为一个椭圆形的形状,更适合圆形视野探索 当拐点的两个点距离太近,LineRender会发生扭曲,解决方案是在…

Redis五种数据类型及命令操作(一)

🎈个人公众号:🎈 :✨✨✨ 可为编程✨ 🍟🍟 🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵 🍉本篇简介:🍉 本篇记录Redis五种数据类型及命令操作,如…

Java基础-面向对象进阶-多态, 包, final, 权限修饰符,代码块

Java基础-面向对象进阶-多态, 包, final, 权限修饰符,代码块 多态多态的概述多态中调用成员的特点多态的优势和弊端多态练习 包final权限修饰符代码块来源Gitee地址 多态 多态的概述 多态: 对象的多种形态多态的前提 有继承/实现关系有父类引用指向子类对象有方法的重写 多态…

Netty--NIO(Non-blocking IO)基础--三大组件

NIO(Non-blocking IO)是一种非阻塞的IO模型,它通过引入Channel和Selector的概念,使得一个线程能够管理多个通道,从而提高了IO操作的效率。本文将介绍NIO的三大组件:Channel、Buffer、以及Selector&#xff…

【C++对象模型】构造函数II

构造函数语意学 》》构造函数语意学I—默认构造函数的构造操作《《 》》构造函数语意学II—拷贝构造函数的构造操作《《 》》构造函数语意学III—程序转化语意学《《 拷贝构造函数的构造操作 有三种情况,会以一个object的内容作为另一个class object的初值。 1.…

跨镜头目标融合__追踪之目标重识别研究(跨镜头目标追踪)

文章目录 标题:跨镜头目标融合;目标重识别;跨镜头目标追踪; 1 目的:2 实现方法/策略:2.1 目标类型位置匹配(或考虑结合目标轨迹)2.2 目标重识别2.3 目标类型位置匹配(轨迹)目标重识别…

Linux centos系统中添加磁盘

为了学习与训练文件系统或磁盘的分区、格式化和挂载/卸载,我们需要为虚拟机添加磁盘。根据需要,可以添加多块不同大小的磁盘。具体操作讨论如下,供参考。 一、添加 1.开机前 有两个地方,可选择打开添加硬盘对话框 (1)双击左侧…

暖手宝+充电宝设计方案 可实现快速升温和充电 低成本充电电流可选

充电暖手宝因为它的便携性,既能供暖又能当充电宝使用而备受人们喜爱。是冬天暖手供暖的必备神器。 目前,市场常见的暖手宝大致有三个类型,分别是加热水的热水袋、通过化学反应放热的铁粉袋子和锂电供电的智能暖手宝。与常见的暖手宝不同&…

计算机网络期末复习-Part3

1、rdt1.0,rdt2.0,rdt3.0的底层信道模型 RDT 1.0: 完全可靠的底层信道,没有比特差错,也没有分组丢失。 RDT 2.0: 具有比特差错的底层信道,有比特差错,但没有分组丢失。 RDT 3.0: 具有差错和丢包的底层信道…

如何将BMP图片批量转为PNG透明图片,并去掉BMP黑色背景

将BMP图片批量转为PNG透明图片,并去掉BMP黑色背景,这里推荐一款软件bmp2png,关键是免费的。截图如下: 这个小软件不仅可以将bmp图片批量转为png图片,而且还增加了压缩功能,导出png图片时压缩导出图片&#…

jbase引入连接池

网站主题和代码生成器完事之后,ORM成为主要工作,之前只是搭了ORM的大体结构,没有详细优化和实现。这次引入连接池、把连接串信息从配置取、调整抛出异常。 连接池包选择c3p0,因为他稳定,用的多,下载引入c3…

Maven打包引入本地依赖包

Maven打包引入本地依赖包 SpringBoot 工程,Maven 在构建项目时,如何引入本地 Jar 包? 适合场景: 引用的依赖不在 Maven 仓库第三方公司提供的 SDK 包Maven 内网离线开发引入被定制改动过的 Jar 包 解决方法: 在 I…

nature日报:为什么印度德里现在的空气污染如此严重?

为什么印度德里现在的空气污染如此严重? 后季风季节为印度大城市的空气污染积累创造了理想的条件。 本文整理扩展自2023年11月10日nature杂志的NEWS EXPLAINER——Why is Delhi’s air pollution so bad right now? (nature.com) Highlights 季风期间&#xff0…

卡码网语言基础课 | 11. 句子缩写

目录 一、 字符串大小的比较 二、 ASCII码值 三、 基本框架代码 四、 解题思路 4.1 首字母问题 4.2 判定小写字母 4.3 小写字母转换为大写字母 五、空格判断 六、 代码模块化 6.1 满足的条件 6.2 代码完善 七、 题目解答 7.1 原始代码 7.2 改进代码 八、 拓展与…

Java_继承和多态

文章目录 前言继承继承语法继承总结super指定访问父级子类构造方法super和this再谈初始化(执行顺序)protected 关键字继承方式final 关键字继承与组合 多态动态绑定与静态绑定多态实现条件重写 前言 适合复习看 继承 继承语法 修饰符 class 子类 extends 父类 { // ... }子类…