一、算法概述

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

注:K-近邻算法:需要做标准化处理。

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。

用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。

1、距离计算公式

k近邻空间权重矩阵概念 k近邻算法分类_特征值

二、sklearn k-近邻算法API

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

  • n_neighbors:int,可选(默认=5),k_neighbors查询默认使用的邻居数
  • algotithm:{‘auto’,'ball_tree',‘kd_tree’,'brute'},可选用计算最近邻居的算法:‘ball_tree’将会选用 BallTree,‘kd_tree’将使用KDTree。‘auto’将尝试根据传递给fit方法的值来决定最适合的算法。(不同实现方式影响效率)

三、预测入住位置

数据来源:链接:https://pan.baidu.com/s/1Ph-N1HEDlVxeD3jYjpNedA    提取码:vwi8 

k近邻空间权重矩阵概念 k近邻算法分类_实例化_02

k近邻空间权重矩阵概念 k近邻算法分类_数据_03

这项比赛的目的是预测一个人想签到哪个地方。为了比赛的目的,Facebook创建了一个人工世界,由10万乘10公里的正方形中的100,000多个地方组成。对于给定的一组坐标,您的任务是返回最可能的位置的排名列表。数据被制作成类似于来自移动设备的位置信号,从而使您具有处理真实数据(复杂的数值和嘈杂的值)所需的风味。不一致和错误的位置数据可能会破坏Facebook Check In等服务的体验。

在本案例中,将根据用户的位置,准确性和时间戳来预测用户正在检查的业务。 

k近邻空间权重矩阵概念 k近邻算法分类_k近邻空间权重矩阵概念_04

1、查看档案说明信息

k近邻空间权重矩阵概念 k近邻算法分类_数据_05

2、具体处理流程

有无特征工程处理(标准化)区别:会影响到预测的准确率(做了标准化,准确率会提高)

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: None
    """
    #读取数据(获取)
    file_path = "E:\python\pyData\\facebook-v-predicting-check-ins\\train.csv"
    data = pd.read_csv(file_path)
    print(data.info())

    #处理数据
    #1、缩小数据的范围(按照x,y),查询数据进行筛选
    data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")
    #2、处理时间数据
    time_value = pd.to_datetime(data['time'], unit='s')
    print(time_value)
    time_value = pd.DatetimeIndex(time_value) #把日期格式转换成字典格式
    print(time_value)
    print("*"*100)
    #构造一些新特征
    data['day'] = time_value.day
    data['hour'] = time_value.hour
    data['weekday'] = time_value.weekday
    data = data.drop(['time'], axis=1) #1代表列;把时间戳特征删除

    #把签到数量少于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.fit_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()

不做特征化处理(标准化)结果:

k近邻空间权重矩阵概念 k近邻算法分类_特征值_06

做特征处理(标准化)结果:

四、K-近邻算法总结

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

  • K值取很小:容易受异常点的影响
  • K值取很大:容易受K值数量(类型)的影响

2、优缺点明确

优点:

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

缺点:

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

注:算法实例化中传入的参数叫做超参数,如n_neighbors

3、使用场景

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