“Jingle bells, jingle bells
Jingle all the way
Oh what fun it is to ride in a one horseopen sleigh
hey~”
叮叮叮,又到了一年一度的圣诞节,可爱的大家都在朋友圈@微信团队,求一顶萌萌哒圣诞帽~那么大家心仪的圣诞礼物是神马呢?然鹅,现在越来越多滴小盆友,可以选择的礼物种类也越来越多,真的让圣诞老公公非常头疼啊!
这个时候,一个善解人意的小精灵告诉圣诞老人,也许这样一群人能够帮到你!当当当,为了帮助圣诞老人和小朋友们过一个愉快的节日,挑选出大家都满意的圣诞礼物,最近Kaggle的数据分析师们都纷纷献计献策,快来一起看看吧!
问题描述
在kaggle的这个挑战里,我们需要完成一个礼物配对的算法,使大家的快乐值最大化。在圣诞老人给我们的数据中,每一个小孩子都有10个想要的礼物。但是,由于每类礼物的数量有限,圣诞老人在分发礼物时每个礼物都有1000最想要给到的小盆友。如何同时最大化地满足圣诞老人和小朋友们的想法,这是一个问题。并且,在小朋友中,有4000个小朋友是双胞胎,应家长们的强烈要求,双胞胎小朋友的礼物必须一致(别问我为神马,请大家回忆一下和兄弟姐妹争礼物的场面吧)。
那么,究竟神马叫做快乐最大化呢?作为数据分析师,当然是用数据来说话啦!我们的目标就是使下面的快乐值最大化:
Average Normalized Happiness (ANH) =
AverageNormalizedChildHappiness (ANCH) +
AverageNormalizedSantaHappiness (ANSH)
根据这个公式,平均快乐值等于小朋友的平均快乐值加上圣诞老人的评价快乐值。那么,怎么分别得到两个平均快乐值呢?
是小朋友的总数,是礼物的总数。
最大的快乐值:
MaxChildHappiness= len(ChildWishList) * 2,
MaxGiftHappiness= len(GiftGoodKidsList) * 2.
ChildHappiness = 2 * GiftOrder
数据分析
我们手中有两组数据,一组是小朋友的礼物名单,另一个就来自于圣诞老人喜好。
在小朋友的礼物名单里,总共有1,000,000 个小朋友,每个小朋友有10个想要的礼物。
前4000名小朋友是双胞胎,每对双胞胎的序号是相连的,可以看到的是,即使是双胞胎,两个小朋友喜欢的礼物也大不相同,只有大概10%的双胞胎想要的礼物相同,真的是非常让人伤脑筋。
在圣诞老人的礼物名单里,因为每件礼物的数量是有限的,所以他希望可以优先满足上一年表现很好的乖孩子,他在名单按序号列出了优先级名单。通过分析发现,并不是所有的孩子都出现在了圣诞老人的名单里,这些小朋友的礼物又该怎么分配呢?
算法分析
在分析了数据之后,满足双方的条件真的不容易。我不禁想问,假如只按照小朋友的名单或只按照圣诞老人的名单,最后的快乐值如何呢?
对于其他小孩,根据他们的礼物名单顺序分配礼物,只要礼物还有剩余,就尽量满足他们的喜好
对于每个小孩,当他们礼物名单里最喜欢的10个礼物都没有剩余的时候,这时就在剩余的礼物里选取剩余最多的礼物分配给他们。
当我们只考虑圣诞老人的名单时,我们根据圣诞老人的优先级来分配礼物。通过遍历1000个礼物的名单,只要小朋友的名字出现在这个礼物的序列里,就将这个礼物分配给这个小朋友。同样,对于双胞胎,也是按照哥哥姐姐的喜好来配给
因为并不是所以的小朋友名字都出现在圣诞老人的名单里,因此在遍历一遍圣诞老人的礼物名单之后,我们需要再次给这些小朋友分配礼物。同样,也是选择剩余最多的礼物分配给他们。
结果分析:
根据评分要求,我们需要计算出平均快乐值。
计算出的得分如下表,
看到这个结果,大家想到什么了呢?
小朋友优先算法的最终得分远远高于圣诞老人优先算法,在仅仅考虑小朋友愿望的时候,得到的总快乐值就高达0.816。相反,假如我们只考虑圣诞老人的礼物名单,而不顾小朋友的感受,得到的总快乐值不足0.24。这难道不能说明小朋友的愿望其实才是最重要的么?
不得不让我联想到,当我们在给对方选择礼物时,是不是应该多多考虑对方想要什么,而不是自己的孤立想法。当收礼物的人感到真正快乐时,双方都会得到真正的满足,大家好才是真的好,不是么?
所以,圣诞老公公你知道怎么分配礼物了么?以及想要送礼物的你?知道怎么选择礼物了么?
https://www.kaggle.com/junyawatanabe/overviewing-dataset
https://www.kaggle.com/lemonkoala/greedy-v2