【Python机器学习系列】建立KNN模型预测心脏疾病(完整实现过程)

这是Python程序开发系列原创文章,我的第198篇原创文章。

一、问题

 对于表格数据,一套完整的机器学习建模流程如下:

图片

        针对不同的数据集,有些步骤不适用即不需要做,其中橘红色框为必要步骤,由于数据质量较高,本文有些步骤跳过了,跳过的步骤将单独出文章总结!同时欢迎大家关注翻看我之前的一些相关文章。

一文彻底搞懂机器学习中的归一化与反归一化问题

【Python机器学习系列】一文彻底搞懂机器学习中表格数据的输入形式(理论+源码)

【Python特征工程系列】利用随机森林模型分析特征重要性(源码)

【Python特征工程系列】8步教你用决策树模型分析特征重要性(源码)

【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂它

【Python机器学习系列】建立决策树模型预测心脏疾病(完整实现过程)

【Python机器学习系列】建立支持向量机模型预测心脏疾病(完整实现过程)

【Python机器学习系列】建立逻辑回归模型预测心脏疾病(完整实现过程)

        K最近邻(K-Nearest Neighbors,KNN)是一种基本的监督学习算法,用于分类和回归问题。KNN算法基于实例之间的相似性度量,通过将新样本与训练集中的最近邻样本进行比较,来进行预测或分类。KNN算法的基本思想是:如果一个样本在特征空间中的K个最近邻中的大多数属于某个类别,那么该样本很可能属于该类别。KNN算法不需要显式的训练过程,而是在预测阶段对每个新样本进行计算和比较。

        KNN算法的关键参数是K值,即选择的最近邻样本的数量。较小的K值会使模型更加敏感,容易受到噪声的影响,而较大的K值会使模型更加平滑,但可能忽略了样本内部的细节。KNN算法的优点包括简单易懂、不需要训练过程(即懒惰学习)和对于非线性问题具有较好的适应性。然而,KNN算法的缺点是计算复杂度高,对于大型数据集和高维数据效果可能不佳,并且对于不平衡数据集和噪声敏感。在实际应用中,可以通过交叉验证或网格搜索等技术来选择合适的K值,并对数据进行预处理(如特征缩放)以提高算法的性能。scikit-learn是一个流行的Python机器学习库,提供了各种机器学习算法的实现,包括K近邻(KNN)算法。在scikit-learn中,KNN算法的实现主要集中在sklearn.neighbors模块中。

        本文将实现基于心脏疾病数据集建立KNN模型对心脏疾病患者进行分类预测的完整过程。

二、实现过程

导入必要的库

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_curve
from sklearn.metrics import auc
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

1、准备数据

data = pd.read_csv(r'Dataset.csv')
df = pd.DataFrame(data)

df:

图片

数据基本信息:

print(df.head())
print(df.info())
print(df.shape)
print(df.columns)
print(df.dtypes)
cat_cols = [col for col in df.columns if df[col].dtype == "object"] # 类别型变量名
num_cols = [col for col in df.columns if df[col].dtype != "object"] # 数值型变量名

2、提取特征变量和目标变量

target = 'target'
features = df.columns.drop(target)
print(data["target"].value_counts()) # 顺便查看一下样本是否平衡

3、数据集划分

df = shuffle(df)
X_train, X_test, y_train, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=0)

4、模型的构建与训练

# 模型的构建与训练
training_accuracy = []
test_accuracy = []
# try n_neighbors from 1 to 10
neighbors_settings = range(1, 11)
for n_neighbors in neighbors_settings:knn = KNeighborsClassifier(n_neighbors=n_neighbors)  knn.fit(X_train, y_train)  training_accuracy.append(knn.score(X_train, y_train))  test_accuracy.append(knn.score(X_test, y_test))  plt.figure()
plt.plot(neighbors_settings, training_accuracy, label="training accuracy")
plt.plot(neighbors_settings, test_accuracy, label="test accuracy")
plt.ylabel("Accuracy")
plt.xlabel("n_neighbors")
plt.legend()model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)

选择最佳的K=5:

图片

参数详解:

from sklearn.neighbors import KNeighborsClassifier
KNeighborsClassifier(n_neighbors = 5,weights='uniform',algorithm = '',leaf_size = '30',p = 2,metric = 'minkowski',metric_params = None,n_jobs = None)

- n_neighbors:这个值就是指 KNN 中的 “K”了。前面说到过,通过调整 K 值,算法会有不同的效果。

- weights(权重):最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,决定了如何分配权重。参数选项如下:       

  •  'uniform':不管远近权重都一样,就是最普通的 KNN 算法的形式。       

  • 'distance':权重和距离成反比,距离预测目标越近具有越高的权重。       

  • 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。

- algorithm:在 sklearn 中,要构建 KNN 模型有三种构建方式,1. 暴力法,就是直接计算距离存储比较的那种放松。2. 使用 kd 树构建 KNN 模型 3. 使用球树构建。其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 KD 树构建 KNN 模型,而当 KD 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下: • 'brute' :蛮力实现 • 'kd_tree':KD 树实现 KNN • 'ball_tree':球树实现 KNN • 'auto':默认参数,自动选择合适的方法构建模型 不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 'brute'

- leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的,当使用KD树或球树,它就是是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,否则速度过慢不说,还容易过拟合。

- p:和metric结合使用的,当metric参数是"minkowski"的时候,p=1为曼哈顿距离, p=2为欧式距离。默认为p=2。

- metric:指定距离度量方法,一般都是使用欧式距离。

        • 'euclidean' :欧式距离

        • 'manhattan':曼哈顿距离

        • 'chebyshev':切比雪夫距离

        • 'minkowski':闵可夫斯基距离,默认参数

- n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

5、模型的推理与评价

y_pred = model.predict(X_test)
y_scores = model.predict_proba(X_test)
acc = accuracy_score(y_test, y_pred) # 准确率acc
cm = confusion_matrix(y_test, y_pred) # 混淆矩阵
cr = classification_report(y_test, y_pred) # 分类报告
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:, 1], pos_label=1) # 计算ROC曲线和AUC值,绘制ROC曲线
roc_auc = auc(fpr, tpr)
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.show()

cm和cr:

图片

ROC:

图片

三、小结

        本文利用scikit-learn(一个常用的机器学习库)实现了基于心脏疾病数据集建立KNN模型对心脏疾病患者进行分类预测的完整过程。

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信!    

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

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

相关文章

4点优势,昂首资本使用浮动差价不使用固定差价的原因

在交易中,很多投资者和昂首资本一样,会使用浮动点差而不使用固定点差,那是因为投资者和昂首资本一样认为,使用浮动差价交易会比使用固定价差交易更有优势。 首先在大部分交易时段,价差缩小。正如投资者和昂首资本所知…

6. 逻辑删除

逻辑删除对应的是物理删除,分别介绍一下这两个概念: 物理删除 :指的是真正的删除,即:当执行删除操作时,将数据表中的数据进行删除,之后将无法再查询到该数据逻辑删除 :并不是真正意…

JavaScript常用事件详解

一、用于form(表单)的事件 在网页中经常会遇到一些表单的验证,是通过事件进行处理的,比如用户输入用户名之后,及时显示用户是否被注册 用于form(表单)的事件 事件名功能 onblur 当元素失…

数据挖掘实战-基于机器学习的电商文本分类模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

数据结构学习之顺序栈应用的案例(有效的括号)

实例要求: 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效; 有效字符串需满足的条件: 1、左括号必须用相同类型的右括号闭合; 2、左括号必须…

【面试合集】1.说说你对微信小程序的理解?优缺点?

面试官:说说你对微信小程序的理解?优缺点? 一、是什么 2017年,微信正式推出了小程序,允许外部开发者在微信内部运行自己的代码,开展业务 截至目前,小程序已经成为国内前端的一个重要业务&…

从传统到智能:机器视觉检测赋能PCB行业数字化转型!

PCB板在现代电子设备中是一个重要的组成部分,它是用来集成各种电子元器件的信息载体。在电子领域中,PCB板有着广泛的应用,而它的质量直接影响到产品的性能。随着电子科技技术和电子制造业的发展,贴片元器件的体积 变小&#xff0c…

亚马逊怎么防止店铺关联?

亚马逊(Amazon)为了确保公平竞争和防止不当行为,采取了一些措施来防止店铺关联,即通过不同的方式将多个店铺相关联,以获取不正当的竞争优势。以下是一些亚马逊防止店铺关联的主要措施: 同一经营者规定&…

VMware workstation搭建与安装AlmaLinux-9.2虚拟机

VMware workstation搭建与安装AlmaLinux-9.2虚拟机 适用于需要在VMware workstation平台安装AlmaLinux-9.2(最小化安装、无图形化界面)虚拟机。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径VMware-workstation 1…

类和对象---C++

类和对象目录 类和对象1.封装1.1 封装的意义1.2 struct和class区别1.3 成员属性设置为私有1.3.1 联系---判断圆和点的位置关系 2.对象的初始化和清理2.1 构造函数和析构函数2.2 构造函数的分类及调用2.2.1无参构造函数调用2.2.2有参构造函数调用2.2.2.1括号法2.2.2.2显式法2.2.…

微信小程序快速入门02(含案例)

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、页面导航1.…

互联网资讯精选:科技爱好者周刊 | 开源日报 No.145

ruanyf/weekly Stars: 37.4k License: NOASSERTION 记录每周值得分享的科技内容,提供大量就业信息。欢迎投稿、推荐或自荐文章/软件/资源,并可通过多种方式进行搜索。 提供丰富的科技内容每周更新可以提交工作/实习岗位支持投稿和推荐功能 GyulyVGC/…

bootloader学习笔记及SD卡启动盘制作

Bootloader介绍 在操作系统运行之前运行的一小段代码,用于将软硬件环境初始化到一个合适的状态,为操作系统的加载和运行做准备(其本身不是操作系统) Bootloader基本功能 1、初始化软硬件环境 2、引导加载linux内核 3、给linux…

旅游数据可视化大屏:一屏掌控,畅游数据之海

随着旅游业的蓬勃发展,如何有效地管理和分析旅游数据成为行业关注的焦点。旅游数据可视化大屏作为一种新兴的技术手段,为旅游业带来了前所未有的机遇和挑战。 旅游数据可视化大屏集成了丰富的数据资源,通过直观的图表、图像和交互界面&#x…

慢 SQL 的优化思路

分析慢 SQL 如何定位慢 SQL 呢? 可以通过 slow log 来查看慢SQL,默认的情况下,MySQL 数据库是不开启慢查询日志(slow query log)。所以我们需要手动把它打开。 查看下慢查询日志配置,我们可以使用 show …

C++力扣题目654--最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树…

7、防写一个shell 命令解释器

1、代码部分 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_INPUT_LENGTH 100void parse_command(char *command) {// 用于存储解析后的命令和参数char cmd[MAX_INPUT_LENGTH];char args[MAX_INPUT_LENGTH];// 将输入的命令拷贝到…

微信商家转账到零钱,既能单笔又能批量,支持多商户管理

大家好&#xff0c;我是小悟 微信商家转账到零钱的功能大家应该都熟悉吧&#xff0c;为了满足商家向用户微信零钱转账的需求&#xff0c;微信支付推出【商家转账到零钱】服务&#xff0c;方便商户可以一次向单个或多个用户的微信零钱转账。 商家转账到零钱为商户提供了简便、…

计算机毕业设计----SSH高校科研管理系统平台

项目介绍 本项目包含超级管理员、管理员、教师三种角色&#xff1b; 超级管理员角色包含以下功能&#xff1a; 登录,教师管理,管理员管理等功能。 管理员角色包含以下功能&#xff1a; 登录,专业参赛奖项管理,科技论文发表管理,出版专业著作管理,科研项目立项管理,科研项目结…

常常放生,与佛心更相契

弘一法师曾说&#xff1a;“世上最好的放生&#xff0c;就是放过自己。”天地与我并生&#xff0c;万物与我为一&#xff0c;每一个众生最宝贵的是自己的生命。而人自称万物之灵&#xff0c;就应当有爱护万物、保护万物的责任心&#xff0c;心中要有慈悲和恻隐之心&#xff0c;…