我的第一个 Kaggle 比赛学习 - Titanic
背景
Titanic: Machine Learning from Disaster - Kaggle
2 年前就被推荐照着这个比赛做一下,结果我打开这个页面便蒙了,完全不知道该如何下手。
两年后,再次打开这个页面,看到清清楚楚的Titanic Tutorial - Kaggle,完全傻瓜式的照着做就能做下来。当年是什么蒙蔽了我的眼睛~
Target
use machine learning to create a model that predicts which passengers survived the Titanic shipwreck
Data
Titanic: Machine Learning from Disaster - Kaggle
- train.csv
- Survived: 1=yes, 0=No
- test.csv
- gender_submission.csv: for prediction
- PassengerId: those from test.csv
- Survived: final result
Guide to help start and follow
Learning Model
摘抄的网站的解释,后面具体谈。
- random forest model
- constructed of several "trees"
- that will individually consider each passenger's data
- and vote on whether the individual survived.
- Then, the random forest model makes a democratic decision:
- the outcome with the most votes wins!
- constructed of several "trees"
sklearn.ensemble.RandomForestClassifier
Titanic比赛中用到的是 RandomForestClassifier 算法,在了解这个算法前,我注意到 sklearn 中这个算法类是在 ensemble 模块中,英文不好,不知道 ensemble 是什么意思?所以想先了解一下 ensemble
ensemble
字典的解释是:a number of things considered as a group
听起来有组合的意思。
搜索了一下,在 ML 中有 ensemble learning, 翻译多是“集成学习”,参考集成学习(ensemble learning)应如何入门? - 知乎提到,有三种常见的集成学习框架:bagging,boosting 和 stacking。
从 API Reference — scikit-learn 0.22.1 documentation中也能看出来这几种框架都有相应的算法。
Random Forest 是 bagging 框架中的一个算法。这里就单先试着理解这个,其他框架等以后遇到了再说。但是了解这个之前,还是得先清楚 Ensemble Learning 到底是什么?
In statistics and machine learning, ensemble methods use multiple learning algorithms to obtain better predictive performance than could be obtained from any of the constituent learning algorithms alone.
这个解释应和了字面上的意思,组合了多种算法来获得更好的预测性能,结果优于单用其中的单个算法。
bagging 框架
sklearn.ensemble.BaggingClassifier — scikit-learn 0.22.1 documentation
A Bagging classifier is an ensemble meta-estimator that fits base classifiers each on random subsets of the original dataset and then aggregate their individual predictions (either by voting or by averaging) to form a final prediction.
大意就是:
- 从源数据集中随机抽样一部分子集样本
- 在这个子集样本上训练分类器
- 重复多次上述步骤
- 然后将各分类器的预测结果整合 (求平均或投票)
- 形成最终的预测
问题是:
- 抽取多少次子集样本,即要做多少分类器?
- 随机抽取的算法用什么?
- 整合各分类器结果的时候,求平均和投票各有什么优劣势?
- 如何训练各个分类器?
我都不晓得~
前面提到 Random Forest 是 bagging 框架的一种算法。现在来看看这个算法如何解答我的一些疑问。
Random Forest 算法
1.11. Ensemble methods — scikit-learn 0.22.1 documentation
The prediction of the ensemble is given as the averaged prediction of the individual classifiers.
先明确了一个,这个算法是怼各分类器求平均的。Forest of what? 自然是 forest of trees, 而这里的 tree 指的是 decision trees,所以这个算法其实是 averaging algorithms based on randomized decision trees
random forest builds multiple decision trees and merges them together to get a more accurate and stable prediction.
Random forest对每个分类器都建一个决策树,然后再合并。
分类器是如何划分的呢?还是以 Titanic 的代码为例来试着理解下:
from sklearn.ensemble import RandomForestClassifier
y = train_data["Survived"]
features = ["Pclass", "Sex", "SibSp", "Parch"]
X = pd.get_dummies(train_data[features])
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X, y)
y:是训练集中灾难中存活的人的集合features: 是这些人的特征值,如性别,几等舱等- X :生成 dummy 数据,为什么要用
get_dummies而不是直接用train_data[features]呢?
尝试直接用 train_data[features], 打印 X 的结果是这样的:
Pclass Sex SibSp Parch
0 3 male 1 0
1 1 female 1 0
如果再继续用这个 X 建模的话,会报错:
ValueError: could not convert string to float: 'male'
显然,因为 Sex 字段是 string 类型,而模型需要的是 float 类型,所以不能直接用 train_data[features]
那 get_dummies() 的作用也清楚了,就是将这些 string 类型的字段转化成 float 类型。从下面的打印结果也可以看出,Sex 字段被分成了两个字段,Sex_male, Sex_female, 其值分别是 0 和 1.
Pclass SibSp Parch Sex_female Sex_male
0 3 1 0 0 1
1 1 1 0 1 0
2 3 0 0 1 0
3 1 1 0 1 0
4 3 0 0 0 1
.. ... ... ... ... ...
886 2 0 0 0 1
887 1 0 0 1 0
888 3 1 2 1 0
889 1 0 0 0 1
890 3 0 0 0 1
RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)- 这几个参数分别是什么意思?
- n_estimators : 决策树的数量
- max_depths:决策树的最大深度
- random_state: 控制随机数生成器的,(实际没太明白,这个随机是不是指随机抽样?),可能要和其他参数配合用比如 shuffle。另外还提到,这个数用了控制随机算法,使得运行多次每次都还是产生相同结果?
- To make a randomized algorithm deterministic (i.e. running it multiple times will produce the same result), an arbitrary integer random_state can be used
- 这几个参数分别是什么意思?
具体如何调参,参考 parameter tuning guidelines
Random Forest的应用场景
既然是分类器算法,自然很多分类应用的场景都适合了;另外还有回归问题的场景。
这篇文章The Random Forest Algorithm: A Complete Guide - Built In给出了一个实际例子的类比:
- 你在决定去哪儿旅行,去询问你的朋友
- 朋友问,你以前的旅行中喜欢和不喜欢的方面都哪些
- 在这个基础上给出了一些建议
- 这为你的决策提供了素材
- 同样的步骤,你又去询问另一个朋友
- 以及另另一个朋友
- ...
同样,你拿到了几个 offer,犹豫该接哪个等等;看中了几套房子,决定选哪个,貌似都可以套用这个算法一试了。
学到的几个之前不熟悉的代码
- pandas.DataFrame.head:返回数据集中的头几行数据,参数为 n,默认 n=5
test_data = pd.read_csv("/kaggle/input/titanic/test.csv")
test_data.head()
men = train_data.loc[train_data.Sex == 'male']["Survived"]
rate_men = sum(men)/len(men)
Reference
- 集成学习(ensemble learning)应如何入门? - 知乎
- Ensemble Learning》
- The Random Forest Algorithm: A Complete Guide - Built In
本文由博客一文多发平台 OpenWrite 发布!
我的第一个 Kaggle 比赛学习 - Titanic的更多相关文章
- Kaggle比赛(一)Titanic: Machine Learning from Disaster
泰坦尼克号幸存预测是本小白接触的第一个Kaggle入门比赛,主要参考了以下两篇教程: https://www.cnblogs.com/star-zhao/p/9801196.html https:// ...
- Kaggle比赛:从何着手?
介绍 参加Kaggle比赛,我必须有哪些技能呢? 你有没有面对过这样的问题?最少在我大二的时候,我有过.过去我仅仅想象Kaggle比赛的困难度,我就感觉害怕.这种恐惧跟我怕水的感觉相似.怕水,让我无法 ...
- Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量
Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量 from:https://www.leiphone.com/news/201712/zbX22Ye5wD6CiwCJ.html 导语 ...
- Kaggle比赛总结
做完 Kaggle 比赛已经快五个月了,今天来总结一下,为秋招做个准备. 题目要求:根据主办方提供的超过 4 天约 2 亿次的点击数据,建立预测模型预测用户是否会在点击移动应用广告后下载应用程序. 数 ...
- kaggle比赛流程(转)
一.比赛概述 不同比赛有不同的任务,分类.回归.推荐.排序等.比赛开始后训练集和测试集就会开放下载. 比赛通常持续 2 ~ 3 个月,每个队伍每天可以提交的次数有限,通常为 5 次. 比赛结束前一周是 ...
- 从最近的比赛学习CTR/CVR
https://zhuanlan.zhihu.com/p/35046241 包大人 深度学习炼丹劝退师 278 人赞同了该文章 从最近的比赛学习CTR/CVR 最近在玩kaggle的talking d ...
- 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】
最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...
- FPGA一个博客学习
FPGA一个博客学习 http://bbs.ednchina.com/BLOG_PERSONALCAT_100185_2001619.HTM
- 推荐一个可视化的学习Git的好网站:LearnGitBranching
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:推荐一个可视化的学习Git的好网站:LearnGitBranching.
随机推荐
- 深度学习——GAN
整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 思想 表达式 实际计算 ...
- C# 判断系统版本
本文告诉大家如何判断系统是 win7 还是 xp 系统 使用下面代码可以判断 private static readonly Version _osVersion = Environment.OSVe ...
- Linux 内核SBus连接
当大部分计算机配备有 PCI 或 ISA 接口总线, 大部分老式的基于 SPARC 的工作站使用 SBus 来连接它们的外设. SBus 使一个非常先进的设计, 尽管它已出现很长时间. 它意图是处理器 ...
- VS code 汉化及快捷键修改
VsCode汉化方式 Vscode是一款开源的跨平台编辑器.默认情况下,vscode使用的语言为英文(us),如何将其显示语言修改成中文了? 打开vscode工具: 点击左侧的Extensions(拓 ...
- RocketMQ各组件介绍
Rocket 架构主要分为4部分: Producer 消息发布者,支持分布式集群部署.Produer 通过 MQ 负载均衡模块选择相应 Broker 中的 queue 进行消息投递,投递过程支持快速失 ...
- 基于DDD的微服务设计和开发实战
你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...
- Python实现截图功能
Python实现截图功能 Windows环境下需要用到PIL库,使用pip安装PIL库: pip install Pillow 安装完成,截图方法代码: from PIL import ImageGr ...
- 洛谷$P1864\ [NOI2009]$二叉查找树 区间$dp$
正解:区间$dp$ 解题报告: 传送门$QwQ$ 首先根据二叉查找树的定义可知,数据确定了,这棵树的中序遍历就已经改变了,唯一能改变的就是通过改变权值从而改变结点的深度. 发现这里权值的值没有意义,所 ...
- 理解 RESTful API 设计规范
RESTful是目前最流行的API设计规范,它是用于Web数据接口的设计.从字面可以看出,他是Rest式的接口,所以我们先了解下什么是Rest. REST与技术无关,它代表的是一种软件架构风格,RES ...
- centos下MySQL登录1045问题解决
由于需要在centos下部署整个应用,自然少不了对数据库的操作.但很多人可能会遇到一些问题,比如创建用户成功,但是却无法登录. 无法登陆一般就两个原因.第一,远程访问端口没开,第二个原因就是密码错误了 ...