泰坦尼克号数据_kaggle泰坦尼克号之Python手把手数据分析

本文是使用Python的scikit-learn库在Kaggle上进行泰坦尼克号成员生存概率预测的实战教程。从理解数据、数据清洗、特征工程、构建模型到模型评估,详细介绍了每个步骤。通过数据预处理、one-hot编码和特征选择,最终模型在测试集上的准确率达到80%。
摘要由CSDN通过智能技术生成

025a2cb32024282ecde93e589ee03db2.png

前言

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

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

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

8fef07291197f1987489bd7ae4fe11f5.png

一、提出问题

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

b20a14f30105b3552a21fd2de51562fd.png

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

二、理解数据

1. 采集数据

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

156a077bf5cd4d24030a4e7632db8e66.png

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)

4c2f528d38a08beb246da1e7ca5cdf7e.png

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

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

3.查看数据信息

## 查看数据
full.head()

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

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

5ca17b0684cb6ec5c9ac18cbb96e6333.png

通过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()

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

c48cc4977a8bb4acf34586a39b68f5ee.png

2.特征工程

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

首先对数据进行分类

c7ee469433f1835aa7b0706d8f1f7260.png

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

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

858126939f55ef8f0c459e048f5de5ab.png
## 登船港口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)

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

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

fea06b9677645c14d1daa129ea44ea67.png

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

7ed420608305e4ae4a60179b40444dba.png

发现头衔分类太多,参照官网论坛方法将头衔归为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()

919e42d3765a688d9ea7579a2eb65de1.png

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

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

ffdaf938e03dfc5e41431af08e9d32e3.png

针对家庭类别的两个列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)

a5c85da8b756e545633553afdd742cb9.png

移除无用列

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

2db96da2173a01816b8e1322b18096b1.png

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

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

corrDf = full.corr()
corrDf

66988e8bb3c8809677c3042b12dda8d0.png

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

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

f8e5b66e47e61c91fe92d02ed86c7bb4.png

根据各个特征与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)

d12ca2f3797a7131cd8c639919ccd226.png

3.训练模型

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

4c9b08a8087e9781e2607603e59abfc7.png

五、模型评估

model.score(x_test,y_test)

a5a04a0fad34f703106f140fe9e54a8d.png

将训练模型应用于测试集,准确率达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)

a3842784ef0ae819dc22a5b2a39e262f.png

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

779e00f4a9c1d6073cf4720d51835abc.png

994efc8dad13b954b8fe2f376195ed2e.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值