机器学习——KNN算法以及案例预测入住位置 - Go语言中文社区

机器学习——KNN算法以及案例预测入住位置


ķ最近邻

KNN分类算法其核心思想是假定所有的数据对象都对应于Ñ维空间中的点,如果一个数据对象在特征空间中的ķ个最相邻对象中的大多数属于某一个类别,则该对象也属于这个类别,并具有这个类别上样本的特性.KNN方法在进行类别决策时,只与极少量的相邻样本有关。

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

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

比如说:A(A1,A2,A3),B(B1,B2,B3)

距离L =

sklearn k-近邻算法API

sklearn.neighbors.KNeighborsClassifier(N_NEIGHBORS = 5,算法= '自动')

  • N_NEIGHBORS:INT,可选(默认= 5),k_neighbors查询默认使用的邻居数
  • 算法:{ “自动”, “ball_tree”, “kd_tree”, “畜生”},可选用计算最近邻居的算法: 'ball_tree' 将会使用BallTree, 'kd_tree' 将使用KDTree.'auto“将尝试根据传递给拟合方法的值来决定最合适的算法。(不同实现方式影响效率)

KNN算法实现预测入住位置

下面是数据的部分截图:

文件说明:ROW_ID:登记时间的ID

               xy:坐标

              准确性:定位准确性

              时间:时间戳

              place_id:业务的ID,这是您预测的目标

实例流程

  1. 数据集的处理
  2. 分割数据集
  3. 对数据集进行标准化
  4. 估计流程进行分类预测

数据的处理

  1. 缩小数据集范围

DataFrame.query()

     2.处理日期数据

pd.to_datetime

pd.DatetimeIndex

     3.增加分割的日期数据

     4.删除没用的日期数据

DataFrame.drop

      5.将签到位置少于Ñ个用户的删除

place_count = data.groupby( 'place_id')。计数

TF = place_count [place_count.row_id> 3] .reset_index()

数据=数据[数据['place_od“]。ISIN(tf.place_id)]

下面代码实现:

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler

import pandas as pd
def knncls():
    """
    k-近邻预测用户签到位置
    :return:
    """
    #读取数据
    data=pd.read_csv("./train.csv")
    print(data.head(10))
    #处理数据
    #1.缩小数据,查询数据筛选
    data=data.query("x>1.0 & x<1.25 & y>2.5 &y<2.75")
    #处理时间数据
    time_value=pd.to_datetime(data['time'],unit='s')
    # print(time_value)
    #特征工程(标准化)
    #构造一些特征
    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.head(10))
    #把签到数量少于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)
    x_test=std.transform(x_test)
    #进行算法流程
    knn=KNeighborsClassifier(n_neighbors=5)
    #fit,pedict,score
    knn.fit(x_train,y_train)
    #得出预测结果
    y_predict=knn.predict(x_test)
    print('预测目标签到位置为:',y_predict)
    #得出准确率
    y_score=knn.score(x_test,y_test)
    print('预测准确率',y_score)
    return  None
if __name__=="__main":
    knncls()

运行结果如下所示:

预测的准确率为40%

ķ值取很小:容易受异常点影响

ķ值取很大:容易受ķ值数量(类别)波动

KNN算法优缺点

  • 优点

简单,易于理解,易于实现,无需估计参数,无需训练

  • 缺点

懒惰算法,对测试样本分类时的计算量大,内存开销大

必须指定ķ值,K值选择不当则分类精度不能保证

使用场景:小数据场景,几千〜几万样本,具体场景具体业务去测试

需要数据的留言邮箱地址

 

 

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41338249/article/details/83474181
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 21:38:05
  • 阅读 ( 1124 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢