k Nearest Neighbour(KNN)建模

目录

介绍: 

一、建模 

 二、调参

2.1手动调参

2.2 GridSearchCV调参

 2.3RandomizedSearchCV调参

介绍: 

K最近邻(K-Nearest Neighbors,KNN)是一种基本的分类和回归算法。它的基本思想是对未知样本进行预测时,先找到训练数据集中与该样本最近的K个样本,然后根据这K个样本的标签进行预测。

KNN模型的基本步骤如下:
1. 计算未知样本与训练数据集中所有样本的距离,常用的距离度量方法有欧氏距离、曼哈顿距离等。
2. 根据计算得到的距离按照从小到大的顺序排序,选取距离最近的K个样本。
3. 根据K个样本的标签进行投票或者计算加权平均值,得到未知样本的预测结果。

KNN模型的优点包括:
1. 简单直观,易于理解和实现。
2. 对异常值不敏感,因为它是基于距离进行判断的。
3. 可以适用于多种数据类型,如数值型、离散型等。

KNN模型的缺点包括:
1. 计算量较大,特别是当训练数据集较大时。
2. 对于高维数据,可能会出现维度灾难问题,导致准确率下降。
3. 对于不平衡数据集和噪声数据集可能会有影响。

KNN模型在实际应用中广泛使用,特别是在文本分类、图像识别、推荐系统等领域取得了良好的效果。

 

一、建模 

import numpy as np #k Nearest Neighbour(KNN)建模
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inlinedata=pd.read_csv('iris.csv')
X=data.drop(['Species'],axis=1)
y= data['Species']from sklearn.model_selection import StratifiedShuffleSplit,cross_val_score
from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier(metric='minkowski',p=2)#用minkowski公式,p=2则为欧几里得公式cv = StratifiedShuffleSplit(n_splits=10,test_size=.25,random_state=2)#分测试集accuracies = cross_val_score(knn,X,y,cv=cv,scoring='accuracy')print('cross_validation accuracy scores:{}'.format(accuracies))#准确率
print('mean cross-validation accuracy score:{}'.format(round(accuracies.mean(),3)))#准确率均值'''结果:
cross_validation accuracy scores:[1.         1.         1.         1.         1.         1.0.97368421 1.         1.         1.        ]
mean cross-validation accuracy score:0.997
'''

 二、调参

2.1手动调参

#枚举,调参k
k_range = range(1,31)
k_score = []
for k in k_range:knn=KNeighborsClassifier(n_neighbors=k)scores=cross_val_score(knn,X,y,cv=cv,scoring='accuracy')k_score.append(scores.mean())
print("Accuracy scores are:{}\n".format(k_score))
print("Mean accuracy score:{}\n".format(np.mean(k_score)))'''结果:
Accuracy scores are:[1.0, 1.0, 0.9973684210526315, 1.0, 0.9973684210526315, 0.9973684210526315, 0.9973684210526315, 0.9894736842105264, 0.9921052631578947, 0.9868421052631579, 0.9894736842105264, 0.9842105263157894, 0.9868421052631579, 0.9789473684210526, 0.9868421052631579, 0.9815789473684211, 0.9868421052631579, 0.9815789473684211, 0.9842105263157894, 0.9815789473684211, 0.9815789473684211, 0.9842105263157894, 0.9815789473684211, 0.9815789473684211, 0.9894736842105264, 0.9789473684210528, 0.9868421052631579, 0.9842105263157895, 0.9842105263157894, 0.9842105263157895]Mean accuracy score:0.9878947368421052
'''plt.plot(k_range,k_score,'bo',linestyle='dashed',linewidth=1,markersize=6)#奇数点准确率更高

2.2 GridSearchCV调参

GridSearchCV是一个用于模型参数调优的函数,可以根据给定的参数候选空间中的所有可能组合,使用交叉验证方法来评估模型的性能,最终选择出最佳的参数组合。它的调用方式类似于传统的fit函数,但是在fit函数的基础上添加了参数搜索和交叉验证的功能。使用GridSearchCV可以避免手动调整参数的繁琐过程,提高模型的性能和泛化能力。

#Grid search on KNN classifier
from sklearn.model_selection import GridSearchCV
k_range=range(4,31)
weights_options=['uniform','distance']param={'n_neighbors':k_range, 'weights':weights_options}cv = StratifiedShuffleSplit(n_splits=10,test_size=.30,random_state=15)#分测试集grid=GridSearchCV(KNeighborsClassifier(),param,cv=cv,verbose=False,n_jobs=-1)grid.fit(X,y)print(grid.best_score_)
print(grid.best_params_)
print(grid.best_estimator_)
'''结果:
1.0
{'n_neighbors': 11, 'weights': 'distance'}
KNeighborsClassifier(n_neighbors=11, weights='distance')
'''knn_grid=grid.best_estimator_
knn_grid.score(X,y)
#结果:1.0

 2.3RandomizedSearchCV调参

RandomizedSearchCV是一个用于超参数优化的函数。它是scikit-learn库中GridSearchCV的一种替代方法。

在机器学习模型中,超参数是在训练模型之前设置的参数,而不是通过训练数据学习得到的。超参数优化的目标是找到最佳的超参数组合,以获得最好的模型性能。

RandomizedSearchCV通过在超参数的可能值范围内进行随机搜索,来寻找最佳的超参数组合。与GridSearchCV不同,RandomizedSearchCV不是遍历搜索所有可能的超参数组合,而是在指定的超参数分布中进行随机抽样。

使用RandomizedSearchCV函数,可以指定要优化的模型、超参数的可能值范围、搜索的抽样次数等。函数将根据指定的超参数分布和评估指标,返回最佳超参数组合的模型。

#using randomizedSearchCV
from sklearn.model_selection import RandomizedSearchCV
k_range=range(4,31)
weights_options=['uniform','distance']param={'n_neighbors':k_range, 'weights':weights_options}cv = StratifiedShuffleSplit(n_splits=10,test_size=.30,random_state=15)#分测试集grid==RandomizedSearchCV(KNeighborsClassifier(),param,cv=cv,verbose=False,n_jobs=-1,n_iter=40)grid.fit(X,y)print(grid.best_score_)
print(grid.best_params_)
print(grid.best_estimator_)
'''结果:
1.0
{'n_neighbors': 11, 'weights': 'distance'}
KNeighborsClassifier(n_neighbors=11, weights='distance')
'''knn_grid=grid.best_estimator_
knn_grid.score(X,y)
#结果:1.0

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

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

相关文章

VM中安装Linux以及Win系统

目录 准备条件 安装RHEL9.3 步骤一:按照图片进行操作 步骤二:选择配置方式 步骤三:选择虚拟芯片 步骤四:安装镜像 步骤五:选择操作系统 步骤六:名字以及存储位置 步骤七:配置虚拟机参数…

Spring的依赖注入(DI)

1.DI 概述:DI(Dependency Injection)依赖注入,在Spring创建对象的同时,为其属性赋值,称之为依赖注入。 1.1构造函数注入 顾名思义,就是使用类中的构造函数,给成员变量赋值。注意&…

FreeRTOS——软件定时器知识总结及其实战

1.软件定时器概念 是指具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息。 2 软件定时器使用特点 1)如果要使能软件定时器,需将c…

防浪涌TVS:电子设备的保护盾?|深圳比创达电子

在电子设备日益普及的今天,我们经常会听到设备因电压波动或突发浪涌而损坏的情况。那么,有没有一种方式可以保护我们的设备免受这些意外伤害?答案就是“防浪涌TVS(Transient Voltage Suppressor)”。但它是什么?它如何工作&#x…

推荐一款加速器,也可加速github

地址https://github.com/BeyondDimension/SteamTools

docker 部署haproxy cpu占用特别高

在部署mysql 主主高可用时&#xff0c;使用haproxy进行负载&#xff0c;在服务部使用的情况下发现服务器cpu占比高&#xff0c;负载也高&#xff0c;因此急需解决这个问题。 1.解决前现状 1.1 部署配置文件 cat > haproxy.cfg << EOF globalmaxconn 4000nbthrea…

小白入门基础 - spring Boot 入门

1.简介 spring Boot是为了简化java的开发流程而构建的&#xff0c;即使是使用springMVC框架&#xff0c;也依然需要大量配置和依赖导入&#xff0c; 这无疑是繁琐的&#xff0c;spring Boot采用了”习惯由于配置“的原则&#xff0c;进行一键化部署&#xff0c;这样极大…

HTTP基础知识总结

目录 一、什么是HTTP&#xff1f; 二、与HTTP有关的协议 三、HTTP请求特征 四、HTTP组成格式 五、HTTP标头 1.通用标头 2.实体标头 3.请求标头 4.响应标头 六、HTTP状态码分类 我们在日常测试过程中&#xff0c;也可以通过浏览器F12简单定位是前端问题还是后端问题&a…

Android kotlin build.gradle.kts配置

1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories {maven {url https://maven.aliyun.com/repository/public/}mavenCentral() }1. 1.2. settings.gradle.kts repositories {maven {setUrl("https://maven.aliyun.com/repository/public/…

Linux中 /etc/sysconfig/network-scripts/ifcfg-<interface> 网络接口配置 详解 看这一篇够用

CSDN 成就一亿技术人&#xff01; 今天就来讲讲Linux中的网络配置详解 CSDN 成就一亿技术人&#xff01; 在 Linux 系统中&#xff0c;/etc/sysconfig/network-scripts 目录包含用于配置网络接口的脚本和配置文件。这些文件由 NetworkManager 服务使用来启动、停止和管理网络…

python入门,list列表详解

目录 1.list的定义 2.index查找某元素的下标 3.修改 ​编辑 4.插入 ​编辑 5.追加元素 1.append,追加到尾部 2.extend,追加一批元素 ​编辑 6.删除元素 1.del 列表[下标] 2.列表.pop(下标) 3.列表.remove(元素) 7.清空列表 8.统计某一元素在列表内的数量 9.计算…

【后端已完成,前端更新ing】uniapp+springboot实现个人备忘录系统【前后端分离】

目录 &#xff08;1&#xff09;项目可行性分析 &#xff08;一&#xff09;技术可行性&#xff1a; &#xff08;二&#xff09;经济可行性&#xff1a; &#xff08;三&#xff09;社会可行性&#xff1a; &#xff08;2&#xff09;需求描述 功能模块图 用例图&#…