赛题
数据集
我们将他的数据集读入之后可以发现他的time这一列中都是六位数的数字而并非是我们常见的年月日或是时分秒的表达方式,这里给出的time数据其实是一种时间戳。
时间戳转换
time = pd.to_datetime(facebook_data["time"], unit="s")
time = pd.DatetimeIndex(time)
facebook_data["day"] = time.day
facebook_data["hour"] = time.hour
facebook_data["weekday"] = time.weekday
数据处理
首先自然是观察数据集中数据的存储形式,再通过matplotlib或是seaborn进行分析,尽可能去除异常值,选择合适的数据范围。
缩小数据范围
facebook_data = facebook.query("x>2.0 & x<2.5 & y>2.0 & y<2.5")
本次赛题中在数据处理的环节我尝试了代码段中使用的范围和1.5~3.0的范围,两种不同的处理方式产生的差异是极其显著的,首先是数据处理速度,两种方法的运行速度是可以被明显感受到的不同,使用范围更大的数据运行时间几乎达到了范围更小的数据的一倍之多。与此同时,对于最终的预测结果也产生了非常大的影响。使用代码段中的数据范围进行预测最终得到了大约百分之三十六的准确率,而使用了更多的数据进行训练的模型最终却只得到了百分之二十八左右的准确率的成绩。
算法
算法选择较为通用的KNN算法,KNN算法有着高精度和噪声,异常值不敏感的特性,比较适合新手入门时接触,但是与此同时他的时间和空间复杂度都比较高,一般来说他肯定不会是最优的算法,还有很大的优化空间。
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)
transfer = StandardScaler()
# 3.2 调用fit_transform
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
estimator = KNeighborsClassifier()
param_grid = {"n_neighbors": [1, 3, 5, 7, 9]}#K值
estimator = GridSearchCV(estimator, param_grid = param_grid, cv=5)
estimator.fit(x_train, y_train)
score = estimator.score(x_test, y_test)
这里是直接使用了sklearn中的KNN方法。
输出结果