前言

Kaggle是一个数据建模和数据分析竞赛平台。企业和研究者可在其上发布数据,统计学者和数据挖掘专家可在其上进行竞赛以产生最好的模型。这一众包模式依赖于这一事实,即有众多策略可以用于解决几乎所有预测建模的问题,而研究者不可能在一开始就了解什么方法对于特定问题是最为有效的。Kaggle的目标则是试图通过众包的形式来解决这一难题,进而使数据科学成为一场运动。

https://www.kaggle.com/​www.kaggle.com

本文打算利用Python的scikit-learn机器学习第三方库完成该网站上一个预测泰坦尼克号成员生存概率的项目。将继续按照数据分析的步骤对该项目进行逐步分解。

一、提出问题

直接甩原网址链接好了:https://www.kaggle.com/c/titanic

项目简介大家可以自行通过链接获取,简而言之,就是通过项目提供的含有特征和标签的‘train.csv’去预测只有特征的‘test.csv’。

二、理解数据

1. 采集数据

这里的采集数据就直接从官网下数据集就好啦。点击‘Data’,下拉找到‘Download All’。

2.导入数据

下面逐渐进入正题,祭出jupyter notebook!开始码!(建议将数据集解压后放到新建的jupyter文件的同一目录下)

import numpy as np
import pandas as pd
## 训练数据集
train = pd.read_csv('./train.csv')
## 测试数据集
test = pd.read_csv('./test.csv')
print('训练数据集:',train.shape,'测试数据集:',test.shape)

先初步观察两个数据集,训练集共891条数据,每条数据12列,测试集418条数据,每条数据11列,缺的那列自然是需要我们去预测存活情况。接下来将两个数据集合并以方便清洗。

## 合并数据集,便于清洗
full = train.append(test,ignore_index= True) # 要添加的index不出现重复的情况,可以通过设置ignore_index=True来避免

3.查看数据信息

## 查看数据
full.head()

## 描述统计信息(只能看到数值类型数据情况)
full.describe()

## info查看数据类型及总数--可以看缺失数据
full.info()

通过info()可以看到数据集数据的缺失情况,因此下面就进入第三步数据清洗。

三、数据清洗

1.数据预处理

## 平均值填充
## 年龄
full['Age'] = full['Age'].fillna(full['Age'].mean())
## 船票价格
full['Fare'] = full['Fare'].fillna(full['Fare'].mean())
## 登船港口仅有两个缺失值,填众数.mode()[0]
full['Embarked'] = full['Embarked'].fillna(full['Embarked'].mode()[0])
## 船舱号缺失太多,填充U(unknow)
full['Cabin'] = full['Cabin'].fillna('U')
full.info()

缺失的年龄数据用平均数填充,缺失的船票数据用平均值填充,缺失的港口信息用众数填充,船舱号缺失太多只能选择用统一符号标注。填充完成后再次核实数据缺失情况。

2.特征工程

数据分析、机器学习中,最重要的就是选取合适的数据特征,供模型算法训练。若训练的特征相关性高,则能事半功倍,故而特征工程是整个项目的核心所在,这一步做得好后面模型的正确率就高。特征工程就是最大限度地从原始数据中提取能表征原始数据的特征,以供机器学习算法和模型使用。下面,结合本例中的变量,先对其进行分类,然后逐个提取特征。

首先对数据进行分类

这里引入one-hot编码概念,即将类别性数据(非字符串数据)转换成统一的数字格式,方便机器学习的算法进行处理及计算。如本文将性别(Sex)的“男”与“女”标签转换成‘1’与‘0’。

## 性别
sex_mapDict = {'male':1,'female':0}
full['Sex'] = full['Sex'].map(sex_mapDict)
full['Sex'].head()

## 登船港口Embarked 一维变二维,需要建立一个空的二为数据结构
embarkedDf = pd.DataFrame()
## 使用get_dummies进行one-hot编码,列名前缀是Embarked
embarkedDf = pd.get_dummies( full['Embarked'], prefix='Embarked')
embarkedDf.head()
## concat 连接进full去
full = pd.concat([full,embarkedDf],axis=1)

## 客舱等级
pclassDf = pd.DataFrame()
pclassDf = pd.get_dummies( full['Pclass'], prefix='Plass' )
pclassDf.head()
full = pd.concat([full,pclassDf],axis=1)

## 名字中的头衔与性别
titleDf = pd.DataFrame
titleDf = full['Name'].str.extract(r',(.*?).',expand=False) ## 非贪心捕获
titleDf = titleDf.str.strip() ## print一下发现Mr前面有空格
titleDf.value_counts()

这里使用了正则表达式的非贪心捕获方法实现了对姓名中的头衔的提取。姓名原格式如下,即提取‘,’与‘.’之间部分。

发现头衔分类太多,参照官网论坛方法将头衔归为6类。

title_mapDict = {"Capt":       "Officer","Col":        "Officer","Major":      "Officer","Jonkheer":   "Royalty","Don":        "Royalty","Sir" :       "Royalty","Dr":         "Officer","Rev":        "Officer","the Countess":"Royalty","Dona":       "Royalty","Mme":        "Mrs","Mlle":       "Miss","Ms":         "Mrs","Mr" :        "Mr","Mrs" :       "Mrs","Miss" :      "Miss","Master" :    "Master","Lady" :      "Royalty"}titleDf=titleDf.map(title_mapDict)
titleDf.value_counts()

再讲这六类使用pd.get_dummies进行one-hot编码后归入总表。

## 六大类编码
titleDf = pd.get_dummies(titleDf)
titleDf.head()
full = pd.concat([full,titleDf],axis=1)

针对家庭类别的两个列Parch与SibSp,建二维表格存放家庭人数familyDf,家庭人数=同代直系亲属数(Parch)+不同代直系亲属数(SibSp)+乘客自己。再定义家庭大小:单身Single家庭人数=1,中等家庭Family_Small: 2<=家庭人数<=4,大家庭Family_Large: 家庭人数>=5 来判断家庭人数到底属于哪一个范围。

familyDf = pd.DataFrame()
familyDf['familySize'] = full['SibSp'] + full['Parch'] + 1
familyDf['Single'] = familyDf['familySize'].map(lambda s: 1 if s==1 else 0)
familyDf['Small_Family'] = familyDf['familySize'].map(lambda s: 1 if 2<=s<=4 else 0)
familyDf['Large_Family'] = familyDf['familySize'].map(lambda s: 1 if s>5 else 0)
familyDf.head()
full = pd.concat([full,familyDf],axis=1)

移除无用列

full = full.drop(['Cabin','Embarked','Name','Pclass','Ticket'],axis=1)
full.head()

3.特征选择:相关系数法

计算相关系数:(好大一个表。。。)

corrDf = full.corr()
corrDf

按幸存情况的相关性排序,选取相关性较大的指标作为特征。

corrDf['Survived'].sort_values(ascending=False)

根据各个特征与Survived的相关系数,最终选取了其中几个作为模型的输入选取的特征有:titleDf, pclassDf, familyDf, Fare, embarkedDf, cabinDf, Sex。将这些选取的特征放在同一个数据集中。

full_x = pd.concat( [ titleDf, pclassDf, familyDf, full['Fare'], cabinDf, embarkedDf, full['Sex']], axis=1 )

四、构建模型

1.建立训练数据集和测试数据集

'''
将清洗过后的两个数据集进行拆分
由于test文档里面是没有标签的,所以只能用train文档里面的数据进行模型训练和模型评估
所以train的数据称作原数据sourcedata, test数据称作预测数据predictdata。
'''
sourcerow = 891 # full中前890个是训练集
## 原始数据集:特征
source_x = full_x.loc[0:sourcerow-1,:]
## 原始数据集:标签
source_y = full.loc[0:sourcerow-1,'Survived']
## 预测数据集:特征
pred_x = full_x.loc[sourcerow:,:]

2.训练数据和测试数据

将训练集28分进行训练与模型测试评估

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(source_x,source_y,train_size=0.8)
print(source_x.shape)
print(source_y.shape)
print(x_train.shape)
print(x_test.shape)
print(y_train.shape)
print(y_test.shape)

3.训练模型

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(x_train,y_train)

五、模型评估

model.score(x_test,y_test)

将训练模型应用于测试集,准确率达80%。

六、方案实施

使用机器学习模型,对预测数据集中的生存情况进行预测,生成的预测值是浮点数(0.0,1,0),但是Kaggle要求提交的结果是整型(0,1),所以要对数据类型进行转换,再建立数据框乘客id与预测生存情况的值保存结果。

pre_y = model.predict(pred_x)
pre_y = pre_y.astype(int)passenger_id = full.loc[sourcerow:,'PassengerId']
preDf = pd.DataFrame({'PassengerId':passenger_id, 'Survived': pre_y })
preDf.shape
preDf.head()
preDf.to_csv('titanic.csv',index=False)

最后将生成的.csv文件传到kaggle上就大功告成。

泰坦尼克号数据_kaggle泰坦尼克号之Python手把手数据分析相关推荐

  1. python 删除特定行数据_怎么用 Python 做数据分析实例

    01 生成数据表 第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据. Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导 ...

  2. 数据基础---《利用Python进行数据分析·第2版》第8章 数据规整:聚合、合并和重塑

    之前自己对于numpy和pandas是要用的时候东学一点西一点,直到看到<利用Python进行数据分析·第2版>,觉得只看这一篇就够了.非常感谢原博主的翻译和分享. 在许多应用中,数据可能 ...

  3. 数据基础---《利用Python进行数据分析·第2版》第12章 pandas高级应用

    之前自己对于numpy和pandas是要用的时候东学一点西一点,直到看到<利用Python进行数据分析·第2版>,觉得只看这一篇就够了.非常感谢原博主的翻译和分享. 前面的章节关注于不同类 ...

  4. 数据基础---《利用Python进行数据分析·第2版》第11章 时间序列

    之前自己对于numpy和pandas是要用的时候东学一点西一点,直到看到<利用Python进行数据分析·第2版>,觉得只看这一篇就够了.非常感谢原博主的翻译和分享. 时间序列(time s ...

  5. 数据基础---《利用Python进行数据分析·第2版》第7章 数据清洗和准备

    之前自己对于numpy和pandas是要用的时候东学一点西一点,直到看到<利用Python进行数据分析·第2版>,觉得只看这一篇就够了.非常感谢原博主的翻译和分享. 在数据分析和建模的过程 ...

  6. python录入数据至ppt_利用Python进行数据分析之 数据加载.ppt

    利用Python进行数据分析之 数据加载 " " " " 数据加载,存储与文件格式 1,读写文本格式数据: (read_csv,read_table,read_ ...

  7. 干货!小白入门Python数据科学全教程 Python大数据分析

    本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话.我是一名数据工程师 ...

  8. python泰坦尼克号数据预测_使用python预测泰坦尼克号生还

    简介 Titanic是Kaggle竞赛的一道入门题,参赛者需要根据旅客的阶级.性别.年龄.船舱种类等信息预测其是否能在海难中生还,详细信息可以参看https://www.kaggle.com/,本文的 ...

  9. python分析excel数据-对照Excel使用Python进行数据分析,更快掌握

    Excel和Python,作为数据分析的主流工具,在从效率提升到数据商业化的整个过程中,都起到了重要作用.不管是在Excel中通过鼠标点选实现,亦或是利用Python通过代码实现,数据分析中的很多基础 ...

  10. python处理数据的优势-选择python进行数据分析的理由和优势

    1.python大量的库为数据分析提供了完整的工具集 2.比起MATLAB.R语言等其他主要用于数据分析语言,python语言功能更加健全 3.python库一直在增加,算法的实现采取的方法更加创新 ...

最新文章

  1. 图像滤波常用算法实现及原理解析
  2. 暗通道去雾算法 python实现
  3. iOS开发 - UITextView输入时高度自适应
  4. SIG Cloud Provider Alibaba 网研会第 2 期顺利召开 | 云原生生态周报 Vol. 46
  5. codeforces educational round110 e
  6. c4d fbx大小_C4D设计人员必备的八大外挂神器,爱了爱了!【133期】
  7. ie6 offsetWidth/offsetHeight无效
  8. C/C++基础——inline 与 宏
  9. 数学建模之统计回归模型详解
  10. icem二维非结构网格划分_ICEM蜗壳非结构网格划分
  11. 一元函数拐点与驻点的区别
  12. 试设计一个窗口,内含一个按钮。开始运行时,按钮显示“Click Me”字样,当按钮按下时,按钮显示为“Click Me Again”字样,再按一次,则按钮显示“Click Me”字样,依此循环。
  13. 灰色产业链成病毒传播最大渠道 流量生意或迎来最后的疯狂
  14. SGU 264 Travel(稳定婚姻匹配)
  15. Oracle 删除数据后释放数据文件所占磁盘空间(表空间降高水位)
  16. 极路由3HC5861刷openwrt
  17. zookeeper集群安装和配置解读 - 雨中散步撒哈拉
  18. 为什么我魅族m2显示无服务器,魅族m2升级刷机flyme4.0教程及注意事项.doc
  19. oracle 中YYYY-MM-DD HH24:MI:SS的使用
  20. 让Excel也像百度搜索框一样,录入时逐步提示

热门文章

  1. 数组Array和字符串String的indexOf方法,以及ES7(ES2016)中新增的Array.prototype.includes方法...
  2. 干货~powershell与bash和docker在项目中怎么用
  3. Troubleshooting:重新安装Vertica建库后无法启动
  4. oracle 密码忘记 找回密码
  5. Mate7微信指纹支付来了 比Touch ID整合微信早一点
  6. (转)webstorm快捷键
  7. LeetCode_14_python_最长公共前缀
  8. Qt程序实现自动重启
  9. gitee如何搭建mysql_Gitee的下载安装配置及使用步骤详解
  10. 把一个人的特点写具体作文_把一个人的特点写具体作文450字