项目介绍
本次比赛的目的是预测一个人将要签到的地方。为了本次比赛,Facebook创建了一个虚拟世界,其中包括10公里*10公里共100平方公里的约10万个地方。对于给定的坐标集,您的任务将根据用户的位置,准确性和时间戳等预测用户下一次的签到位置。数据被制作成类似于来自移动设备的位置数据。
数据集
文件说明:train.csv, test.csv
row id:签入事件的id
x y:坐标
accuracy: 准确度,定位精度
time: 时间戳
place_id: 签到的位置,这也是你需要预测的内容
分析步骤
- 1.获取数据集
- 2.基本数据处理
- 2.1 缩小数据范围
- 2.2 选择时间特征
- 2.3 去掉签到较少的地方
- 2.4 确定特征值和目标值
- 2.5 分割数据集
- 3.特征工程 – 特征预处理(标准化)
- 4.机器学习 – knn+cv
- 5.模型评估
导入模块和获取数据
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
fb_train_df = pd.read_csv('train.csv', sep=',', encoding = 'utf-8')
fb_test_df = pd.read_csv('test.csv', sep=',', encoding='utf-8')
fb_train_df.info()
数据预处理
# 缩小数据范围
fb_df = fb_train_df.query('x>2.0 & x<2.5 & y>2.0 & y<2.5')
# 转化时间特征,并添加day、hour和weekday
fb_df['time'] = pd.to_datetime(fb_df['time'], unit='s')
fb_df['day'] = fb_df['time'].dt.day
fb_df['hour'] = fb_df['time'].dt.hour
fb_df['weekday'] = fb_df['time'].dt.weekday
fb_test_df['time'] = pd.to_datetime(fb_test_df['time'], unit='s')
fb_test_df['day'] = fb_test_df['time'].dt.day
fb_test_df['hour'] = fb_test_df['time'].dt.hour
fb_test_df['weekday'] = fb_test_df['time'].dt.weekday
place_count = fb_df.groupby('place_id').count()
place_count = place_count[place_count['row_id']>3]
fb_df = fb_df[fb_df['place_id'].isin(place_count.index)]
fb_df
特征工程
# 确定特征值和目标值
X = fb_df[['x', 'y', 'accuracy', 'day', 'hour', 'weekday']]
y = fb_df['place_id']
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=22)
X_test2 = fb_test_df[['x', 'y', 'accuracy', 'day', 'hour', 'weekday']]
stdScaler = StandardScaler()
X_train1 = stdScaler.fit_transform(X_train)
X_test1 = stdScaler.transform(X_test)
机器学习
knn_clf = KNeighborsClassifier()
param_dic = {'n_neighbors':[1,3,5,7,9], 'weights':['uniform','distance']}
knn_clf_estimator = GridSearchCV(knn_clf, param_grid=param_dic, cv=5)
knn_clf_estimator.fit(X_train1, y_train)
模型评估
score = knn_clf_estimator.score(X_test1, y_test)
print('最后预测的准确率为:', score)
# y_predict = knn_clf_estimator.predict(X_test1)
# print('预测的结果为:', y_predict)
# print('实际结果和预测结果的对比:', y_predict== y_test)
print('交叉验证中最好的分数:', knn_clf_estimator.best_score_)
print('交叉验证中最高的超参数:', knn_clf_estimator.best_params_)
print('每次交叉验证后的准确率和最后的结果:', knn_clf_estimator.cv_results_)