预计所需阅读时间:5分钟

店铺客流量
这个数据科学项目由个人完成,注释比较完善,有目录与结论。涉及时间序列的处理,但有完善的地方,在结尾会补充。

总结

1.特征工程部分:

  • 做这次考核作业用了4.5天时间,2天半的时间都在反复处理特征工程当中,1天半用来对比训练模型和做最后预测要提交的数据。
  • 这次训练数据约25万多条,比较完好,821个店铺,分布在9个大区,103个城市当中。从不同店的客流图看,不同的店铺总体客流量不一样,开店较长(最长有16个月)的店铺可以看出在一定时间段内呈周期变动,开店较短(最短只有20天)的店铺也有一定周期性,但变动更大。因为客流数据受店铺本身、店铺特性、位置、天气、节假日的多种因素的影响,如果结合时间序列加法或乘法模型来做预测,那么特征工程变得得更加巨大。所以这次考核只是用时序序列客流特征结合提供的数据特征来做预测。
  • 对于1663个天气数据文件,手动删除了体积小于20K的文件,因为这些只有一两列是有数据的;体积大于30K的文件,通常有全部的天气信息;20-29K的文件,通常有大部分天气信息。同时也手动删除了9个大区以外的天气文件,剩下323个可用文件。部分天气特征的缺失值用前一天的数值来填充。将这些文件分为9个大区,其天气特征按均值合并,合并成大区的天气数据,保存成以w_大区名.csv为名的文件。
  • 在这323个可以天气数据中,结合提取出来的大区和城市特征,发现有34个城市,称一类地方,可以直接用对应的城市天气数据合并到训练数据的后面;有7个城市,称为二类地方,缺失列比较多,要用大区天气数据填充二类地方的缺失数据,也就说某个城市的天气情况应该与大区的天气情况类似。部分天气特征的缺失值用前一天的数值来填充。这两类地方保存成19个以大区名_城市名.csv为名的文件。
  • 有62个城市是没对就城市的天气数据,所以用大区的天气数据填充。最后把这三组带天气特征的数据合并起来。剩下lagging1-21列用0来填充,店铺没开张或节假日休息客流视为0。保存为data_w_weather_fill0.csv的文件。
  • 用前值,用0,还是用均值填充,应当以经特征反遇的实际情况来处理。
  • 从特征重要性的图和不要重要特征的图可以看出,除了时间序列的客流特征外,天气特征很多在前面,加上天气类特征还是有作用的。大区独热编码特征基本在后面,原来加过城市独热编码特征,全部都在后面,而且重要性全在0.001以下,所以后来删除了。
  • 没做时间序列客流特征时,线形模型得到的R2不到0.4,加了前七天客流特征加,接近0.5。然后再加到前14天客流特征也有提升,从特征重要性看,前14天比前一天还重要。于再次以构建时间序列客流特征,加到了前21天。从特征要性看,前一天和前21天的重要性差不多重要,所以加到前21天还是有用的。因为开店最短的店铺只有20天,就没加到前28天的数据。
  • 提供数据的店铺id顺序据的店铺id顺序不同,我是将两者合并后再做factorize,训练集最后的store_id是820,提交数据最后的store_id是680。

2.模型训练与调参部分:

  • 此次数据感觉比上次考核的数据自身的噪声更比,也更难做准确的预测。
  • 线性回归和岭回归在这次数据R2评分中排名第三、第四,次于两个集算法,但本身模型的能力或复杂度受限,即使岭回归有6个参数可以调,但对RMSE、R2等评价指标提升作用非常微小。CV验证的R2默认参数下是0.4926,优化调参是0.4928。但是线性模型有个明显的优势是——快,在做特征工程后,可以通过线性模型来作初步评价,从而反推特征工程有没有做,还有没有提升的空间。
  • 默认参数下,集成算法都统一参数n_estimators=50,在CV验证的R2评分中,第一是随机森林为0.5193,第二梯度提升0.5162,估计其它集成算法也是0.5起步。随机森林经过调参后,R2指标从0.5193提到到0.5397,相当于2个百分点,也是有明显提升。因为训练的时间成本,就不再做其它集成算法的比较,而是将更多时间放在特征工程上。
  • 目前用的笔记本电脑是i7-6700HQ的CPU,上次5万条的数据集(离散型90个左右特征),做3折CV100次随机参数的搜索,用了7分钟左右,做网格搜索也找了144组参数左右,时间也在5分钟左右。这次数据是25万条的数据集(构建78个特征),只做了20次随机参数搜索,一共用了分钟,网格搜索只搜索了12组参数,时间用了43分钟。(44分钟/25万/12组参数) / (5分钟/5万/144组参数)这次计算成本是上次20倍左右。也就说随差数据量的翻倍,时间复杂度不只翻倍,尤其对于复杂的模型、集成算法这些。在实际业务中,数据量翻倍是很容易,但是计算的CPU的翻倍还是比较难。

3.可完善的地方:

  • 读取各个天地数据文件,可以使用标准库glob来完成,有比较简单好用的方法。
  • 时间序列仍可以处理出更多的特征,可使用tsfresh模块来完成,其文档在这:https://tsfresh.readthedocs.io/en/latest/