学习目标:熟练掌握KNN、数据集划分、交叉验证、网格搜索这些内容。
项目描述
本次比赛的目的是预测一个人将要签到的地方。 为了本次比赛,Facebook创建了一个虚拟世界,其中包括10公里*10公里共100平方公里的约10万个地方。 对于给定的坐标集,您的任务将根**据用户的位置,准确性和时间戳等预测用户下一次的签到位置。**数据被制作成类似于来自移动设备的位置数据。 请注意:您只能使用提供的数据进行预测。
数据集介绍
数据集:
文件说明 train.csv, test.csv
row id:签入事件的id
x y:坐标
accuracy: 准确度,定位精度
time: 时间戳
place_id: 签到的位置,这也是你需要预测的内容
官网:https://www.kaggle.com/c/facebook-v-predicting-check-ins
说明:
1、数据量过大我们只取其中的一小部分进行分析
2、使用K近邻算法
代码:
导入相关的包
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
获取数据集
facebook = pd.read_csv('data/FBlocation/train.csv')
facebook.head()
数据集为:
数据处理
缩小数据范围
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.head()
time = pd.DatetimeIndex(time) #将series转化为dataframe
facebook_data['day'] = time.day
facebook_data['hour'] = time.hour
facebook_data['weekday'] = time.weekday
去掉到达地点次数少的地方
partical_data = facebook_data.groupby('place_id').count()
tmp_data = partical_data[partical_data['row_id']>3]
facebook_data = facebook_data[facebook_data['place_id'].isin(tmp_data.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)
特征工程
transformer = StandardScaler()
x_train = transformer.fit_transform(x_train)
x_test = transformer.transform(x_test)
机器学习
estimator = KNeighborsClassifier()
param_grid = {"n_neighbors": [1, 3, 5, 7]}
estimator = GridSearchCV(estimator, param_grid=param_grid, cv=3)
estimator.fit(x_train, y_train)
模型评估
score = estimator.score(x_test,y_test)
最后的结果准确率有36%~37%之间,还需要选择更适合的模型。