开发者社区> 问答> 正文

比赛_快速入门_4_19_update_仅供参考,思维不要受局限

【这里只讲快速入门——即破题,正负样本不平衡、特征数量等问题就自己多看论文或者其他资料吧~~如果还有数据挖掘相关基础知识不了解的,建议看看《数据挖掘导论》】


【以下是理解错误案例】:错误的根本原因是不能保证训练集的构建逻辑与赛题目标保持一致,不能保证训练集和测试集的构建逻辑保持一致,不能保证离线评测的逻辑和线上保持一致!


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,所以最后都没什么时间做了(那时候排行榜变化还是很激烈的),所以,如果真心想做好比赛,今年还是做好规划比较好~~





展开
收起
小斯never 2015-03-22 18:22:43 34145 0
24 条回答
写回答
取消 提交回答
  • Re比赛快速入门419update仅供参考,思维不要受局限
    先顶一个 楼主辛苦
    2016-04-26 17:30:21
    赞同 展开评论 打赏
  • Re比赛快速入门419update仅供参考,思维不要受局限
    谢谢小斯never的分享哦
    2016-04-17 10:54:10
    赞同 展开评论 打赏
  • Re比赛快速入门419update仅供参考,思维不要受局限
    新添加的这三条都好难理解啊。比如第一条:给样本标正负。不是应该根据第一天购买情况进行标记么?这不就等同于在分割点之后第一天的购买情况进行标记么?因为这个样本在分割点前后都出现过啊。但是第2条又说,不能用分割点未来第一天的ui。对ui标记的话不是只能用分割点未来第一天的内容进行标记么?
    3.第三条的逻辑保持一致又是什么意思呢?

    -------------------------

    Re比赛快速入门419update仅供参考,思维不要受局限
    在前面说:“    因此,用12-18发生了购买的user_id、item_id作为正样本,未发生购买的作为负样本,从而让算法模型进行学习“知识”!
        ”,但是后面又说“ 那么,在本赛题里,用于划定训练集的分割点即为12-18  00:00,则训练集数据来源将限定在11-18—12-17这30天内,且会用12-18整天的购买情况用于对11-18—12-17之内的样本(注意!不包括12-18当天的ui)进行类别标记(即确定这些样本在12-18时,哪些是购买、哪些是未购买)。”感觉有点矛盾啊。请问12-18的样本究竟是用还取正样本还是不用来取正样本呢?

    -------------------------

    Re比赛快速入门419update仅供参考,思维不要受局限
    请问,一次整个过程需要有两个分割点么?测试集一个。离线测试的时候是12月18日0;00.训练集也要有一个分割点:12月17日0:00.分割点前的数据用来提取特征。分割点后的数据用来标记样本?
    2015-04-21 19:10:48
    赞同 展开评论 打赏
  • Re比赛快速入门419update仅供参考,思维不要受局限
    楼主你好,想问下您:如果用分类模型作预测的话,是不是每种商品都需要建立一个分类模型?那目前40多万商品,岂不是要建立40多万个模型??万分感激
    2015-04-19 19:50:28
    赞同 展开评论 打赏
  • Re比赛快速入门45update仅供参考,思维不要受局限
    NICE啊。一直在想这次的题跟上次的区别,读了此文思维开阔了。
    2015-04-07 20:15:25
    赞同 展开评论 打赏
  • Re比赛快速入门45upadate仅供参考,思维不要受局限
    11.18-12.17    是 30天

    而不是第29天吧?
    2015-04-06 22:06:17
    赞同 展开评论 打赏
  • Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    有两个问题想问
    1. 一个user购买某个以前,必须要浏览它吗?
           如果是的话,那对一个特定的user和item 的组合, 必须要先有 行为1,然后再有 行为4. 但是我整理数据的时候发现不是这样,有个别 user,item 的组合只有 行为4, 也就是说,这个人没浏览这个产品直接就买了。
          前面有类似的问题,给出答案说可能是数据丢失。 我猜测出现这种情况可能是因为,给的只有一个月的数据,可能是这个人在11月18号以前看的,但是我们是从11月18开始记录,所以就没有对他浏览商品的记录。无论是什么原因,对于这样的数据我们需要进行特殊处理吗?需要自己补充一个 行为1 2 3吗?

    2. 对于12月18号以前购买的商品,我们要怎么处理?
          《入门》里面说, “训练集数据来源将限定在11-18—12-17这29天内,且会用12-18整天的购买情况用于对11-18—12-17之内的样本进行类别标记(即确定这些样本在12-18时,哪些是购买、哪些是未购买)”。 那对于18号以前购买的商品,我们应该怎么使用?
                       a.假设用户不会在购买,或者购买的概率很低,以此作为 预测18号的购买情况 的一个特征?
                       b. 假设用户在 12-14号买了商品,那把11-18 - 12-13 当做一个sub-dataset 来预测 12-14?
           感觉 a和b都不是很合理。。请求指导。。。
          
    2015-03-31 06:56:37
    赞同 展开评论 打赏
  • Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    你好,如果想本地测试,怎么划分自己的验证集?是把17号的作为标记,用18号来验证;还是将<use_id,item_id>进行划分呢?

    -------------------------

    回37楼小斯never的帖子
    如果没理解错的话,<<入门>>里面是指用18号的数据标记之前的数据作训练集,19号的数据作测试。我想问的是怎么从前18天的数据中划分出测试集,不知道是不是我理解的有问题,还请奈文明示
    2015-03-30 19:12:31
    赞同 展开评论 打赏
  • byy
    Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    请问一下:如果用户购买了某件商品,那是不是一定会有点击,加购物车这个过程,即一次购买是不是会出现1,3,4三个操作?
    我在处理数据的时候发现有的用户只有购买操作,没有点击和加购物车这个流程,是因为数据丢失了吗?
    2015-03-30 09:42:50
    赞同 展开评论 打赏
  • Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    "我们要预测的是12-19的购买情况,也就是我们要预测在12-19,哪些user会购买哪些item,也就是以user_id 、item_id确定一个样本,哪些样本的类别是购买、哪些是未购买(这里暂时只考虑user已经有过操作记录的item,否则会导致需要预测的u-i对过多,预测精度下降)!"
    这里的意思是否说,要预测的样本(user_id, item_id)在过去的一个月的行为数据D出现过?即过去一个月user_id已对item_id有关操作记录?若12月19日,用户A购买了商品B,但过去一个月用户A没有对商品B进行过相关操作,那么即使12月19日用户A购买了商品B,(A,B)不应出现在评分数据中?
    2015-03-29 20:46:33
    赞同 展开评论 打赏
  • Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    @小斯:您说   ------会用12-18整天的购买情况用于对11-18—12-17之内的样本进行类别标记。就是说只要在12-18当天买了U-I,那么11-18—12-17的同样的U-I记录就标记为正样本,否则为负样本?那么12-18 当天的数据呢?也应该标记吧?

    -------------------------

    回14楼小斯never的帖子
    @小斯:您说   ------会用12-18整天的购买情况用于对11-18—12-17之内的样本进行类别标记。就是说只要在12-18当天买了U-I,那么11-18—12-17的同样的U-I记录就标记为正样本,否则为负样本?那么12-18 当天的数据呢?也应该标记吧?

    -------------------------

    回14楼小斯never的帖子
    @小斯:您说   ------会用12-18整天的购买情况用于对11-18—12-17之内的样本进行类别标记。就是说只要在12-18当天买了U-I,那么11-18—12-17的同样的U-I记录就标记为正样本,否则为负样本?那么12-18 当天的数据呢?也应该标记吧?

    -------------------------

    Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    @小斯 :标注 就是为了分类啊,
    2015-03-29 11:20:48
    赞同 展开评论 打赏
  • Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    用12-18整天的购买情况用于对11-18—12-17之内的样本进行类别标记。11-18~12-17样本数量很大,如果用12-18号一天的样本去标记,将会导致正负比例严重失衡,统计了下有1:4000左右,请问该怎么解决?

    -------------------------

    Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    还有个问题,像第一赛季这样的数据量,特征取多少维比较合适呢?
    2015-03-29 10:51:46
    赞同 展开评论 打赏
  • Re:比赛_快速入门_03_27(关于《入门》有不明白的请留言,我尽量及时更 ..
    每天可提交多次,每次会覆盖上次的提交结果。0点开始评测,正常情况2小时内能看到结果,F1值精度为小数点后4位
    2015-03-28 23:09:50
    赞同 展开评论 打赏
  • Re比赛快速入门update0327(有不明白的请留言,我尽量及时更新)
    提交后多久能看到自己的F1评测分数?精度是多少?还是只能等第2天看排名才知道自己的F1值?每天最多可以提交几次?
    2015-03-28 22:08:33
    赞同 展开评论 打赏
  • Re比赛快速入门update0327(有不明白的请留言,我尽量及时更新)
    帖子中提到说只考虑用户发生过操作的item,那如果用户19号当天点开了一个之前他都没有看过的商品,然后又买下了这个商品,那么这种情况该怎么预测呢,还是这种情况就不在测试集中?

    -------------------------

    Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    我发现一个很奇怪的事情就是同一个商品id会有很多个不同的位置信息,这是数据错误么
    2015-03-28 19:43:53
    赞同 展开评论 打赏
  • Re比赛快速入门update0327(有不明白的请留言,我尽量及时更新)
    这个可以参考关于编程语言的帖子,主要依据贤木说的。
    2015-03-28 17:12:17
    赞同 展开评论 打赏
  • Re比赛快速入门update0327(有不明白的请留言,我尽量及时更新)
    你好,请问关于比赛使用的编程语言及工具。初赛在本地调试虽然没有限制,但是因为第二赛季是在天池上做的,对编程语言似乎有限制。所以对于编程语言和工具能不能给个建议。

    -------------------------

    Re比赛快速入门0327关于《入门》有不明白的请留言,尽量及时回复
    请问关于数据量和运算量的问题,我用weka导入user的数据时常常内存报错,或者就是一直等。。。。请问这个问题有没有什么好的解决办法?
    2015-03-28 17:06:01
    赞同 展开评论 打赏
  • Re比赛快速入门update0327(有不明白的请留言,我尽量及时更新)
    经过统计发现每天(11-18-12-18排除12-12)的对商品子集的购买量大概在500左右,
    那么12-19号的数据是否也是相同规模的?会不会出现5000或者50000等

    -------------------------

    回8楼小斯never的帖子
    哦,好的
    2015-03-28 08:44:04
    赞同 展开评论 打赏
  • Re比赛快速入门update0327(有不明白的请留言,我尽量及时更新)
    小斯never 你好
    包括这个帖子,已经看了你三个帖子了(去年的两个)

    你多次提到特征提取要提取三个比较大的类别,即
    A.用户 U
    B.商品 I
    C.用户-商品 (U-I)

    但是最后要预测的是 C.用户-商品 (U-I)

    那么 A 和 B 两种特征要怎么使用?是:
    1.将A B 特征加入C特征里面,一起训练模型,还是
    2.对A B C 各分别训练模型,最后将三种模型预测出来的结果进行综合?
    3.其他?

    希望不吝赐教,谢谢
    2015-03-28 00:21:17
    赞同 展开评论 打赏
  • 更新了顶起!
    2015-03-28 00:04:06
    赞同 展开评论 打赏
滑动查看更多
问答排行榜
最热
最新

相关电子书

更多
案例:打造超越用户期待的服务体验 立即下载
案例:打造超越用户期待 的服务体验 立即下载
【云栖精选7月刊】抛开晦涩的算法、模型,让我们来谈谈互联网架构 立即下载