python机器学习基础K近邻算法详解KNN
作者:Swayzzu 发布时间:2024-01-01 05:44:57
一、k-近邻算法原理及API
1.k-近邻算法原理
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。(相似的样本,特征之间的值应该都是相近的。)
样本之间的距离求法:
2.k-近邻算法API
3.k-近邻算法特点
k值取很小,容易受异常点的影响。
k值取很大,容易受k值数量(类别)波动
优点:简单,易于理解,易于实现,无需估计参数,无需训练(不需要迭代)
缺点:懒惰算法,对测试样本分类时的计算量大,内存开销大
综上,使用该算法时必须指定K值,K值选择不当则分类精度不能保证。同时若样本数量非常多,算法花费的时间就会很长,因此使用场景一般是小数据场景。
二、k-近邻算法案例分析案例信息概述
knn使用案例:以预测客人的入住位置(假设住的是酒店)为例。准备好的数据中的特征为:酒店编号(place_id)、入住登记(row_id)、客人横坐标(x)、客人纵坐标(y)、时间戳(time)、客人定位准确度(accuracy)
也就是说,我们的目标是预测客人将会入住哪个编号的酒店。则此问题是一个分类问题。根据k-近邻算法,我们通常考虑让客人入住距离他最近的酒店。但同时,根据给出的其他信息,是否入住某酒店还会受其他因素影响,比如入住时间,定位准确度。
因此,我们第一步对数据进行处理的时候,需要将我们认为对客人入住有影响的所有因素考虑在内。比如客人的坐标、入住时间、定位准确度。
接下来对特征进行处理,把需要的添加进列表,不需要的删除,或者筛选部分数据。最终处理好后,将目标值单独拿出来作为y_train,就可以使用x_train和y_train来训练算法了。
第一部分:处理数据
1.数据量缩小
假设已导入了data数据,由于数据量太大,因此为了演示的速度,将数据量缩小。
代码:
data.query('x>0.1 & x<0.2 & y>0.5 & y<0.6')
选择x的坐标范围,以及y的坐标范围
2.处理时间
时间给出的是时间戳格式,需要使用pd.to_date_time进行转化
代码:
time = pd.to_date_time(data['time'], unit='s')
此时得出的时间是类似于这样:1970-01-01 18:09:40
3.进一步处理时间
将时间提取出来,转换成 ”可以任意提取,年月日时分秒均可“ 的字典格式
代码:
time_value = pd.DatetimeIndex(time)
4.提取并构造时间特征
直接将提取的时间特征,选择一个特征名,加入原数据表中即可,想加几个加几个
代码:
data['day'] = time_value.day
5.删除无用特征
使用drop方法,方法中,axis=1代表整列。只要认为没有用的特征,均可删除
代码:data = data.drop(['row'], axis=1)
6.签到数量少于3次的地点,删除
首先对数据进行分组,要删除地点,就以地点来分组,并统计其他特征基于地点的数量
代码:
place_count = data.groupby('place_id').count()
此处返回的数据表,索引就是地点place_id,其他的特征对应的列,数据都变成了“基于place_id”所进行的数量统计。
关于groupby().count()的解释,以一个简单的数据为例:
原来的特征有5个,分别为:year, team, rank, points, goals,现在按照year来分组并统计数量,那么第一行第一列的数据“4”,意思就是:在2014年,有4个team
回到本例,row_id代表的是“登记事件的id”,也就是说每次有人登记入住一个place,那么place_id对应的就会有一个row_id数据出现。若同一个地方有三个人登记了,那么同一个place_id对应的row_id就会有三个。
因此,本例中按照groupby.count()处理之后,place_id和row_id对应的关系就是:在place_id中的a这个地方,row_id对应的数量为3。也就是相当于在a地点,有3人登记入住了。
接下来,将入住人数少于3的place_id删除:
place_count[place_count.row_id>3]
# 选择入住人数大于三人的数据
tf = place_count[place_count.row_id>3].reset_index() #将索引重置,place_id还放回到特征
data = data[data['place_id'].isin (tf.place_id)]
#对data中的数据进行筛选
7.提取目标值y
提取之后,需将原数据表中的目标值那一列删除
y = data['place_id']
x = data.drop(['place_id'], axis=1)
8.数据分割
前面需要导入分割方法:from sklearn.model_selection import train_test_split
代码:
x_train, x_test, y_train,
y_test = train_test_split(x, y, test_size=0.25)
至此,数据处理完毕。数据处理过程中,我们需要考虑有哪些数据是需要舍弃的,有哪些是需要我们构造的,是否需要对特征进行筛选,条件如何设置等。最终,将我们需要的目标值提取出来,剩余的作为训练集。并调用分割方法,按一定的比例进行数据分割。(此处25%的数据作为测试集)
第二部分:特征工程
标准化
先导入标准化类:from sklearn.preprocessing import StandardScaler
训练集和测试集,标准化的时候,所使用的均值与标准差,都是训练集的!因此,对测试集标准化的时候,只调用transform方法即可。
x_train = std.fit_transform(x_train)
x_test = transform(x_test)
第三部分:进行算法流程
1.算法执行
先导入算法:from sklearn.neighbors import KNeighborsClassifier
使用该算法,将训练集数据输入,即可训练完毕,得到一个模型。
代码:
knn = KNeighborsClassifier(x_train, y_train)
2.预测结果
使用predict方法, 输入测试集数据即可得出预测的y
代码:
y_predict = knn.predict(x_test)
3.检验效果
使用score方法,输入测试集数据,以及测试集的目标值,即可得出分数
代码:
score = knn.score(x_test, y_test)
来源:https://blog.csdn.net/Swayzzu/article/details/120296767


猜你喜欢
- JavaScript 中的 this 指向问题有很多文章在解释,仍然有很多人问。上周我们的开发团队连续两个人遇到相关问题,所以我不得不将关于
- 为了安全我们经常给access数据库加上密码,这样就算让本人下载了数据库,那么想看到数据库中的数据也不是那么简单的,起码多了一层障碍!我们平
- 本文实例讲述了RC4文件加密的python实现方法。分享给大家供大家参考。具体分析如下:基于RC4流加密算法,使用扩展的16*16的S盒,3
- FastApi快速构建一个web项目已经使用FastApi很久了。这个一个非常优秀的框架。和flask一样能够快速构建一个web服务。开发效
- matplotlib默认根据数据系列自动缩放坐标轴范围。pyplot模块中的autoscale函数可以切换是否自动缩放坐标轴范围,xlim(
- 今天调试某页面样式,发现chrome下出现问题,但是同样基于webkit引擎的safari没有问题,很是郁闷。于是寻找针对google ch
- 1.1 什么是多线程 Threading多线程可简单理解为同时执行多个任务。多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点
- 我们知道 Django Auth 应用一般用在用户的登录注册上,用于判断当前的用户是否合法,从而可以帮助开发者快速的构建用户系统,那么 Au
- 本文实例为大家分享了Bootstrap modal使用及点击外部不消失的解决方法,供大家参考,具体内容如下1.代码:<input id
- 导语亲爱的小可爱们,大家好! 欢迎来到木子的游戏编程空间经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是
- 1、文件和文件组的含义与关系 每个数据库有一个主数据文件.和若干个从文件。文件是数据库的物理体现。 文件组可以包括分布在多个逻辑分区的文件,
- 堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序。堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势
- 本文范例是书写两个日志:错误日志(ERROR级别)和运行日志(DEBUG级别),其中运行日志每日凌晨进行分割import logging,d
- 前言pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行非tes
- 你无法创建一个相同的用户并mapping这个用户到数据库, 并且你无法删除数据库的用户:DemoUser. 请运行以下脚本, 之后你就可以删
- 前言虽然标题是全站,但目前只做了等级 top 100 直播间的全天弹幕收集。弹幕收集系统基于之前的B 站直播弹幕姬 Python 版修改而来
- 引言欢迎来到我们的系列博客《Python全景系列》!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握
- tk在科学养猪群里问bluerust、scz是否碰上过这个Python坑,示例1:bas = [ 'ba1', 'b
- 1、登录SMTP服务器首先使用网上的方法(这里使用163邮箱,smtp.163.com是smtp服务器地址,25为端口号):import s
- 本文实例讲述了MySQL从命令行导入SQL脚本时出现中文乱码的解决方法。分享给大家供大家参考,具体如下:在图形界面管理工具 MySql Qu