🎈 Facebook 签到位置预测案例
🎯一、学习目标
通过 Facebook 位置预测案例,熟练掌握KNN算法学习内容。
📌二、项目描述

本次比赛的目的是预测一个人将要签到的地方。Facebook 创建了一个虚拟世界,这个世界是一个 10 公里 ×10 公里,共 100 平方公里的区域,其中包含约 10 万个地方。对于给定的坐标集,任务是根据用户的位置、准确性和时间戳等信息,预测用户下一次的签到位置。数据被制作成类似于来自移动设备的位置数据。需要注意的是,只能使用提供的数据进行预测 。
📚三、数据集介绍
(一)📄数据介绍

涉及的文件有 train.csv 和 test.csv ,各字段含义如下:
- row id:签入事件的 id。
- x y:坐标。
- accuracy:准确度,即定位精度。
- time:时间戳。
- place_id:签到的位置,这也是需要预测的内容。
(二)🔗官网
数据集官网:https://www.kaggle.com/navoshta/grid-knn/data
🛠️四、步骤分析
(一)📊数据基本处理
对数据做一些基本处理(这里的处理不一定能达到最佳效果,只是简单尝试,有些特征可根据特征选择方式进一步处理)。
- 缩小数据集范围:使用 DataFrame.query () 方法。
- 选取有用的时间特征 。
- 将签到位置少于 n 个用户的删除 。
(二)✂️分割数据集
(三)⚖️标准化处理
(四)🔍k - 近邻预测
具体步骤如下:
- 获取数据集 。
- 基本数据处理
- 缩小数据范围 。
- 选择时间特征 。
- 去掉签到较少的地方 。
- 确定特征值和目标值 。
- 分割数据集 。
- 特征工程 — 特征预处理 (标准化) 。
- 机器学习 — knn+cv 。
- 模型评估 。
💻五、代码实现
(一)📥获取数据集
1 2
| facebook = pd.read_csv("./data/FBlocation/train.csv")
|
(二)📈基本数据处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
facebook_data = facebook.query("x>2.0 & x<2.5 & y>2.0 & y<2.5")
time = pd.to_datetime(facebook_data["time"], unit="s") time = pd.DatetimeIndex(time) facebook_data["day"] = time.day facebook_data["hour"] = time.hour facebook_data["weekday"] = time.weekday
place_count = facebook_data.groupby("place_id").count() place_count = place_count[place_count["row_id"]>3] facebook_data = facebook_data[facebook_data["place_id"].isin(place_count.index)]
x = facebook_data[["x", "y", "accuracy", "day", "hour", "weekday"]] y = facebook_data["place_id"]
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
|
(三)📐特征工程 — 特征预处理 (标准化)
1 2 3 4 5 6
|
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train) x_test = transfer.fit_transform(x_test)
|
(四)🧩机器学习 —knn+cv
1 2 3 4 5 6 7 8
|
estimator = KNeighborsClassifier()
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]} estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
estimator.fit(x_train, y_train)
|
(五)📊模型评估
1 2 3 4 5 6 7 8 9 10 11 12 13
|
score = estimator.score(x_test, y_test) print("最后预测的准确率为:\n", score)
y_predict = estimator.predict(x_test) print("最后的预测值为:\n", y_predict) print("预测值和真实值的对比情况:\n", y_predict == y_test)
print("在交叉验证中验证的最好结果:\n", estimator.best_score_) print("最好的参数模型:\n", estimator.best_estimator_) print("每次交叉验证后的验证集准确率结果和训练集准确率结果:\n",estimator.cv_results_)
|