博主最近开始在Kaggle上做项目,第一个项目就是最经典的项目泰坦尼克号。在尝试了几种模型,调整了很多次之后,终于将模型调到0.8的得分,给大家分享一下我的做法。
Part1.数据导入和初步观察
导入泰坦尼克号训练集和测试集的数据,这次我选择同时处理两份数据,所以直接将他们拼接起来
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
train=pd.read_csv('train.csv')
test=pd.read_csv('test.csv')
datas = pd.concat([train, test], ignore_index = True)
我们来看一下数据的组成
train.head()
可以看到我们的数据集有12个特征,每个特征的重要程度和作用:
特征 | 作用和重要程度 |
---|---|
乘客ID | 索引 |
是否生存 | 0代表死亡,1代表存活 |
社会等级 | 分为1,2,3等级 |
姓名 | 重要,可以提炼出大量有用的信息 |
性别 | 重要 |
年龄 | 重要 |
直系亲友 | 一般,和旁系亲友共同处理 |
旁系亲友 | 一般,和直系亲友共同处理 |
票号 | 一般 |
票价 | 重要 |
舱门编号 | 一般 |
上船时的港口编号 | 一般 |
查看我们的数据集的缺失情况
train.info()
可以看到我们的特征还是比较完整的,只有三个特征有缺失的情况,分别是年龄,舱门编号和上船时的港口编号。其中年龄和舱门编号缺失的值比较多,待会需要特殊处理一下。
Part2.数据分析和特征工程
1、数据分析
(1)死亡与存活的比例
train['Survived'].value_counts()
(2)社会等级对存活的影响:社会等级越高,存活率越高
sns.barplot(x="Pclass", y="Survived", data=datas)
(3)性别对存活的影响:女性的存活率远大于男性
sns.barplot(x="Sex", y="Survived", data=datas)
(4)年龄对存活的影响:在0~35岁中的人群具有更高的生存概率,高于35岁的人群生存概率较低
facet = sns.FacetGrid(datas, hue="Survived",aspect=2)
facet.map(sns.kdeplot,'Age',shade= True)
facet.set(xlim=(0, train['Age'].max()))
facet.add_legend()
plt.xlabel('Age')
plt.ylabel('Survived')
(5)亲属对存活的影响:拥有2~4位家庭成员的人存活率更高
sns.barplot(x="SibSp", y="Survived", data=datas)
sns.barplot(x="Parch", y="Survived", data=datas)
将直系和旁系亲属两个特征合并为家庭大小,可以让我们更直观地观察亲属这个特征对存活率的影响
datas['FamilySize']=datas['SibSp']+datas['Parch']+1
sns.barplot(x="FamilySize", y="Survived", data=datas)
(6)登船时港口的不同对存活的影响:C和Q地的存活率更高,S地的存活率较低
sns.countplot('Embarked',hue='Survived',data=datas)
2、特征工程
(1)名字的处理
在数据分析中我们可以看到,社会等级对我们的存活率影响非常明显,所以我们可以将姓名替换为称呼前缀,生成新的特征‘Title’,用来对应我们的社会等级。这样我们就将一大串看似没有用的姓名特征转化成了有用的分类型特征。
datas['Title'] = datas['Name'].apply(lambda x:x.split(',')[1].split('.')[0].strip())
datas['Title'].replace(['Capt', 'Col', 'Major', 'Dr', 'Rev'],'Officer', inplace=True)
datas['Title'].replace(['Don', 'Sir', 'the Countess', 'Dona', 'Lady'], 'Royalty', inplace=True)
datas['Title'].replace(['Mme', 'Ms', 'Mrs'],'Mrs', inplace=True)
datas['Title'].replace(['Mlle', 'Miss'], 'Miss', inplace=True)
datas['Title'].replace(