赛题如下图:
总体意思就是:
为了本次比赛,Facebook创建了一个人工世界,由10公里×10公里平方米的10万多个地方组成。对于给定的坐标集,您的任务是返回最可能出现的位置的排名列表。数据被制造成类似于来自移动设备的位置信号,让您体验到如何处理由不准确和嘈杂值构成的真实数据。不一致和错误的位置数据可能会破坏Facebook Check In等服务的体验。
也就是说我们要通过他提供的类似于移动设备上传的位置信息来预测目标在坐标集中的位置。
数据处理
我们将他的数据集读入之后可以发现他的time这一列中都是六位数的数字而并非是我们常见的年月日或是时分秒的表达方式,这里一开始我是没看明白什么意思的。思考了半天才发现原来这里给出的time数据其实是一种时间戳。
时间戳
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。
时间戳转化
也就是说这里的时间数据是难以直接用来分析的,将他转化为具体的年月日或是时分秒的形式可以得到更多的信息,也更利于训练。
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
datatime是pandas库内置的一个非常好用的方法,使用datatimeindex方法将时间戳数据读入之后,可以直接使用day,hour,weekday等方法来从时间戳中提取对应的日期。
数据分析
处理完数据之后,可以观察他的数据有什么样的特征,有没有明显的异常数据需要排除,然后再选择自己的算法。
数据范围缩小
facebook_data = facebook.query("x>2.0 & x<2.5 & y>2.0 & y<2.5")
数据范围缩小的意义
- 减少训练集数据量,缩短训练时间和占用资源
- 可以去除某些偏差值较大的异常数据,防止模型整体受到其影响产生较大的偏差
例如本次赛题中在数据处理的环节我尝试了代码段中使用的范围和1.5~3.0的范围,两种不同的处理方式产生的差异是极其显著的,首先是数据处理速度,两种方法的运行速度是可以被明显感受到的不同,使用范围更大的数据运行时间几乎达到了范围更小的数据的一倍之多。与此同时,对于最终的预测结果也产生了非常大的影响。使用代码段中的数据范围进行预测最终得到了大约百分之三十六的准确率,而使用了更多的数据进行训练的模型最终却只得到了百分之二十八左右的准确率的成绩。由此可见,并不是数据集越庞大就越能产生更好的效果,而是要尽可能地剔除数据集中的“噪声”,使用更加符合数据集整体特征地数据进行训练,才能产生更好的效果。