目录
学习目标
一 开发环境
二 项目介绍
2.1 数据集介绍
三 步骤分析
四 运行结果
首先来看看我的开发环境,用的东西还是比较简单的:
作者:嘟粥yyds
时间:2023年01月01日
集成开发工具:PyCharm 2021.1.3
集成开发环境:python 3.10.6
第三方模块:pandas、train_test_split、GridSearchCV、StandardScaler、KNeighborsClassifier
本次比赛的目的是预测一个人想去哪个地方签到。为了这次比赛的目的,Facebook创建了一个人造世界,由位于10公里乘10平方公里的10万多个地方组成。对于一组给定的坐标,您的任务是根据用户的位置,准确性和时间戳等预测用户下一次的签到位置。数据被捏造成类似于来自移动设备的位置信号,让您了解如何处理因不准确和嘈杂值而复杂的真实数据。不一致和错误的位置数据可能会破坏 Facebook 签到等服务的体验。
数据介绍
文件说明 train.csv, test.csv
row id:签入事件的id
x y:坐标
accuracy: 准确度,定位精度
time: 时间戳
place_id: 签到的位置,这也是你需要预测的内容官网:grid_knn | Kaggle
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 < 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)
# 特征工程: 标准化
# 实例化一个转换器
transfer = StandardScaler()
# 调用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
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)
# 方法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])}