【这里只讲快速入门——即破题,正负样本不平衡、特征数量等问题就自己多看论文或者其他资料吧~~如果还有数据挖掘相关基础知识不了解的,建议看看《数据挖掘导论》】
【以下是理解错误案例】:错误的根本原因是不能保证训练集的构建逻辑与赛题目标保持一致,不能保证训练集和测试集的构建逻辑保持一致,不能保证离线评测的逻辑和线上保持一致!
1. 有同学在构建训练集的时候,为了给样本(即ui对)标上正负,不是根据分割点之后第一天的购买情况来对分割点之前的ui进行标记,而是根据分割点之前某个时间段内的购买情况进行标记。(要知道赛题是要预测未来一天的购买)×
2. 有同学在选取样本时,用到了分割点未来第一天的ui,理论上说,训练集是不能带有任何未来信息的,不然算法在学习上会“混淆”。
×
3.有同学在离线测评时,用于validation的ui取自相应的测试集,理论上来说,validation set 应该和线上评测的逻辑保持一致。
×
如果觉得计算资源不够用的,可以尝试购买阿里云的服务,也可以提前熟悉S2将会用到的工具。
这里要讲在是怎么用机器学习的算法来进行训练和预测,但是初赛数据相对比较小,做得不好的话很可能还不如规则有效,所以大家好好考量!
如果成绩一直上不去,麻烦多读几遍《入门》,好好理解为什么要这么破题!
----------------------------------------正文-----------------------------------------
首先,我们要确定待解决的问题映射到数据挖掘,具体会是怎么样一个问题。如果连自己要解决的是什么问题都不清楚,那就别提怎么解题了。
根据官方描述,这次比赛要做的就是:根据用户1个月内(11-18~12-18)在手机淘宝上对商品的操作记录(点击、收藏、加购物车、购买共4类操作)以及用户和商品的位置信息、商品的类目信息等,预测用户在未来的第一天(这里即12-19)会购买哪些商品。那么,问题在数据挖掘里是怎么描述的?
0、写在前面
当我们谈论数据挖掘、谈论训练和测试的时候,我们在谈论什么?
首先,要确定题目要我们预测的是什么,这样才能决定让模型学什么(即怎么训练)!
在这里,我们要预测的是12-19的购买情况,也就是我们要预测在12-19,哪些user会购买哪些item,也就是以user_id 、item_id确定一个样本,哪些样本的类别是购买、哪些是未购买。
【P.S. 注意!我们要预测的不是点击、不是收藏、更不是加购物车等动作的发生,所以不要想太多!赛题让我们预测什么!那我们就让模型学习和预测什么!预测太多其他东西只会让模型什么都预测不好!】
确定了要预测什么之后,要知道如何让机器学习算法模型去学习!
直观的理解:在分割点(即12-19 00:00)之前发生了什么事情(在这里称其为“知识”,在数据里表现为数据分布),导致了哪些user会在12-19购买哪些item!
我们拥有的数据是11-18—12-18,显然,我们只能利用决定12-18当天(注意!要预测的只有一天的购买情况)购买情况的“知识”,来模拟预测12-19的购买情况!
因此,用12-18发生了购买的user_id、item_id作为正样本,未发生购买的作为负样本,从而让算法模型进行学习“知识”!
1、 确定这是一个监督学习里的二分类问题。
首先,我们拥有用户的购买记录,因此可以用来标记训练样本(监督学习);其次,要预测的是购买与否,因此,类别是2个(二分类)。
2、 确定训练和测试的单位
数据挖掘里,基本数据单位叫做样本,而在这里,样本的ID由用户(user_id)和商品(item_id)共同决定,有点儿类似数据库里的两个键组成主键,用于表明样本身份。
3、 训练集和测试集的划分
二分类问题,都需要模型经过训练集的学习,从而获得合适的参数(这些参数代表了训练集中所蕴含的“知识”),用于对测试集进行分类。那么,训练集和测试集又该怎么划分和构建?
在这里,要先弄明白一个时序类数据集里非常重要的概念——分割点。在时序类数据集中,训练集往往由“过去”(即分割点之前)的数据构建,模型学习过去的“知识”用于预测未来。因此,训练集绝对不能掺入“未来”(即分割点之后)的数据,以至于学到的不是“知识”,而是“未来”的既有事实。
那么,在本赛题里,用于划定训练集的分割点即为12-18 00:00,则训练集数据来源将限定在11-18—12-17这30天内,且会用12-18整天的购买情况用于对11-18—12-17之内的样本(注意!不包括12-18当天的ui)进行类别标记(即确定这些样本在12-18时,哪些是购买、哪些是未购买)。然后划分测试集的分割点即为 12-19 00:00,其数据来源将包括11-18—12-18整整31天的数据。
划分好训练集、测试集的数据来源,就可以用这些数据构建相应的特征了!
很多同学还是不明白分割点在这里的意义,举个例子:线上测试:测试集的分割点是:12-19 00:00, 训练集的分割点是 12-18 :00;线上测试:测试集的分割点是:12-19 00:00 训练集的分割点是 12-18 :00。当然这只是一种建议。明白了为什么这么划分就好了。
在线下进行离线测评时,务必保持评测逻辑与线上保持一致!!!!
4、 业务知识—>特征工程
没错,之前提到如何划分训练集和测试集,就是为了明确构建特征工程时应该用到哪些时间段的数据。具体如何使用这些数据就是所谓的特征工程。
首先要明白特征工程的意义是什么。
前面提到了数据挖掘的基本单位是样本,模型的训练和测试都以样本(也就是一行记录)为单位进行,而模型训练时所学到的“知识”则来自于对样本的“描述”——也就是特征。
特征如果愈能描述样本的本质,则模型愈能学习到其中所蕴含的“知识”。因此,如何构建特征就显得尤为重要。
那么,样本的本质是什么?
样本的本质由要解决的问题所决定,在这里显然就是——为什么某用户会在12-19购买某商品?即:12-19 00:00之前发生了哪些事导致了该样本为正(或负)?
搞明白了背后隐藏的各种原因,那么,对于样本的描述将愈发精确。
那么,如何找出这些原因?
a、 先要拆解问题
为什么某用户会在未来第一天(12-19)购买某商品?
这个问题包含的对象有用户、商品,那么购买发生与否的原因将取决于用户、商品以及用户和商品之间的关系,也就是:在12.19,什么样的用户很可能会进行购买?什么样的商 品(或类目)很可能会卖出去?而用户和商品(或类目)之间有什么样的关系会决定用户对商品的购买?
b、 分析问题、分析数据
首先,我们要梳理自己对“购买”这一业务的认知——也就是所谓的业务知识。
比如,我们从直觉上知道,如果我访问了某一商品之后很久不再访问过,那么我购买它的可能性会小一些。由此出发,我们可以进行数据统计,计算每个用户从最后一次访问到最终购买某商品的时间跨度,从而可以发现用户对商品的购买意愿是随着时间而衰减的。并且,我们可以利用相应的衰减公式来拟合用户对商品购买意愿的衰减趋势,甚至可以直接将【分割点与用户之前最后一次访问商品之间的时间间隔】作为一个特征。
上面这个例子,就是为了说明:一来要先从已有的业务知识出发,分析数据,并验证或者纠正已有的业务知识,甚至发现新的业务知识;另一方面,可以利用业务知识构建特征,要知道,任何你觉得make sense的业务知识都可以将其用于构建特征、描述样本,再举个例子,你看你会觉得销量越好的商品越可能卖出去,那么商品在分割点前的7天总销量也可以拿来构建新的特征。
总之,特征的构建与对数据的理解、分析是一个不断迭代的过程,两者互为助益。
去年一个帖子以LR为例,简单讲述了如何在实际动手中进行处理:
http://oilbeater.com/categories.html#阿里大数据比赛-ref
5、 选取算法、并以离线测试进行调优
推荐sklearn这一个Python的开源机器学习工具,文档齐全,而且使用也比较简单,当然,也可以使用其他的开源工具,比如weka等,选好一个即可,毕竟只是工具,用的顺手就OK了。
至于具体用什么样的算法比较合适,可以去找找相关的论文或技术博客,分析分析赛题所给的数据适合用什么样的算法。不过这也不是什么特别重要的事情,选好一个算法先上手要紧(最好是先用逻辑斯谛回归,计算速度快,方便上手),毕竟首要是构建好训练集、测试集,并构建能描述样本本质的特征工程。“特征工程决定了模型效果的上限,而算法则决定了接近这一上限的程度。”
离线测评可以参考去年比赛的一个帖子:http://wuchong.me/blog/2014/04/29/odps-sql-build-offline-evaluation/?spm=5176.7189909.0.0.eD9haN#jtss-tsina.
务必保证训练集和测试集的划分、特征构建在逻辑上保持一致,两方面都不要混入分割点之后的数据!而且务必保持训练集在打标签时逻辑与赛题要预测的目标一致!
6、 缺失值填充、抽样、调参、融合
在正式走上轨道之后,比赛还有很多细节方面的东西要处理,除了更进一步构建好特征工程,更要想办法解决特征中的缺失值,以及处理正负样本不平衡带来的抽样问题。而不同算法的参数又该如何调到最优,使得模型的拟合效果达到最优。怎么融合不同模型才能使最终输出的结果取得最佳成绩?
这些暂且不表,毕竟,这次的《快速入门》只是为了帮助同学们快速上手,至于后续这些各种细节上的问题,欢迎阅读我写的《数据挖掘比赛入门_以去年阿里天猫推荐比赛为例》,将更加详细地介绍如何完善模型。
7、 再次强调特征工程
如果你读过kaggle优胜选手们写的经验,一定知道他们多强调特征工程的重要性。可以说,模型效果的80%取决于特征工程。而做好特征工程绝不是一时半会儿的事,需要你深入理解业务、理解赛题、理解数据。这既需要你自己有敏锐的分析能力,也需要你和其他人多多交流、启发思路。
8、 分工
简单讲一下分工,比赛中的工作主要分为以下几个部分:
a. 数据和业务分析
专职分析业务、分析数据,并利用分析结果构建和完善特征工程,总的来说,就是负责整个模型业务上的工作。
b. 码农
专职负责实现所需要的代码,比如,统计分析,提取特征,训练和预测等。
我当时99%是一个人做的,所以整个过程下来其实效率不高,因为在实验记录上不规范,也没自动化代码,使得所耗精力十分巨大,希望参赛的同学,无论分工与否,都务必做好一定的规划,在比赛的流程摸清楚后就将流程规范化,释放自己的劳动力,也提高效率。
P.S.: 千万不要一开始就执着于调参,最好是先理出一个粗糙的流程,把比赛从头到尾先做一遍,然后再将这个过程规范化(代码、实验等方面)、自动化——尤其是因为要换数据,那么流程的自动化和标准化就非常重要,等到对数据和业务的理解已经差不多了,再开始尝试单模型的调优,找到最合适的参数,然后进行不同模型之间的融合。
去年很多队伍似乎是觉得随便抽个时间做就可以进500,所以最后都没什么时间做了(那时候排行榜变化还是很激烈的),所以,如果真心想做好比赛,今年还是做好规划比较好~~
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。