机器学习基础——分类算法之K近邻算法(KNN)、预测facebook签到位置案例

目录

 1 基本概念

1.1 定义 

1.2 sklearn k-近邻算法API

2 kaggle实例:预测facebook签到位置

2.1 实例背景

 2.2 文件说明

2.3 案例分析

2.3.1 分类

2.3.2 处理

2.4 代码及分析

2.4.1 代码分析

2.4.2 完整代码

3 K值的选择

4 流程

5 knn算法的优缺点

5.1 优点

5.2 缺点

机器学习基础——分类算法之K近邻算法(KNN)、预测facebook签到位置案例_第1张图片

如何求距离? 欧氏距离。相似的样本,特征之间的值应该都是相近的。

 1 基本概念

1.1 定义 

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

1.2 sklearn k-近邻算法API

sklearn.neighbours.KNeighborsClassifier(n_neighbors=5,algorithm="auto")

  • n_neighbors:int,可选(默认=5),k_neighbors查询默认使用的邻居数
  • algorithm:{"auto","ball_tree","kd_tree","brute"}可选用于计算最近邻居的算法。
  • ball _tree将会使用BallTree,kd_tree将使用KDTree."auto"将尝试根据传递给fit方法的值来决定最适合的算法。

2 kaggle实例:预测facebook签到位置

2.1 实例背景

机器学习基础——分类算法之K近邻算法(KNN)、预测facebook签到位置案例_第2张图片

 2.2 文件说明

  • train.csv,test.csv
  • row_id:登记时间的ID
  • xy:坐标
  • 准确性:定位准确性
  • 时间:时间戳
  • place_ID:业务的ID,这是您预测的目标

2.3 案例分析

机器学习基础——分类算法之K近邻算法(KNN)、预测facebook签到位置案例_第3张图片

2.3.1 分类

特征值:x,y坐标,定位准确性、时间,日,时,周     

目标值:入住位置的id

2.3.2 处理

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

2.4 代码及分析

2.4.1 代码分析

  • 缩小数据 data.query()
  • pd.to_datetime() 转换为时间戳格式:用于列。
    pd.DatetimeIndex() 转换为时间戳格式:用于索引。

原数据:

机器学习基础——分类算法之K近邻算法(KNN)、预测facebook签到位置案例_第4张图片

把签到数量少于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)]

  处理后的数据:

机器学习基础——分类算法之K近邻算法(KNN)、预测facebook签到位置案例_第5张图片

  • df.reset_index()使用索引重置生成一个新的DataFrame或Series,可以把索引用作列。
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(data={'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]})
>>> df
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
>>> df.reset_index() # 会将原来的索引index作为新的一列
   index  A  B  C
0      0  1  4  7
1      1  2  5  8
2      2  3  6  9
>>> df
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
>>> df.reset_index(drop=True) # 使用drop参数设置去掉原索引
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
  •  x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)固定搭配
  • 为什么对于训练集标准化用fit_transform,而对于测试机标准化运用transform?
  • 回答:使用测试集计算出来的mean1和sd1去缩放测试集,即假设测试集来自mean等于mean1,standard deviation等于sd1的分布,即等于用测试集训练测试集,如果新加入别的测试数据,需要重新计算mean和standard deviation,这两个参数就更贴合测试集,容易overfitting;而用训练集计算出来的参数去缩放测试集 (即假设训练集和测试集来自同一个分布),使得训练的模型更普适 (genelization)。
  • knn.fit(x_train,y_train)训练生成一个模型
  • knn.predict(x_test)
  • knn.score(x_test,y_test)

2.4.2 完整代码

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.preprocessing import  StandardScaler

def knncls():
    """
    k近邻预测用户签到位置
    :return:None
    """
    #读取数据
    data= pd.read_csv("C:\\Users\\zoutong\Desktop\\programming\\data\\machine learning\\facebook-v-predicting-check-ins\\train.csv\\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_datetime(data["time"],unit="s")
    print(time_value)
    #3、把日期格式转换成字典
    time_value=pd.DatetimeIndex(time_value)
    #4、构造一些特征
    data["day"]=time_value.day
    data["hour"] = time_value.hour
    data["weekday"] = time_value.weekday
    #5、把时间戳特征删除
    data= data.drop(["time"],axis=1)
    print(data)
    #6、把签到数量少于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,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()

预测的目标签到位置为: [2327054745 1097200869 8258328058 ... 2553180323 8048985799 5606572086]
预测的准确率: 0.4134751773049645

3 K值的选择

如果选择较小的K值,就相当于用较小的邻域中的训练实例进行预测,学习的近似误差会减小,只有与输入实例较近的训练实例才会对预测结果起作用,单缺点是学习的估计误差会增大,预测结果会对近邻的实例点分成敏感。如果邻近的实例点恰巧是噪声,预测就会出错。换句话说,K值减小就意味着整体模型变复杂,分的不清楚,就容易发生过拟合。

如果选择较大K值,就相当于用较大邻域中的训练实例进行预测,其优点是可以减少学习的估计误差,但近似误差会增大,也就是对输入实例预测不准确,K值得增大就意味着整体模型变的简单

**近似误差:**可以理解为对现有训练集的训练误差。
**估计误差:**可以理解为对测试集的测试误差。

近似误差关注训练集,如果k值小了会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。模型本身不是最接近最佳模型。

估计误差关注测试集,估计误差小了说明对未知数据的预测能力好。模型本身最接近最佳模型。

在应用中,K值一般取一个比较小的数值,通常采用交叉验证法来选取最优的K值。

4 流程


1) 计算已知类别数据集中的点与当前点之间的距离
2) 按距离递增次序排序
3) 选取与当前点距离最小的k个点
4) 统计前k个点所在的类别出现的频率
5) 返回前k个点出现频率最高的类别作为当前点的预测分类

5 knn算法的优缺点

5.1 优点

  • 简单有效
  • 重新训练代价低
  • 算法复杂度低
  • 适合类域交叉样本
  • 适用大样本自动分类

5.2 缺点

  • 惰性学习
  • 类别分类不标准化
  • 输出可解释性不强
  • 不均衡性
  • 计算量较大
     

你可能感兴趣的:(机器学习,分类,近邻算法)