Python机器学习实战:我的共享单车被谁骑走了?

專 欄

Python机器学习实战:我的共享单车被谁骑走了?

王莉,Python中文社区专栏作者。985硕士,本科统计专业,迷途知返的统计人,热爱数学,喜欢数据,狂爱钻研,目前转型做数据挖掘工程师,期待与更多同业人交流。❈       

近两年来,‘共享经济’热潮开遍全国,似乎什么都可以拿来共享,最受欢迎做的也最成功的比如:共享单车,还有共享雨伞,甚至奇葩的‘共享 nan you‘。‘共享’概念给我们生活带来便利的同时也不可避免的出现资源供给不足或过剩的危险,以共享单车为例,企业方如何采取合适的单车的投放量成为重中之重。本篇blog以kaggle数据集上的华盛顿地区的共享单车需求量数据集,讨论如何更加准确的预估单车的需求量。 
一、场景应用

预测共享单车的需求量,属于回归问题

二 、数据预处理

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

数据看上去还算整洁,下面来看看数据的缺失状态吧!

Python机器学习实战:我的共享单车被谁骑走了?

美帝的数据收集的全啊,竟没有缺失的数据。省了处理缺失的部分,下面对数据做一些特征工程的事情,让数据更符合我们的需求。 
三 、特征工程 
1.把时间数据转成年月日小时的新特征

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

因为这份数据集相对比较简单,目前我们只对时间做处理即可,下面我

们进入一个有意思的部分:EDA探索,来看看数据里隐藏着哪些有意义的信息。

2.EDA探索

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?


EDA 总结

从上述的可视化结果可以看出: 1.湿度对共享单车使用量影响明显,20-25值是单车用量最多的湿度值,随着湿度增大,单车用量下降; 2.温度对共享单车用量呈现上升趋势,在30-35度达到单车用量的峰值,而后急剧下降; 3.在0-40值风力间,共享单车用量相对稳定,而后随风力增加,单车用量急剧下降; 4.按小时统计单车用量呈现周周期变化,早8点和晚6点需求量最大; 5.特征之间存在一定的相关性 
四、构建基准模型

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

我们构建了三个基准模型,进行5折交叉验证,结果现实随机森林的结果最优,这说明随机森林算法在这个数据集上的结果表现不错,下面将着重针对随机森林算法进行优化。

从训练集结果和验证集结果来看,随机森林的结果存在比较高的过拟合。首先,我们尝试减少特征尝试(采用包裹式算法去除)

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

选择去除特征,模型结果并没有的到优化,反而变得更糟糕,那说明可能不是特征冗余,而是超参数问题,下面将采用网格搜索法寻找最优参数。

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

结果上看在树深度为10,100和500个估计器的时候,效果最好,考虑到模型的复杂度,我们选择参数:max_depth=10,n_estimators=100

下面看一下选择最优参数的学习曲线如何?

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

yohoo!还可以,几乎完美,下面我们将最优参数重新对数据集进行交叉验证,对比基线模型效果有无提升?

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

哇哦!!效果提升明显,比基线模型的mean_score 提升了16%。good job!效果不错

下面让我们放心大胆的进行预测吧!

Python机器学习实战:我的共享单车被谁骑走了?

Python机器学习实战:我的共享单车被谁骑走了?

至此,华盛顿地区的每个小时的共享单车需求量就预测出来了,最后捋一下思路:

1.首先,查看了一下数据的缺失状态,幸好并没有缺失数据,不用缺失处理;

2.其次,我们希望把具体的时间因素考虑在内,故对时间特征进行特征工程处理,衍生出新变量;

3.再次,为了更直观的观察数据状态,我们做了一些特征探索和可视化的工作,目的上更直观清洗的观察数据的形态,结果发现数据特征之间存在共线性问题

4.构建基线模型,为了消除共线性的影响,我们选择使用岭回归,SVM,随机森林三种算法策略进行基线模型的训练,结果现实随机森林的效果明显由于前两者

5.随机森林算法结果存在严重的过拟合延续,我们首先考虑是否存在特征冗余,采用随机森林单变量重要性算法进行变量重要度排序,删除最不重要的三个指标,再次进行模型训练,结果现实,变量删除后,并没有改善模型,而是变得更糟糕

6.故,模型应该不存在特征冗余,而可能是超参数选择的问题,故采用网格搜索策略遍历[2-10]的树深和[10,100,500]的估计器数量,得到最优参数组合。利用最优参数组合重新训练模型,结果显示,提升明显。

7.绘制学习曲线,发现模型比较合适,由此训练结束

8.应用在test集数据,进行预测,得到预测结果。

以上是对共享单车需求量的模型搭建过程,完整代码请点击阅读原文。


Python机器学习实战:我的共享单车被谁骑走了?

长按扫描关注Python中文社区,

获取更多技术干货!

    

Python 中 文 社 区

Python中文开发者的精神部落

合作、投稿请联系微信:

pythonpost

— 人生苦短,我用Python —
1MEwnaxmMz7BPTYzBdj751DPyHWikNoeFS


Python机器学习实战:我的共享单车被谁骑走了?