Titanic: Machine Learning from Disaster</h3>
院选了个Machine Learning和Data Analysis In R,所以就开始看着方面的文章,然后就要用到python和r,怎么装,就看另一篇说明(此处应有链接)吧。
()是原文解释说明,[]是我的吐槽,转载请注明出处。</blockquote>
Getting Started With Random Forests
Getting Started with Random Forests: Titanic Competition
ABSTRACT
The last step in this series of tutorials will be a quick guide to multivariate models that truly learn from your data. As far as competing and doing well in Kaggle competitions, this is the most important page, however there is much more to learn beyond this. We hope this gives you a taste of how simple it can be to apply a sophisticated algorithm.
本系列教程的最后一步,将会是一个简单指导,教会你从实际的数据中得到一个多元模型。如果你想参加Kaggle竞赛并取得名次,那么这份[作死]说明将显得极为重要,当然,这说明并不“只有”一页,你还要学得有很多。我们希望让你“品尝”到应用一个复杂的算法是那么的简便。
Quick Recap 快速回顾
之前的教程告诉我们怎么使用Excle和脚本语言python打开数据文件。我们建立了一个简单的模型并把它作为Titanic Competition的结果提交了,[剧透+高能预警,按照本教程选取的特征向量建立的随机森林模型推算出的结果,比之前做的Gender class model 基于性别分类模型,推算的结果还要差,这在本教程后段Word of Warning!!!中提及]。我们将要通过之前习得的技能去建立一个名为random forest随机森林的东西(或者,称之为,多个决策树集合)[或者,称之为,黑暗森林(伪)]。
Python之美
这就是你投入大量精力让Python运行起来而获得的回报![好吧,装python环境还是蛮简单的,额,在你找到窍门后]在之前的教程中提到,Python拥有易上手的内构包,例如帮助你对数组进行操作,计算复杂的数学方程式,读取复杂格式的文件,以及,本次需要建立的随机森林。你需要安装scikit-learn的包[pip install安装本地whl文件罗],这个包里面有方便使用的RandomForestClassifier类。(如果你装的是名为Anaconda的python的IDE,那么scikit-learn这个包是已经安装了的。)如果你想了解更多有关包的说明,那就访问这个页面。[还是要看的,因为里面参数是怎么用的不知道呀]
什么是随机森林
就像漫漫人生中的困扰一样,你最好去维基上面查看确切的定义[蛤?this is best deferred to the Wikipedia page.]。随机森林是多个决策树的集合,如果按本次泰坦尼克生存预测的需求,每个决策树会输出一个预测的数值[也就是,你,生还是死,1还是0]。每一个决策树由训练集随机选取的一个子集[应该是有放回的选取]构成[具体算法还是挺有趣的]。在你调教好你的随机森林后,你就可以传入测试集来得到一个预测结果。是不是很简单呀?不过不要高兴得太早,这个python的函数有个特殊的要求,那就是输入的数据必须是浮点型,所以对于我们正要进行处理的泰坦尼克死亡名单来说,所有字符型数据都必须要进行转化,所有丢失的数据必须补齐。
我该如何进行数据清理和填补
在上一个关于pandas的教程里,你学会了使用pandas的相关包来对数据集进行清理和填补。现在就是你实践的时候了。
不是所有的数据都可以转化成浮点格式。比方说,遇难者的姓名。在这样的情况下,我们一般将这些难以难以转化的列给抛弃。还比方说,遇难者的性别,虽说它们是字符型的,但可以转化成1和0的形式以示区分;遇难者的登船港口,可以用0、1、2的数字来对应港口法国瑟堡、英国南安普顿、新西兰皇后镇。但是,你还需要考虑到,皇后镇是2,南安普顿是1,前者在数值上后者的两倍,但实际上并不需要这个两倍关系,所以这样使用数字来替换字符的分类方式看起来是没有意义的。就算数据集的特征不是那么多,随机森林还是具有鲁棒性的。
将类别字符串转化成浮点型的是靠自己的直观感受,赋1还是赋2都是自己说了算。但是,对数据集进行填补,则会变得更复杂。某些数据不能简单地填补(比如泰坦尼克数据集中的船舱舱号),没有完全了解整艘船她所有舱室和票价,你是不能随意给某位舱室号已丢失的乘客填补一个舱室号的。虽说如此,票价还是可以估计的,如果你知道该为乘客购买的舱室等级或者他的年纪,就可以通过拥有大致相同年纪或舱室等级一致的其他乘客所花的票价,取其中位数来进行估计。所幸缺失数据量不算太大,你所填补的数据对你的预测结果没有太大的影响。
可以开球了
使用scikit-learn包中的预测算法是十分简单的。事实上,可以简单归结为3个步骤:初始化模型,输入训练集,预测新的值[你要的结果]。
注意到,scilit-learn包中的模型一旦初始化,它就会提供一些已经命名了的函数,[然后你就可以选择直接使用],你可以在对应的模型的说明文档中找到这些命名函数的更多信息。例如:
some-model-name.fit( )
some-model-name.predict( )
some-model-name.score( )
做到这里,假设你已经将训练集以数组的形式保存,这个数组的第一列column[0]表示生还情况,训练集中的有关姓名、船舱号、船票信息的列已经被移除,并且性别和登船港口已经被转换成了数字。(如果你刚刚完成了之前的关于pandas的教程的话,那么你还需要把刚刚处理了的数据集中的乘客编号给移除。)
1 | # Import the random forest package 引入包操作 |
1 | # Create the random forest object which will include all the parameters |
1 | # Fit the training data to the Survived labels and create the decision trees 第0列是编号,第1列是生还情况 |
1 | # Take the same decision trees and run it on the test data |
以上代码就这么多,你可以在Data Page中找到。
上述输出会是一长串数组,长度等于你输入的训练集中的乘客数目,并且包含是否生还的预测结果。你可以改变输出数组的形式来让你看得舒服,这些都可以在RandomForestClassifier说明文档中看到。
警示!!!
[上传预测结果后,兴奋地]到排行榜上去看,[如果预测结果跟实际结果越接近,得分越高(区间在0到1)]
我[作者]用这种方法做出的预测结果没有任何进步?!这太奇怪了,就像你最初的想法,“这种方法更复杂,所以预测出来的结果应该更准确才对呀!”。这样看似出人意外的结果狠狠地给你上了一课:
- 一个模型简单并不意味着它不好。有些时候,那些短小、简单的对数据集的描述,恰恰反映了这个数据集真正的特征和性质。
- 这个不是我[作者]提交的最终分数!我还没有完成这个模型的最终建造,谁知道我能从中赢得更多分数?我已经建立了在对训练集的假设下的模型,我们还不知道在私人排行榜上这个模型能得到几分。
- 因为这个数据集非常小,让得分发生变化的就仅仅是生还情况,1和0的跳动就能影响整个得分。这就意味着,得分实际上并不能完全评价这个数据集下的模型的好坏。泰坦尼克遇难者分析的教程是告诉你面对更困难的问题该如何运用简单的方法,所以当你发现你极其复杂的随机森林并不能打败基于性别的模型[上个关于python教程里的产物],你就别太灰心了。
结论
现在你终于拥有相应能力可以崭露头角,你将参加Kaggle的更大型的比赛,当然,首要的是这个比赛的奖金。关于你的模型还有一些进步的可能,所以请你在论坛上随意评论、提问(甚至回答别人的问题)。你在项目中的经历,以及在其中产生的问题,都将会与他人分享。
要记住,分数在0.79-0.81区间的,实际上已经算是好成绩了,0.81-0.82区间的可以说你的模型已经差不多要超过原始模型了。这个数据集比正常的要小,所以有很少的特征被你的模型考虑到。NOTE:你可能看到在排行榜上竟然有精确度在.90甚至到100%的大牛的存在—这样的结果很有可能并不是从统计模型中计算而来,只是他们在网络上百度到的(这样做完全就是与初衷相违。)所以真的,别把他们当回事!这里有个帖子讨论究竟我们该追求多高的精度,你可以看一下。
为了进一步炼化你的模型,你可以从以下几个方面去入手:
- 重新考虑你进行数据清理和填补的方式是否最优。
- 在特征工程[feature engineering]上更具创造性,即,从训练集提取出更多特征来加入你的模型中,使你的模型拥有更多列。
- 考虑另一种模型趋近方式。比如,逻辑斯狄克回归[logistic regression]模型在像是0或者1的预测2元输出的情景下更能广泛应用。
Added note:如果你想试试其他工具来完成python的分析工作,我们推荐你点击这个链接获取到R语言入门的教程。
我们同样有延伸阅读提供给你更多教程与建议。
祝你好运!原力与你同在!