博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
机器学习 k-近邻算法
阅读量:4104 次
发布时间:2019-05-25

本文共 2234 字,大约阅读时间需要 7 分钟。

k-近邻算法以及案例预测入住位置

分类算法k-近邻算法(KNN):

封面类算法的判定依据:离散型

思想:通过你的“邻居”来推断你的类型,相似的样本,特征之间的值应该都是相近的。

定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

来源:KNN算法最早是由Cover和Hart提出的一种分类算法。

两个样本的距离可以通过如下公式计算,又叫欧式距离:

在这里插入图片描述

在计算两个样本数据的距离时,需要对数据做标准化处理。

sklearn k-近邻算法API:

sklean.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

在这里插入图片描述

案例:预测入住位置

预测一个人 住的位置。

分类:

  • 特征值:x,y坐标,定位准确性,(时间戳。。。。日,时,周)
  • 目标值:入住位置的ID

处理: 0<x<10 0<y<10

  • 由于数据量过大,节省时间,对x,y缩小。
  • 时间戳进行(年,月,日,周,时分秒),当作新的特征。
  • 几千~几万,少于指定签到人数的位置删除。

源代码:

from sklearn.neighbors import KNeighborsClassifierimport pandas as pdfrom sklearn.preprocessing import StandardScalerdef knncls():    """    k-紧邻预测用户签到位置    """    #读取数据    pd.read_csv("./data/train.csv")    #print(data.head(10))#打印前十行       #处理数据    #1、缩小数据,查询数据筛选    data=data.query("x>1.0 & x<1.25 & y>2.5 & y<2.75")        #2\处理时间的数据    time_value=pd.to_datatime(data["time"],unit='s')    print(time_value)        #把日期格式转换成字典格式    pd.DatetimeIndex(time_value)        #构造一些特征    data['day']=time_value.day    data['hour']=time_value.hour    data["weekday"]=time_value.weekday        #把时间戳特征删除    data= data.drop("['time'],axis=1")    print(data)        #把签到数量少于n个目标位置删除        place_count = data.groupby('place_id').count()    tf = place_count[place_count.row_id > 3].reset_index()        data=data[data['place_id'].isin(tf.place_id)]        #取出数据当中的特征值和目标值    y=data['place_id']    x=data.drop(['place_id'],axis=1)        #进行数据的分割训练集和测试集    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)        #特征工程(标准化)    std=StandardScaler()    #对测试机和训练集的特征值进行标准化    x_train = std.fit_transform(x_train)    std.transform(x_test)            #进行算法流程    knn=KNeighborsClassifier(n_neighbors=5)    #fit  predict  score    knn.fit(x_train,y_train)    #得出预测结果    y_predict = knn.predict(x_test)    print('预测的目标签到位置为:',y_predict)    # 得出准确率    print('预测的准确率:',knn.score(x_test,y_test))           return None    if __name__=="__main__":    knncls()

输出的前十行数据:

在这里插入图片描述

输出处理时间的数据:

在这里插入图片描述
输出把时间戳删除后的数据data:在这里插入图片描述

标准化以前的预测值 :在这里插入图片描述

标准化以后的预测值:
在这里插入图片描述
标准化以后,预测值从。0.2到了0.4,有明显的提高。

总结:

1、k值取多大?有什么影响?

k值取很小时:容易受异常点影响。
k值取很大时:容易受k值数量(类别)的波动

2、性能问题?

如果样本越来越大,运算时间非常长。

3、优点:

简单,容易理解,易于实现,无需顾忌参数,无需训练。

4、缺点:

懒惰算法,对测试样本分类的计算量大,内存开销大。
必须指定k值,k值选择不当则分类精度不能保证。

5、使用场景:

小数据场景,几千~几万样本,具体场景具体业务去测试。

转载地址:http://ovcsi.baihongyu.com/

你可能感兴趣的文章
给程序员新手的一些建议
查看>>
史上几大浏览器所用的内核名称
查看>>
软件开发认识过程
查看>>
文件操作的补充
查看>>
SQL存储过程解密
查看>>
LR接口压力测试实战(限量抢红包接口)
查看>>
docker容器中安装vi
查看>>
Redis常用命令入门4:集合类型
查看>>
Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析
查看>>
100. Same Tree
查看>>
多版本并发控制(MVCC)
查看>>
鸟哥的linux私房菜学习-(十)vim程序编辑器
查看>>
linux 下查看一个进程执行路径
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
hdu 1671 Phone List
查看>>
oracle11g 在azure云中使用rman进行实例迁移
查看>>
ztree异步加载树节点
查看>>
PHP多端口站点/虚拟站点的配置方法
查看>>
前端的第一步
查看>>
Idea中的插件-列出Java Bean的所有set方法
查看>>