你能在泰坦尼克号上活下来吗?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新常态.核心业务系统上云,云上的业务创新,这些都产生了大量的业务数据,这些数据也成为了企业最重要的资产.资源. 阿里云基于 ...
随机推荐
- AAAI |如何保证人工智能系统的准确性?
|如何保证人工智能系统的准确性?" title="AAAI |如何保证人工智能系统的准确性?"> 注:本文译自AI is getting smarter; ...
- FormsAuthenticationTicket身份验证通过后无法登陆---可能存在的问题
这是我自己遇到过的,FormsAuthenticationTicket身份验证通过后还是存在无法登录的问题,调试了很长时间还是没有发现问题,最后突然想到是否是因为cookie长度限制,导致不能将信息存 ...
- K-means真的不能使用曼哈顿距离吗?
问题 说到k-means聚类算法,想必大家已经对它很熟悉了,它是基于距离计算的经典无监督算法,但是有一次在我接受面试时,面试官问了我一个问题:“k-means为什么不能使用曼哈顿距离计算,而使用欧式距 ...
- css实现边框动画效果
最近写了几个页面都用到css动画,以及很多before,after伪类.在此记录一下成果.css边框循环动画,页面效果如下: 1.沿着边框动画的图形使用before,after伪类写的.当时想用切图来 ...
- jdk1.5之后,classpath不需要再配置
1.5之后更智能了. 设置了classpath之后,当前目录失效(在classpath中没找到就报错,不会再在当前目录继续找),所以要把当前目录添加到classpath,永久环境变量添加 .,临时环境 ...
- VUE实现Studio管理后台(九):开关(Switch)控件,输入框input系列
接下来几篇作文,会介绍用到的输入框系列,今天会介绍组普通的调用方式,因为RXEditor要求复杂的输入功能,后面的例子会用VUE的component动态调用,就没有今天的这么直观了,控件的实现原理都一 ...
- 从0到1使用MyBatis
MyBatis作为最流行的数据中间层,成为企业Java软件开发中非常重要的软件. 一.基本配置 1.首先需要导入Maven <dependency> <groupId>org. ...
- Eclipse与MyEclipse的联系和区别
Eclipse与MyEclipse的联系和区别 Eclipse 是一个IDE(Integrated Developing Environment),而这个IDE是允许安装第三方开发的插件来使自身的功 ...
- Python 三程三器的那些事
装饰器 1.什么是装饰器 装饰器本质是函数,用来给其他函数添加新的功能 特点:不修改调用方式.不修改源代码 2.装饰器的作用 装饰器作用:本质是函数(装饰其他函数)就是为其他函数添加其他功能 装饰器必 ...
- GCC 特性整理
1, attrib 属性 1.1 对齐指令 2,结构体名称 3,switch case 必需{} 否则会报错 a label can only be part of a statement and a ...