KNN模型进行分类和回归任务

KNN工作原理
“近朱者赤,近墨者黑”可以说是KNN的工作原理。整个计算过程分为三步:1:计算待分类物体与其他物体之间的距离;2:统计距离最近的K个邻居;3:对于K个最近的邻居,它们属于哪个分类最多,待分类物体就属于哪一类。K-最近邻算法(K-Nearest Neighbor, KNN)中的K值是一个重要的超参数,不同的K值会影响模型的性能。常见的选择K值的方法包括以下几种

  • 网格搜索(Grid Search):指定一组候选的K值,对每个K值进行交叉验证,选取平均交叉验证误差最小的K值作为最佳K值。缺点是需要进行大量的计算,时间开销较大。
  • K折交叉验证(K-fold Cross Validation):将训练集分成K个子集,每次使用其中K-1个子集作为训练集,剩下的1个子集作为验证集,重复K次。对于每个K值,计算K次的平均交叉验证误差,选取平均交叉验证误差最小的K值作为最佳K值。这种方法的优点是可以减少模型的方差,但是计算时间仍然比较长。
  • 自助法(Bootstrap):从训练集中有放回地随机抽取样本,构建新的训练集。对于每个K值,计算自助样本的平均误差,选取平均误差最小的K值作为最佳K值。这种方法的优点是计算速度快,但是对于小数据集来说,可能会出现较大的方差。

网格搜索(Grid Search)

接下来先看看如何通过网格搜索(Grid Search)获取K值。GridSearchCV是Scikit-Learn库中用于网格搜索的函数,其主要作用是在指定的超参数范围内进行穷举搜索,并使用交叉验证来评估每种超参数组合的性能,以找到最优的超参数组合。该函数包含多个参数,具体参数以及每个参数含义如下所示:

estimator:通常是一个Scikit-Learn模型对象,例如KNeighborsClassifier()、RandomForestClassifier()等,用于表示要使用的模型。
param_grid:需要遍历的超参数空间,是一个字典,其中每个键是一个超参数名称,对应的值是超参数的取值列表。例如,对于KNN模型,可以指定param_grid = {'n_neighbors': [3, 5, 7, 9], 'weights': ['uniform', 'distance'], 'p': [1, 2]},表示K值在3, 5, 7和9中选择,权重方式为'uniform'和'distance',距离度量方式为曼哈顿距离和欧几里得距离。当然,除了这两种距离计算方式,还可以选择:闵可夫斯基距离;切比雪夫距离;余弦距离。

scoring:评价指标,用于评估模型性能的指标,通常是一个字符串或可调用的函数,例如'accuracy'、'f1'、'precision'、'recall'等。如果需要评估多个指标,则可以将评价指标指定为列表或元组。
cv:交叉验证的折数,通常为整数或KFold对象。例如,cv = 5表示将数据集分成5个折,其中4个用于训练,1个用于验证。
n_jobs:并行处理的数量,通常为整数,指定在训练期间使用的CPU数量。如果设置为-1,则使用所有可用的CPU。
verbose:输出详细程度,通常为整数。0表示不输出任何消息,1表示输出少量消息,大于1表示输出更多消息。
return_train_score:是否返回每个超参数组合在训练集上的性能指标。默认情况下,它为False,表示只返回每个超参数组合在验证集上的性

下面是使用GridSearchCV执行分类任务的demo代码,运行demo代码会显示执行的交叉参数组合,且给出最优的参数组合值。

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=42)
# 定义待调优的超参数及其取值范围
param_grid = {'n_neighbors': [3, 5, 7, 9],'weights': ['uniform', 'distance'],'p': [1, 2]
}
# 构建KNN模型
knn = KNeighborsClassifier()
# 使用网格搜索进行超参数调优
grid_search = GridSearchCV(knn, param_grid, cv=5, verbose=2)
grid_search.fit(X_train, y_train)
# 输出最优超参数组合及其在验证集上的性能指标
print("Best parameters: ", grid_search.best_params_)
print("Best score: ", grid_search.best_score_)
# 在测试集上进行评估
score = grid_search.score(X_test, y_test)
print("Test score: ", score)

K折交叉验证(K-fold Cross Validation)

KFold函数是Scikit-Learn库中用于生成K折交叉验证分割的函数。该函数的主要参数及含义如下:

  • n_splits:交叉验证折数,默认值为5。
  • shuffle:是否对样本进行随机排序,默认值为False。
  • random_state:随机种子数,默认为None,即随机种子为当前时间戳。
  • indices:指定分割的索引数组,可以用于固定分割以进行可重复的交叉验证。

下面是使用KFold函数,采用交叉验证进行模型评估的demo代码。

from sklearn.datasets import load_iris
from sklearn.model_selection import KFold, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 定义模型和超参数
knn = KNeighborsClassifier(n_neighbors=5, weights='uniform', p=2)
# 定义交叉验证的折数
kfold = KFold(n_splits=10, shuffle=True, random_state=42)
# 使用交叉验证进行模型评估
scores = cross_val_score(knn, X, y, cv=kfold)
# 输出平均分数和标准差
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

各类算法准确率对比

前面介绍了KNN算法、SVM 算法、多项式朴素贝叶斯算法等,下面的demo例子使用手写数字作为训练数据,观察每种算法的精确度,具体code如下所示。其中,sklearn.datasets是Scikit-Learn库中用于加载各种标准数据集的模块之一。load_digits函数可以加载一个手写数字数据集,该数据集包含1797个8x8像素的手写数字图像。每个图像都有相应的标签,表示图像中的数字。该数据集可以用于分类和降维等任务。

# 手写数字分类
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_digits
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt# 加载数据
digits = load_digits()
data = digits.data
# 数据探索
print(data.shape)
# 查看第一幅图像
print(digits.images[0])
# 第一幅图像代表的数字含义
print(digits.target[0])
# 将第一幅图像显示出来
plt.gray()
plt.imshow(digits.images[0])
plt.show()# 分割数据,将25%的数据作为测试集,其余作为训练集
train_x, test_x, train_y, test_y = train_test_split(data,digits.target,test_size=0.25,random_state=33)# 采用Z-Score规范化
ss = preprocessing.StandardScaler()
train_ss_x = ss.fit_transform(train_x)
test_ss_x = ss.transform(test_x)# 创建KNN分类器
knn = KNeighborsClassifier()
knn.fit(train_ss_x, train_y)
predict_y = knn.predict(test_ss_x)
print("KNN准确率: %.4lf" % accuracy_score(test_y, predict_y))# 创建SVM分类器
svm = SVC()
svm.fit(train_ss_x, train_y)
predict_y = svm.predict(test_ss_x)
print('SVM准确率: %0.4lf' % accuracy_score(test_y, predict_y))# 采用Min-Max规范化
mm = preprocessing.MinMaxScaler()
train_mm_x = mm.fit_transform(train_x)
test_mm_x = mm.transform(test_x)# 创建Naive Bayes分类器
mnb = MultinomialNB()
mnb.fit(train_mm_x, train_y)
predict_y = mnb.predict(test_mm_x)
print("多项式朴素贝叶斯准确率: %.4lf" % accuracy_score(test_y, predict_y))# 创建CART决策树分类器
dtc = DecisionTreeClassifier()
dtc.fit(train_mm_x, train_y)
predict_y = dtc.predict(test_mm_x)
print("CART决策树准确率: %.4lf" % accuracy_score(test_y, predict_y))

实验结果如下图所示,可以看到KNN和SVM准确率比较接近,多项式朴素贝叶斯和CART决策树准确率稍低。

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

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

相关文章

一些有趣的 js 功能函数

一些有趣的 js 功能函数 数组生成数组打乱数组数组简单数据去重数组唯一值数据去重多数组取交集查找最大值索引查找最小值索引找到最接近的数值压缩多个数组(拉链函数)矩阵交换行和列 数字转换进制转换 正则手机号格式化去除多余空格 web重新加载当前页面…

微信小程序之富文本那些事

文章目录 前言一、video的处理二、img的处理总结 前言 小程序中使用富文本编辑器,由于rich-text受限 部分富文本内容无法渲染或排版错乱。以img和video为例,处理起来让人头疼。网上各种长篇大论,实际上没有任何帮助。接下来我们就一起聊聊im…

聊聊STM32的基本定时器

STM32 的基本定时器(Basic Timer)是一种简单的定时器模块,用于生成基于时钟频率的定时中断。它可以用于实现各种定时和计时功能,例如延时、频率测量、PWM 生成等。 基本定时器通常由一个 16 位的自由运行计数器和一个预分频器组成…

Mac代码编辑器sublime text 4中文注册版下载

Sublime Text 4 for Mac简单实用功能强大,是程序员敲代码必备的代码编辑器,sublime text 4中文注册版支持多种编程语言,包括C、Java、Python、Ruby等,可以帮助程序员快速编写代码。Sublime Text的界面简洁、美观,支持多…

Bad owner or permissions on ~/.ssh/config

错误原因:设置本地所有文件的权限为741等。。。 在执行ssh免密码登录时报如下的错误:Bad owner or permissions on ~/.ssh/config。 解决方案: chmod 600 ~/.ssh/config

Linux-open、read、write函数

1、open函数 #include<stdio.h> #include<unistd.h> //close函数头文件#include<sys/types.h> //open函数头文件 #include<sys/stat.h> //open函数头文件 #include<fcntl.h> //flags参数头文件//返回值为对应文件的描述符&#xff0c;打开失败返…

Kendo UI,一个加速Web应用界面开发的JavaScript组件库!

Kendo UI是什么&#xff1f; 首先&#xff0c;Kendo UI是一个由四个JavaScript UI库组成的包&#xff0c;这些库是专为jQuery、Angular、React和Vue原生构建的&#xff0c;每一个都是用一致的API和主题构建的。所以无论开发者怎么选择&#xff0c;所开发的Web应用始终保持了现…

this关键字和同步异步宏认为微任务理解

目录 js面试常见问题&#xff1a;1.this指向 2.闭包定义和作用 3.原型链 4.异步协程 this关键字 this主要有以下几个使用场合。 1&#xff09;全局环境 &#xff08;2&#xff09;构造函数 &#xff08;3&#xff09;对象的方法 避免多层this 避免数组处理方法中的 this 避免回…

推荐几个Windows iso镜像下载的网站

文章目录 1. 微软官网2. MSDN网站3. 系统库(xitongku)4. 其他网站最后总结 给大家推荐几个 Windows iso镜像下载网站 1. 微软官网 入口地址&#xff1a;https://www.microsoft.com/zh-cn/software-download 以下载Windows11为例&#xff1a; 1&#xff09;找到下载Windows11…

undefined reference to `__android_log_print‘

报错描述 在 Android NDK 相关的工程构建中&#xff0c;出现报错&#xff1a; undefined reference to __android_log_print’ 翻译成 QM 能理解的话&#xff1a; 在链接阶段&#xff0c; 遇到一个需要被链接的符号 __android_log_print, 但是没有在给出的依赖库里面找到 __an…

【LeetCode】114.二叉树展开为链表

题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例 1&…

day43-Spring_IOC

0目录 1.2.3 1. Spring_IOC 1.1 定义&#xff1a;轻量级框架&#xff0c;java EE的春天&#xff0c;主流框架 1.2 Spring特性&#xff1a;IOC控制反转&#xff1b;AOP面相切面 1.3 组成部分&#xff1a;Spring在SSM中所起到的作用&#xff08;SpringMVC和Mybatis框架的黏…

MySQL中GROUP_CONCAT()的介绍和用法

摘要&#xff1a;本文详细介绍MySQL数据库中GROUP_CONCAT()函数的概念和用法。通过示例和输出结果展示如何使用GROUP_CONCAT()函数将分组后的数据以字符串形式拼接起来&#xff0c;帮助读者更好地理解和应用这一功能。 1. 什么是GROUP_CONCAT() GROUP_CONCAT()是MySQL数据库提…

C程序设计:基于双向链表的flash磨损平衡算法

1.flash磨损平衡算法的重要性 Flash磨损平衡算法是一种用于管理和均衡闪存存储器中数据分布的算法。由于闪存存储器的特性&#xff0c;比如有限的擦写次数和块擦除的要求&#xff0c;长时间不进行数据的平衡处理可能会导致某些块的擦写次数明显超过其他块&#xff0c;造成闪存…

vue2企业级项目(五)

vue2企业级项目&#xff08;五&#xff09; 页面适配、主题切换 1、适配 项目下载插件 npm install --save-dev style-resources-loader vue-cli-plugin-style-resources-loader修改vue.config.js部分内容 const path require("path");module.exports {pluginOpt…

flutter 打包iOS安装包

flutter iOS Xcode打包并导出ipa文件安装包 1、 Xcode配置 1、 启动打包 1、 等待打包 1、 打包完成、准备导出ipa 1、 选择模式 1、 选择配置文件 1、 导出 1、 选择导出位置 1、 得到ipa

于大模型迁移中学习 Docker

最近在做大模型的昇腾迁移&#xff0c;国产化框架踩坑不少&#xff0c;基本一天的工作量相当于之前做纯视觉算法时一周踩过的坑数了。 现在在modelarts上用八卡昇腾910跑llama&#xff0c;不同于之前自己配环境&#xff0c;昇腾生态创新中心都是用的镜像&#xff0c;虽说打包起…

区分jdbcTemplate操作数据库和mybatis操作数据库

JdbcTemplate和MyBatis是Java中常用的两种数据库操作方式。它们在实现上有一些区别&#xff0c;下面我将为你介绍它们的主要特点和区别&#xff1a; JdbcTemplate&#xff1a; JdbcTemplate是Spring框架中提供的一个类&#xff0c;用于简化JDBC操作。使用JdbcTemplate时&#x…

【业务功能篇58】Springboot + Spring Security 权限管理 【下篇】

4.2.2.3 SpringSecurity工作流程分析 SpringSecurity的原理其实就是一个过滤器链&#xff0c;内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KjoRRost-1690534711077)(http…

机器学习分布式框架ray tune笔记

Ray Tune作为Ray项目的一部分&#xff0c;它的设计目标是简化和自动化机器学习模型的超参数调优和分布式训练过程。Ray Tune简化了实验过程&#xff0c;使研究人员和数据科学家能够高效地搜索最佳超参数&#xff0c;以优化模型性能。 Ray Tune的主要特点包括&#xff1a; 超参…