K-近邻算法案例——facebook签到位置预测

目录

学习目标

一  开发环境

二  项目介绍

2.1  数据集介绍

 三  步骤分析

 四  运行结果

学习目标

  • 通过Facebook位置预测案例熟练掌握KNN算法 

一  开发环境

首先来看看我的开发环境,用的东西还是比较简单的:

作者:嘟粥yyds

时间:2023年01月01日

集成开发工具:PyCharm 2021.1.3

集成开发环境:python  3.10.6

第三方模块:pandas、train_test_split、GridSearchCV、StandardScaler、KNeighborsClassifier

二  项目介绍

 本次比赛的目的是预测一个人想去哪个地方签到。为了这次比赛的目的,Facebook创建了一个人造世界,由位于10公里乘10平方公里的10万多个地方组成。对于一组给定的坐标,您的任务是根据用户的位置,准确性和时间戳等预测用户下一次的签到位置。数据被捏造成类似于来自移动设备的位置信号,让您了解如何处理因不准确和嘈杂值而复杂的真实数据。不一致和错误的位置数据可能会破坏 Facebook 签到等服务的体验。

2.1  数据集介绍

数据介绍 

文件说明 train.csv, test.csv
   row id:签入事件的id
   x y:坐标
   accuracy: 准确度,定位精度
   time: 时间戳
   place_id: 签到的位置,这也是你需要预测的内容

官网:grid_knn | Kaggle

 三  步骤分析

  • 对于数据做一些基本处理(这里所做的一些处理不一定达到很好的效果,我们只是简单尝试,有些特征我们可以根据一些特征选择的方式去做处理)
  1. 获取数据
    import pandas as pd
    from sklearn.model_selection import train_test_split, GridSearchCV
    from sklearn.preprocessing import StandardScaler
    from sklearn.neighbors import KNeighborsClassifier
    # 获取数据
    data = pd.read_csv("./FBlocation/train.csv")
  2. 基本数据处理
    # 缩小数据范围: 2 < x < 2.5    1.0 < y < 1.5
    data = data.query("2 < x < 2.5 & 1.0 < y < 1.5")
    # 处理时间特征
    time_value = pd.to_datetime(data['time'], unit='s')
    
    date = pd.DatetimeIndex(time_value)
    
    data["day"] = date.day
    data["weekday"] = date.weekday
    data["hour"] = date.hour
    # 过滤签到次数少的地点
    place_count = data.groupby("place_id").count()["row_id"]
    data_final = data[data["place_id"].isin(place_count[place_count > 10].index.values)]
    # 筛选特征值和目标值
    x = data_final[["x", "y", "accuracy", "day", "weekday", "hour"]]
    y = data_final["place_id"]
    # 数据集划分
    x_train, x_test, y_train, y_test = train_test_split(x, y)
  3. 特征工程——特征预处理(数据标准化)
    # 特征工程: 标准化
    # 实例化一个转换器
    transfer = StandardScaler()
    # 调用fit_transform
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
  4. KNN算法预估器
     
    estimator = KNeighborsClassifier()
    # 加入网格搜索与交叉验证
    # 参数准备
    param_dict = {"n_neighbors": [3, 5, 7, 9]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)
    estimator.fit(x_train, y_train)
  5.  模型评估
    # 方法1: 直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print(f"y_predict:\n{y_predict}")
    print(f"直接比对真实值的预测值\n{y_test == y_predict}")
    # 方法2: 计算准确率
    score = estimator.score(x_test, y_test)
    print(f"准确率为:{score}")
    # 查看最佳参数、最佳结果、最佳预估器、交叉验证结果
    print(f'最佳参数:{estimator.best_params_}')
    print(f'最佳结果:{estimator.best_score_}')
    print(f'最佳预估器:{estimator.best_estimator_}')
    print(f'交叉验证结果:\n{estimator.cv_results_}')

 四  运行结果

y_predict:
[7942373049 3439753948 3695846783 ... 1533408099 9764078387 4231692509]
直接比对真实值的预测值
2007647     False
23653459    False
9418270      True
18798838    False
22082936    False
            ...  
17532084     True
17184298    False
7396514      True
29039029    False
4841782      True
Name: place_id, Length: 19683, dtype: bool

准确率为:0.3756541177666006

最佳参数:{'n_neighbors': 1}
最佳结果:0.3501955594795536
最佳预估器:KNeighborsClassifier(n_neighbors=1)
交叉验证结果:
{'mean_fit_time': array([0.03692357, 0.03621324, 0.03688304, 0.03587898, 0.03637552,
       0.03587977]), 'std_fit_time': array([5.26951207e-05, 4.69293380e-04, 8.19175090e-04, 8.12349756e-04,
       3.99485158e-04, 2.23938669e-06]), 'mean_score_time': array([0.39097706, 0.45584639, 0.49725358, 0.53362568, 0.56166697,
       0.59604867]), 'std_score_time': array([0.00194897, 0.0016437 , 0.003035  , 0.00178027, 0.00195941,
       0.00288296]), 'param_n_neighbors': masked_array(data=[1, 3, 5, 7, 9, 11],
             mask=[False, False, False, False, False, False],
       fill_value='?',
            dtype=object), 'params': [{'n_neighbors': 1}, {'n_neighbors': 3}, {'n_neighbors': 5}, {'n_neighbors': 7}, {'n_neighbors': 9}, {'n_neighbors': 11}], 'split0_test_score': array([0.35299497, 0.3339938 , 0.34603465, 0.34247828, 0.34009043,
       0.33440024]), 'split1_test_score': array([0.34798293, 0.33431562, 0.34274972, 0.34478203, 0.33949802,
       0.33401077]), 'split2_test_score': array([0.34960878, 0.33472208, 0.34534092, 0.34122549, 0.33736409,
       0.33426481]), 'mean_test_score': array([0.35019556, 0.33434383, 0.34470843, 0.3428286 , 0.33898418,
       0.33422528]), 'std_test_score': array([0.0020878 , 0.00029799, 0.00141368, 0.00147293, 0.00117083,
       0.00016144]), 'rank_test_score': array([1, 5, 2, 3, 4, 6])}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值