K-近邻算法--预测facebook签到位置
学习目标:
-
目标
-
通过Facebook位置预测案例熟练掌握k-近邻算法
-
1 项目描述

2 数据集介绍

train.csv test.csv
row id:签入事件的id
x,y:坐标
accuracy:准确度,定位精度
time:时间戳
place_id:签到的位置,也就是你需要预测的内容
3 步骤分析
-
对于数据做一些基本处理(这里所做的一些处理不一定达到很好的效果,我们只是简单尝试,有些特征我们可以根据一些特征选择的方式去做处理)
-
缩小数据集范围 DataFrame.query()
-
选取有的时间特征
-
将签到位置少于n个用户的删除
-
-
分割数据集
-
标准化处理
-
k-近邻预测
具体步骤:
1.获取数据集
2.基本数据处理
2.1 缩小数据范围
2.2 选择时间特征
2.3 去掉签到较少的地方
2.4 确定特征值和目标值
2.5 分割数据集
3.特征工程 --特征预处理(标准化)
4.机器学习 -- knn+cv
5.模型评估
4 代码实现
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
# 1.获取数据集
data = pd.read_csv('train.csv')
# 2.基本数据处理
# 2.1 缩小数据范围
partial_data = data.query("x>2.0 & x<2.5 & y>2.0 & y<2.5")
# 2.2 选择时间特征
time = pd.to_datetime(partial_data['time'], unit="s")
time = pd.DatetimeIndex(time)
partial_data['hour'] = time.hour
partial_data['day'] = time.day
partial_data['weekday'] = time.weekday
# 2.3 去掉签到比较少的地方
# 先分组再聚合,将数据按照place_id进行分组,然后计算每个分组中的行数
# 创建一个名为 place_count 的数据框,其中每行代表一个唯一的 'place_id' 值
place_count = partial_data.groupby('place_id').count()
place_count = place_count[place_count['row_id'] > 3]
"""
检查 partial_data 数据框中的 'place_id' 列的每个值是否在 place_count 数据框的索引中存在。它返回一个布尔值序列,其中每个元素指示对应的
'place_id' 是否存在于 place_count 数据框的索引中。
"""
partial_data = partial_data[partial_data['place_id'].isin(place_count.index)]
# 2.4确定特征值目标值
x = partial_data[["x", "y", "accuracy", "hour", "day", "weekday"]]
y = partial_data['place_id']
# 2.5分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=2, test_size=0.25)
# 3 特征工程 -- 特征预处理(标准化)
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
# 4。机器学习
# 4.1 实例化一个训练器
estimator = KNeighborsClassifier()
# 4.2 交叉验证网格搜索实现
param_grid = {"n_neighbors": [3, 5, 7, 9]}
# n_jobs指定cpu个数
estimator = GridSearchCV(estimator=estimator, param_grid=param_grid, cv=3, n_jobs=6)
# 4.3 模型训练
estimator.fit(x_train, y_train)
# 5。模型评估
# 5.1 准确率输出
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
# 5.2 预测结果
y_pre = estimator.predict(x_test)
print("预测值是:\n", y_pre)
# 5.3 其他结果输出
print("最后的模型是:\n", estimator.best_estimator_)
print("最好的结果是:\n", estimator.best_score_)
print("所有的结果:\n", estimator.cv_results_)

浙公网安备 33010602011771号