你能在泰坦尼克号上活下来吗?Kaggle的经典挑战
Kaggle
Kaggle是一个数据科学家共享数据、交换思想和比赛的平台。人们通常认为Kaggle不适合初学者,或者它学习路线较为坎坷。
没有错。它们确实给那些像你我一样刚刚起步的人带来了挑战。作为一个(初级)数据科学家,我忍不住要在Kaggle上搜索有趣的数据集来开始我的旅程。我了解了泰坦尼克号数据集。
泰坦尼克号
数据集包含泰坦尼克号上乘客的信息。
我使用Python来可视化和理解更多关于数据集的信息。我用scikit-learn训练了一组分类器来预测一个人的生存几率。然后使用pickle保存模型,并使用Flask将其部署为本地主机上的Web应用程序。最后,我利用AWS来托管它。
代码可以在GitHub上找到。
1.数据检查
首先第一件事。我将数据导入了pandas的DataFrame。它包括乘客身份、存活时间、船票等级、姓名、性别、年龄、船上兄弟姐妹和配偶人数、船上父母和子女人数、船票号码、乘客车费、客舱号码和登船港,前5行数据如图。
可以立即观察到的是:
-每行的PassengerID
都是唯一的,
-Survived
是我们想要推断的目标
-Name
可能没用
-Ticket
是票务数据
-如果Ticket
有缺失就被标记为NaN
。
为了简单起见,我决定暂时放弃Ticket
字段。这些字段可能包含有用的信息,但是需要大量的特征工程来提取它们。我们先从最简单的第一步开始。
另一方面,让我们仔细看看缺失的数据。在变量Embarked
和Fare
中有一些缺失的条目。另一方面,约20%的乘客年龄没有被记录。这可能会给我们带来一个问题,因为Age
可能是数据集中的关键预测因素之一。“妇女和儿童优先”是当时的行为准则,报告显示,他们确实是先得救的。Cabin
大于77%的条目是缺失的,不大可能有帮助,我们先把它去掉。
2.数据可视化
Pair图(下面没有显示)通常是我在数据可视化任务开始时的首选,因为它通常很有帮助,而且它代码少。一行seaborn.pairplot()
给你n2n^2n2的图(准确的是n(n+1)/2n(n+1)/2n(n+1)/2不同的图),其中n代表变量的数量。它让你对每一对变量之间的关系,以及每一个变量本身的分布有一个基本的了解。让我们研究一下不同的变量。
首先逐项检验目标变量与预测因子Survived
的关系。通过seaborn.countplot()
,我们发现大多数人属于第三类,这并不奇怪;一般来说,他们生存的可能性更低。即使有了这个单一的预测器,在其他一切未知的情况下,我们也可以推断,头等舱乘客生还的可能性更大,而三等舱乘客生还的可能性不大。
与此同时,妇女和儿童更有可能生存下来,这与前面提到的“妇女和儿童优先”理论相一致。如果我们只检查三个变量Pclass
、Sex
和Age
,头等舱的年轻女性乘客将是最有可能存活下来的。
然而,可能很难解释密度图seaborn.kdeplot()
。对于“幸存”和“未幸存”这两个类别,它们的跨度很广,而“未幸存”类别的平均值和方差较小。值得注意的是,在“幸存”类的分配中有一个有趣的尾部,即三个人以每人512美元的价格获得头等舱船票。他们都是在瑟堡港上船的,都活了下来。
另一方面,embarkation似乎也在决定谁能活下来方面发挥了作用。大多数人在南安普顿港上船——这是旅程的第一站,他们的存活率最低。也许他们被分配到离出口更远的船舱里,或者花更多的时间在游轮上可以让人们放松或疲劳。或者它只是由第三个变量间接造成的——比如在第一个港口登机的女性/儿童/头等舱乘客更少。还需要进一步的调查。
如果你喜欢表而不是图,我们还可以通过pandas.DataFrame.groupby()
可视化数据,并对每个类取平均值。然而,我不认为下面的Parch
表中有一个清晰的模式。
由seaborn.heatmap()
生成的相关矩阵说明了任意两个变量之间的相关强度。如你所见,Sex
与Survived
的相关性最高,而Fare
和Pclass
高度相关。SibSp
和Parch
在预测一个人的生存机会上似乎没有起到很大的作用,尽管我们的直觉告诉我们不是这样的。
3.缺失的数据填充
我们在之前的数据检查中发现有很多数据项丢失。例如,我们似乎不知道60岁的托马斯·斯托里(ThomasStorey)花了多少钱买票。直觉告诉我们,船票票价在很大程度上取决于船票等级和登机港,我们可以用上面的相关矩阵进行交叉检验。因此,我们只取南安普顿三等舱票价的平均值。这只是一个有根据的猜测,可能是错误的,但它已经足够好了。记住,要获得无噪声的数据是不可能的,机器学习模型应该对噪声具有鲁棒性。
还有两个女人,我们不知道她们上了船。票的等级与票价密切相关。由于她们两人都花了80美元买了头等舱的座位,我猜是在瑟堡(图中的C)。
如果在一个特定的变量中只有很少的缺失项,我们可以使用上面的技巧,通过取最大似然值来进行有根据的猜测。尽管如此,如果我们丢失的数据更多的话,做同样的事情是非常危险的,比如Age
缺失了20%。
我们目前能猜测的已经猜测完了。由于我们丢弃了Cabin
,并且填入了其他缺失的条目,所以我们可以利用所有其他变量,通过随机森林回归变量来推断缺失的Age
。80%的“训练”数据可以推断出剩下的20%。
4.特征工程
虽然其中大多数的头衔是“先生”、“夫人”和“小姐”,但也有一些不太常见的头衔——“博士”、“牧师”、“上校”等,其中一些只出现过一次,如“女士”、“多纳”、“上校”等。他们罕见的头衔对模型训练没什么帮助。为了找到模式,你需要数据。让我们把那些相对罕见的标题归类为“罕见”。
分类数据在模型训练之前需要格外小心。分类器无法处理字符串输入,如“Mr”、“Southampton”等。虽然我们可以将它们映射到整数,比如(‘Mr’、‘Miss’、‘Mrs’、‘Rare’)→(1,2,3,4),但是不应该有头衔等级的概念。当医生并不意味着你就高人一等。为了不误导机器并意外地构造出一个性别歧视的人工智能,我们应该对它们进行一次one-hot编码。他们成为:
((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1))
另一方面,我决定增加两个变量——FamilySize
和IsAlone
。加上FamilySize=SibSp+Parch+1更有意义,因为整个家庭都会在游轮上待在一起。此外,孤独可能是一个关键因素。你可能更容易做出鲁莽的决定,或者你可以在不照顾家人的情况下在灾难中更加灵活。通过一次添加一个变量,我发现它们在模型中的存在提高了整体的可预测性。
5.模型评估
我尝试了我所知道的最流行的分类器——随机森林、支持向量机、KNN、AdaBoost等等。
XGBoost最终以87%的测试精度脱颖而出。为了提高分类器的鲁棒性,我们训练了一组不同性质的分类器,并通过多数投票得到最终结果。
最后,我把它提交给Kaggle,获得了80%的准确率。不坏。总有改进的余地。
例如,在Cabin和Ticket中肯定隐藏了一些有用的信息,但是为了简单起见,我们放弃了它们。我们还可以创建更多的特征
但我暂时先不谈这个。
6.部署为Web应用程序
在Python中,Flask是一个易于使用的web框架。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "<h1>Write something here.</h1>"
app.run(host='0.0.0.0', port=60000)
你可以在本地主机中浏览它。
我们还需要什么?我们希望人们填写一个表单来收集所需的数据并将其传递给机器学习模型。模型将有一个输出,我们将把用户重定向到该页面。
我们将使用WTForms在Python中构建一个表单,单个表单由一个类定义,它看起来像下面这样:
from wtforms import Form, TextField, validators, SubmitField, DecimalField, IntegerField, SelectField
class ReusableForm(Form):
sex = SelectField('Sex:',choices=[('1', 'Male'), ('0', 'Female') ],
validators=[validators.InputRequired()])
fare = DecimalField('Passenger Fare:',default=33,places=1,
validators=[validators.InputRequired(),
validators.NumberRange(min=0,
max=512,
message='Fare must be between 0 and 512')])
submit = SubmitField('Predict')
我找到了一个来自WillKoehrsen的HTML模板,并在其上进行了构建。
7.云托管
现在网页可以通过我的本地主机查看,一切正常。最后一步是在线托管。现在有三种主要的云托管服务——AWS、GCP和Azure。AWS是目前最受欢迎的,所以我选择了12个月的免费服务。
我使用我的私有密钥连接到Linux服务器实例,将我的存储库迁移到服务器,运行我的脚本,它工作了!
对我来说不太好…
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/
欢迎关注PyTorch官方中文教程站:
http://pytorch.panchuang.net/
OpenCV中文官方文档:
http://woshicver.com/
你能在泰坦尼克号上活下来吗?Kaggle的经典挑战的更多相关文章
- 使用seaborn探索泰坦尼克号上乘客能否获救
titanic数据集是个著名的数据集.kaggle上的titanic乘客生还率预测比赛是一个很好的入门机器学习的比赛. 数据集下载可以去https://www.kaggle.com/c/titanic ...
- SU+GIS,让SketchUp模型在地图上活起来
一.SU+GIS的场景展示 skp与卫星地图和倾斜摄影模型相结合人工模型与实景模型完美融合 这么一看是不是直接秒杀了单纯看看skp后联想的规划效果? 二.如何快速把草图大师的结果和GIS结合呢?在图新 ...
- 连接到 Azure 上的 SQL Server 虚拟机(经典部署)
概述 本主题介绍如何连接到运行于 Azure 虚拟机的 SQL Server 实例. 它介绍了一些常规连接方案,并提供了在 Azure VM 中配置 SQL Server 连接的详细步骤. Impor ...
- azure上连续部署web
连续部署web 连续部署web,可以在第一次部署完web应用后,方便修改和自动提交代码部署新版本的web应用.其中自动提交使用github中的webhook,使代码在master上提交修改后可以自 ...
- vue文件上传
今天写一个文件上传的功能,开始想用element-ui的组件写,但是发现不知道怎么把文件标题和内容一起上传,所以用了经典的input框上传. 废话不多说,直接上代码. 这是表单: <el-for ...
- 在WisOne平台上学习TypeScript
TypeScript是微软公司推出的开源的类型化脚本语言,目的是用于为弱类型的javaScript提供强类型的识别和感知功能,同时它提供了类.接口.继承等相关在javaScript中不容易实现的功能, ...
- Python爬虫教程-07-post介绍(百度翻译)(上)
Python爬虫教程-07-post介绍(百度翻译)(上) 访问网络两种方法 get: 利用参数给服务器传递信息 参数为dict,使用parse编码 post :(今天给大家介绍的post) 一般向服 ...
- python中基于descriptor的一些概念(上)
@python中基于descriptor的一些概念(上) python中基于descriptor的一些概念(上) 1. 前言 2. 新式类与经典类 2.1 内置的object对象 2.2 类的方法 2 ...
- 阿里云基于OSS的云上统一数据保护方案2.0技术解析
近年来,随着越来越多的企业从传统经济向数字经济转型,云已经渐渐成为数据经济IT新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源. 阿里云基于 ...
随机推荐
- marquee横向无缝滚动无js
<!DOCTYPE html><html><head><meta charset="utf-8"> <title>< ...
- IDEA打包web项目为war,通过本地Tomcat启动war
1.打包 ①idea的打包很简单,网上教程也很多,简单说下:project struct-->artifact-->+-->Web Application:Archive--> ...
- 连接器巨头Molex莫仕大裁员,CEO更迭
序言:中美贸易战的大环境下,美国多方面限制对华出口电子科技,其中影响最大的莫过于限制芯片出口,中国本土芯片和电子产业也在蓬勃的发展.根据正能量电子了解连接器巨头MOLEX莫仕公司收入的1/3是来自于对 ...
- 菜鸟系列 Golang 实战 Leetcode —— 面试题24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3- ...
- 移动端轮播图实现方法(dGun.js)
本文章介绍在移动端无缝隙轮播图实现的原理,这个轮子比较简单,但可以方便刚刚入门的同学参考.最终效果是在移动端无缝隙无限滑动,可以自定义轮播的速度.支持手势左右滑动.最后会放上源码. HTML部分 &l ...
- vue+express+mysql项目总结(node项目部署阿里云通用)
原文发布于我的个人博客上:原文点这里 前面经历千辛万苦,终于把博客的所有东西都准备好了,现在就只等部署了.下面我介绍下我的部署过程: 一.购买服务器和域名 如果需要域名(不用域名通过ip也可以 ...
- JS基础入门篇(三十五)—面向对象(二)
如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的JS基础入门篇(三十四)-面向对象(一)
- python学习记录_IPython基础,Tab自动完成,内省,%run命令_
这是我第一次写博客,之前也有很多想法,想把自己所接触的,以文本的形式储存,总是没有及时行动.此次下定决心,想把自己所学,所遇到的问题做个记录共享给诸位,与此同时自己作为备忘,感谢各位访问我的博 ...
- PAT-字符串处理-B 1002 写出这个数 (20分)
题目: 思路: 先用字符串数组存储输入数字,然后依据num[i]-'0'对输入数字求和.然后对求和后的数字,进行分割,存储到数组中,然后遍历数组,依据存储汉语拼音的字符串二维数组进行输出 注意点: 注 ...
- Python面向对象之:类空间问题以及类之间的关系
一. 类的空间问题 1.1 何处可以添加对象属性 class A: def __init__(self,name): self.name = name def func(self,sex): se ...