sk-learn Facebook数据集预测签到位置

sk-learn预测facebook签到位置

本次比赛的目的是预测一个人将要签到的地方。 为了本次比赛,Facebook创建了一个虚拟世界,其中包括10公里*10公里共100平方公里的约10万个地方。
对于给定的坐标集,我们 的任务将根据用户的位置,准确性和时间戳等预测用户下一次的签到位置。 数据被制作成类似于来自移动设备的位置数据。
特征值:“x”, “y”, “accuracy”, “day”, “hour”, “weekday”
目标值: place_id
本实例使用Facebook上统计的数据,根据地点坐标和签到时间等特征来训练模型,最终得到目标地点的ID。训练集与测试集比例为8:2。

引入python库:

import pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 1、获取数据集
facebook = pd.read_csv('E:\\train.csv')

在进行数据模型训练时,首先要进行数据预处理

缩小数据范围:因为数据集有2000W+条数据,程序跑起来会非常慢,因此适当缩小数据范围,如果电脑配置够或者租了服务器请随意~
选择时间特征:数据中的时间分离出day,hour,weekend
去掉签到较少的地方:剔除意义不大的特殊地点,减少过拟合
确定特征值和目标值
分割数据集

# 2.基本数据处理
# 2.1 缩小数据范围
facebook_data = facebook.query("x>5.0 & x<6 & y>5.0 & y<6.0")   #选择(2,2.5)这一范围的数据,使用query
# 2.2 选择时间特征
time = pd.to_datetime(facebook_data["time"], unit="s")  #提取时间
time = pd.DatetimeIndex(time)
facebook_data["day"] = time.day  #加一列day
facebook_data["hour"] = time.hour  #加一列hour
facebook_data["weekday"] = time.weekday   #加一列weekday
# 2.3 去掉签到较少的地方
place_count = facebook_data.groupby("place_id").count()   #分组聚类,按数目聚类
place_count = place_count[place_count["row_id"]>3]       #选择签到大于3的
facebook_data = facebook_data[facebook_data["place_id"].isin(place_count.index)]   #传递数据
#facebook_data.shape()
# 2.4 确定特征值和目标值
x = facebook_data[["x", "y", "accuracy", "day", "hour", "weekday"]]  #特征值
y = facebook_data["place_id"]     #目标值
# 2.5 分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 3.特征工程--特征预处理(标准化)
# 3.1 实例化一个转换器
transfer = StandardScaler()
# 3.2 调用fit_transform
x_train = transfer.fit_transform(x_train)   #特征训练集
x_test = transfer.fit_transform(x_test)     #特征测试集
# 4.机器学习--knn+cv
# 4.1 实例化一个估计器
estimator = KNeighborsClassifier()
# 4.2 调用gridsearchCV
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]}
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
# 4.3 模型训练
estimator.fit(x_train, y_train)

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。本实例cv=5,则为5折交叉验证。
在这里插入图片描述

# 5.模型评估
# 5.1 基本评估方式
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)

# 5.2 使用交叉验证后的评估方式
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的验证集准确率结果和训练集准确率结果:\n",estimator.cv_results_)

结果:

最后预测的准确率为:
0.3186439288349594
最后的预测值为:
[3602707468 4806337317 9412700990 … 1791109583 7378133312 7775490916]
预测值和真实值的对比情况:
19906170 False
12295641 False
10880373 False
29035357 True
3061932 False

149732 True
28157471 True
23472323 True
6537756 False
15307880 True
Name: place_id, Length: 73182, dtype: bool
在交叉验证中验证的最好结果:
0.30632584407879954
最好的参数模型:
KNeighborsClassifier(algorithm=‘auto’, leaf_size=30, metric=‘minkowski’,
metric_params=None, n_jobs=None, n_neighbors=1, p=2,
weights=‘uniform’)
每次交叉验证后的验证集准确率结果和训练集准确率结果:
{‘mean_fit_time’: array([1.07066116, 1.26287227, 1.22907038, 1.1558661 , 1.04866009]), ‘std_fit_time’: array([0.03506537, 0.0933163 , 0.0864272 , 0.11834263, 0.0298722 ]), ‘mean_score_time’: array([2.19632559, 3.09637704, 3.59880571, 3.706812 , 3.57380433]), ‘std_score_time’: array([0.11477829, 0.24954856, 0.22115197, 0.32000693, 0.09358861]), ‘param_n_neighbors’: masked_array(data=[1, 3, 5, 7, 9],
mask=[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}], ‘split0_test_score’: array([0.30893439, 0.28902958, 0.29524699, 0.2928329 , 0.28426974]), ‘split1_test_score’: array([0.30693024, 0.28616001, 0.29529254, 0.29119315, 0.28299437]), ‘split2_test_score’: array([0.30262589, 0.2819923 , 0.29287845, 0.28953062, 0.28121797]), ‘split3_test_score’: array([0.30570043, 0.28798196, 0.29643126, 0.292218 , 0.28262998]), ‘split4_test_score’: array([0.30743828, 0.28659925, 0.29614193, 0.29338617, 0.28491391]), ‘mean_test_score’: array([0.30632584, 0.28635262, 0.29519823, 0.29183217, 0.2832052 ]), ‘std_test_score’: array([0.00212076, 0.00240546, 0.00124928, 0.00136167, 0.0012944 ]), ‘rank_test_score’: array([1, 4, 2, 3, 5])}

因为只选用了部分数据跑代码,所以模型训练后测试的准确率不太高,如果可以选用全部数据跑。

————————————————————————-
后面有用全数据跑了一下:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值