Titanic – Machine Learning from Disaster

  • 关于数据集

它包括有关1912年淹没的著名船只泰坦尼克号上的乘客的信息。该数据集一般用于探索数据剖析技能和猜测建模算法。该数据集包括有关乘客的大量信息,包括他们的姓名、年纪、性别、乘客等级、登船港口以及他们是否幸存下来。有了这些信息,研究人员能够剖析和了解在海难期间影响乘客生计的要素。

在对数据进行预处理之前引入一些需求运用的包,以及将数据导入进来。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
from sklearn.preprocessing import RobustScaler,LabelEncoder
file_path_train = r'titanic\Input_data\train.csv'
file_path_test = r'titanic\Input_data\test.csv'
file_path_out = r'titanic\Out_put'
train = pd.read_csv(file_path_train)
test = pd.read_csv(file_path_test)
print(train.head())

数据详细信息如下:

PassengerId 乘客编号 Survived 幸存 Pclass Pclass Name 姓名 Sex Age SibSp 西卜斯普 Parch 帕奇 Ticket 票 Fare 票价 Cabin 舱 Embarked 已起程
0 1 0 3 Braund, Mr. Owen Harris 布劳德,欧文哈里斯先生 male 雄 22.0 1 0 A/5 21171 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th… 卡明斯,约翰布拉德利夫人(弗洛伦斯布里格斯 female 女人 38.0 1 0 PC 17599 邮编 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina 海基宁,莱娜小姐 female 女人 26.0 0 0 STON/O2. 3101282 砰砰/O2。3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) 富特雷尔,雅克希思夫人(莉莉梅皮尔) female 女人 35.0 1 0 113803 53.1000 C123 C123 S
4 5 0 3 Allen, Mr. William Henry 艾伦,威廉亨利先生 male 雄 35.0 0 0 373450 8.0500 NaN S

以下是泰坦尼克号数据集中列的阐明:

PassengerId:乘客 ID:每位乘客的仅有标识符。

Survived: 幸存:标明乘客是幸存 (1) 仍是未幸存 (0)。

Pclass: Pclass:乘客的铺位等级:

1 = 1 等舱,2 = 2 等舱,3 = 3 等舱,

Name: 姓名:乘客的姓名。

Sex: 性别:乘客的性别。

Age: 年纪:乘客的年纪。此列可能有缺失值。

SibSp: 与乘客一同游览的兄弟姐妹或爱人的数量。

Parch: 与乘客一同游览的爸爸妈妈或儿童人数。

Ticket: 票证:票证号。

Fare: 票价:乘客付出的票价。

Cabin:客舱:乘客所住的客舱编号。此列可能有缺失值。

Embarked: 登船:乘客登船的港口:

C = 瑟堡,法国的一个港口 Q = 皇后镇,爱尔兰的一个港口 S = 南安普敦,英格兰的一个港口

  • 调查数据集

运用info函数调查数据集的详细状况,包括特征数据,数据个数,数据类型等。

train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
  • 数据收拾

缺失值:先运用isnull()函数检查一下数据集有哪些列数据存在缺失数据。

train.isnull().sum()

主要是Age列和Cabin列存在大量缺失数据,Embarked列仅存在2个缺失数据。

PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

缺失数据的图形:为了更直观的调查缺失数据的姿态,运用missingno库中的bar函数,将特征个数数据画出来。

import missingno as msno
msno.bar(train)
plt.show()

Kaggle-泰坦尼克号数据集的处理

  • 数据预处理:

  1. 姓名数据特征列–Name

    先打印前面几行,看看数据的的姿态,外国人姓名很长,关于中国人来说局的冗余且难以辨别,可是细心调查,发现这一列中会呈现头衔,如“Mr.”,“Mrs.”等,后面都是以“.”结束,查找了一下材料,外国人喜爱在姓名中加上头衔称谓,来标明一个人的身份,故咱们只需求头衔来证明一个人的社会身份位置即可,姓名对咱们剖析数据不是那么重要。接来下就是将杂乱的姓名数据简化为头衔称谓,再将非数值的头衔称谓转化为数值型数据,进行下一步的数据剖析。

    train['Name'].head()
    

Kaggle-泰坦尼克号数据集的处理

因为train和test的数据都需求处理,就将两份数据组成一份列表数据,首先从每个人的姓名中提取头衔,$([A-Za-z]+)\.$这个表达式运用正则表达式匹配任何故点号结束的字母串,例如’Mr.',‘Miss.’等,并返回它们作为一个新的字符串。
然后将提取出的头衔赋值给一个名为“Title”的新列,以便后续剖析。
```python
combine = [train,test]
for dataset in combine:
    dataset['Title'] = dataset.Name.str.extract('([A-Za-z]+)\.',expand=False)
print(train['Title'])
```
Title列数据都简化成头衔称谓数据,如下所示:

Kaggle-泰坦尼克号数据集的处理

似乎头衔称谓有许多中,检查一下,发现居然多达17种,其间有常见的“Mr.”,“Mrs.”,“Miss.”等,还要许多罕见的“Sir.”,“Ms”等称谓。代码和头衔称谓如下所示:
```python
print(train['Title'].nunique())
train['Title'].value_counts()
```

Kaggle-泰坦尼克号数据集的处理

Title列数据中的称谓多种多样,其间有些称谓个数极少,不太利于后面的模型训练,为了一致数据,将呈现次数很少的那些头衔称谓数据统称为“rare”类型。然后参阅了一下其他大神的处理办法,发现我考虑的仍是太少了,因为这些称谓中还有一些法语单词,在英语中也同样标明相同的意思,如“Mlle”:法语称号未婚女人,类似于英语中的“Miss”等。
*   首先将列表中的头衔替换为“Rare”。这个表达式运用replace办法将榜首个参数中的任何字符串替换为第二个参数中的字符串。
*   然后将“Mlle”替换为“Miss”,将“Ms”替换为“Miss”,将“Mme”替换为“Mrs”。所以将具有相同意思的称谓也需求合并,详细代码如下所示:
```python
for dataset in combine:
    dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess', 'Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
    dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')
train[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()
print(train['Title'].value_counts())
```

Kaggle-泰坦尼克号数据集的处理

再次检查一下Title列数据,是否现已全部处理完毕。
```python
train.isnull().sum()
```

Kaggle-泰坦尼克号数据集的处理

  1. 年纪数据特征列–Age

    因为Age是乘客数据,包括“先生”,“夫人”,“小姐”,“主人”等头衔,能够运用此信息来估量年纪。具有类似头衔的人可能具有类似的年纪分布。计算每个标题的年纪中位数,将用它来填充缺失值。

    乘客 – “Mr”,其年纪相关数据未填写,将他们的年纪中位数归咎于现已给出的“先生”乘客数据。 乘客 – “Miss/Mrs”,其年纪相关数据未填写,他们估算的年纪中位数现已给出了“小姐/女士/女士/夫人/夫人”乘客数据。 乘客 – “Master”,其年纪相关数据未填写,将他们推算为现已给出的“主人”乘客数据的中位年纪。 乘客 – 未填写年纪相关数据的“Rare”,将他们与现已给出的“稀有”乘客数据的年纪中位数归咎于他们。

    因为上面修改了将头衔str值改为数据值了,所以这儿也是用到了数字。详细对应能够看这段代码:Title_mapping = {‘Master’:1,’Miss’:2,’Mr’:3,’Mrs’:4,’Rare’:5}

    
    # filling age column according  to the passenger data with title based median:
    combine.loc[(combine['Title'] == 3) & (combine['Age'].isnull()), 'Age'] = combine[combine['Title'] == 3]['Age'].median()
    combine.loc[(combine['Title'] == 1) & (combine['Age'].isnull()), 'Age'] = combine[combine['Title'] == 1]['Age'].median()
    combine.loc[(combine['Title'] == 2) & (combine['Age'].isnull()), 'Age'] = combine[combine['Title'] == 2]['Age'].median()
    combine.loc[(combine['Title'] == 4) & (combine['Age'].isnull()), 'Age'] = combine[combine['Title'] == 4]['Age'].median()
    combine.loc[(combine['Title'] == 5) & (combine['Age'].isnull()), 'Age'] = combine[combine['Title'] == 5]['Age'].median()
    

    检查一下Age列是否现已处理好了

    combine.isnull().sum()
    

    Age列现已没有空值了,处理好了。

Kaggle-泰坦尼克号数据集的处理

为什么选择标题来估算错过的乘客年纪?
因为有各种年纪段的乘客,依据各自的年纪填充他们是我的战略,经过界说年纪的标题来完成。

3. #### 船舱数据特征列–cabin

置疑泰坦尼克数据集中身份位置更高的人更有可能存活,而购买的船票船舱等级和票价能够间接标明一个人的身份位置,故接下来剖析船舱数据。
先调查一下机舱数据列的各等级机舱的个数
train['Pclass'].value_counts()

船舱数据中更多的是三等舱乘客,其次是一等舱乘客,最后是二等舱乘客。依据现实生活中的机舱和人数猜想,人数更多的机舱更有可能是便宜的机舱,所以三等舱是最便宜的船舱,依照顺序排序,一等舱是最贵重的船舱。

Kaggle-泰坦尼克号数据集的处理

验证咱们的猜想,贵重的一等舱存活率公然远远高于便宜的三等舱,可能是因为一等舱定价更高,质量和安全将超过其他等级船舱,所以,一等舱的存活率很高。

train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean()

Kaggle-泰坦尼克号数据集的处理

依据船舱等级和票价以及头衔称谓能够知道一个人的身份位置,以及cabin船舱范围,且cabin缺失数据确实是在太多,687/891,高达77.1%,数据缺口太大,处理存在太大的不确定性,故我直接舍去了这列数据。

  • 其他数据处理

关于Embarked列,因为缺失值较少,选用前一位乘客数据补全。

for dataset in combine:
    dataset['Embarked'] = dataset['Embarked'].fillna(dataset['Embarked'].shift(-1))

关于SibSp和Parch数据,显现的是兄弟姐妹和爸爸妈妈孩子,能够合并为一个Family特征。

for dataset in combine:
    dataset['Family'] = dataset['SibSp'] + dataset['Parch']

Kaggle-泰坦尼克号数据集的处理

每个特征变量和标签变量之间的联系:

数据可视化每个特征变量和标签变量之间的联系、

  • 首先设置seaborn的绘图风格为白色网格布景,以便于明晰的调查数据的分布和差异。在画布上创建一个2行3列的网格。
  • 榜首个子图:运用seaborn的countplot函数来制作一个柱状图,用于显现不同性别的乘客在生计和逝世两种状况下的数量。参数train是一个包括泰坦尼克号乘客数据的数据框。x=’Survived’标明将生计状况作为x轴变量,hue=’Sex’标明将性别作为不同色彩的分组变量,palette=’tab20’标明运用tab20调色板来设置色彩,width=0.3标明设置柱子的宽度为0.3。调整子图之间的水平间距为0.3。给当时的子图增加一个标题,内容为“1. Survival Count by Sex”。
  • 第二个子图:用于显现不同铺位等级的乘客在生计和逝世两种状况下的数量。参数x=”Survived”标明将生计状况作为x轴变量,hue=”Pclass”标明将铺位等级作为不同色彩的分组变量,data=train标明运用train数据框作为数据源,palette=”tab20″标明运用tab20调色板来设置色彩,width=0.5标明设置柱子的宽度为0.5。给当时的子图增加一个标题,内容为“2. Survival Count by Pclass”。
  • 第三个子图:运用seaborn的countplot函数来制作一个柱状图,用于显现不同登船地点的乘客在生计和逝世两种状况下的数量。参数x=”Survived”标明将生计状况作为x轴变量,hue=”Embarked”标明将登船地点作为不同色彩的分组变量,data=train标明运用train数据框作为数据源,palette=”tab20″标明运用tab20调色板来设置色彩,width=0.5标明设置柱子的宽度为0.5。给当时的子图增加一个标题,内容为“3. Survival Count by onboarding location”。
  • 第四个子图:运用seaborn的histplot函数来制作一个直方图,用于显现不同年纪段的乘客在生计和逝世两种状况下的数量。参数data=train标明运用train数据框作为数据源,x=’Age’标明将年纪作为x轴变量,hue=’Survived’标明将生计状况作为不同色彩的分组变量,bins=8标明将x轴分红8个区间,multiple=’stack’标明将不同分组的直方图堆叠在一同,kde=True标明在直方图上增加核密度估量曲线,palette=’Set1’标明运用Set1调色板来设置色彩。给当时的子图增加一个标题,内容为“4. Distribution of survival with respect to Age”。
  • 第五个子图:运用seaborn的histplot函数来制作一个直方图,用于显现不同票价段的乘客在生计和逝世两种状况下的数量。参数data=train标明运用train数据框作为数据源,x=”Fare”标明将票价作为x轴变量,hue=”Survived”标明将生计状况作为不同色彩的分组变量,bins=10标明将x轴分红10个区间,multiple=’stack’标明将不同分组的直方图堆叠在一同,kde=True标明在直方图上增加核密度估量曲线,palette=’Set1’标明运用Set1调色板来设置色彩。给当时的子图增加一个标题,内容为“5. Distribution of survival with respect to Fare”。
  • 第六个子图:运用seaborn的histplot函数来制作一个直方图,用于显现不同家庭人数的乘客在生计和逝世两种状况下的数量。参数train标明运用train数据框作为数据源,x=’Family’标明将家庭人数作为x轴变量,hue=’Survived’标明将生计状况作为不同色彩的分组变量,bins=8标明将x轴分红8个区间,multiple=’stack’标明将不同分组的直方图堆叠在一同,kde=True标明在直方图上增加核密度估量曲线,palette=’Set1’标明运用Set1调色板来设置色彩。给当时的子图增加一个标题,内容为“6. Distribution of survival with respect to Family”。
  • plt.show():这行代码是显现所有的子图。
sns.set(style="whitegrid")
plt.figure(figsize=(16,12))
plt.subplot(2,3,1)
sns.countplot(train,x='Survived',hue='Sex',palette='tab20',width=0.3)
plt.subplots_adjust(hspace=0.3)
plt.title('1. Survival Count by Sex')
plt.subplot(2,3,2)
sns.countplot(x="Survived", hue="Pclass", data=train,palette="tab20",width=0.5)
plt.title('2. Survival Count by Pclass')
plt.subplot(2,3,3)
sns.countplot(x="Survived", hue="Embarked", data=train, palette="tab20",width=0.5)
plt.title('3. Survival Count by onboarding location')
plt.subplot(2,3,4)
sns.histplot(data=train,x='Age',hue='Survived',bins=8,multiple='stack',kde=True, palette='Set1')
plt.title('4. Distribution of survival with respect to Age')
plt.subplot(2,3,5)
sns.histplot(data=train, x="Fare", hue="Survived", bins=10,multiple='stack',kde=True,palette='Set1')
plt.title('5. Distribution of survival with respect to Fare')
plt.subplot(2,3,6)
sns.histplot(train, x='Family', hue='Survived',bins=8,multiple='stack',kde=True,palette='Set1')
plt.title('6. Distribution of survival with respect to Family')
plt.show()

经过制作出来的图形显现能够知道:

  1. 榜首张图:

    与女人比较,大多数男性逝世,其数量达到>400。 标题描绘,几乎是两倍的女人幸存下来。

  2. 第二张图:

    大多数3等舱乘客逝世,这标明依据票价,将有更多的质量和安全。1等舱乘客票价更高,因此与其他2个乘客铺位比较,质量和安全将更多。

  3. 第三张图:

    大部分乘客在英格兰的一个港口南安普敦登船。图显现,在南安普敦(S)和皇后镇(Q)港口上船的人依据生计状况逝世,但在瑟堡(C)港口上船的人依据生计状况大多还活着。

  4. 第四张图:

    剧情描绘了在泰坦尼克号沉船中逝世的乘客年纪在20-30岁之间(年轻人)。

  5. 第五张图:

    标题描绘了Fare在他们的生计中没有任何效果,而是他们的命运。

  6. 第六张图

    家庭人数在0-2人的乘客,存活率更高。

Kaggle-泰坦尼克号数据集的处理

  • 相关矩阵:

选择[‘Title’,’Sex’, ‘Age’,’Family’, ‘Pclass’, ‘Embarked’,’Survived’]这几类列标签进行热力图剖析,剖析数据之间的相关性。

column_headers = ['Title','Sex', 'Age','Family', 'Pclass', 'Embarked','Survived']
train_df = train[column_headers]
train_after = train_df[:891]
test_after = train_df[892:]
plt.figure(figsize=(12,6))
sns.heatmap(train_after.corr(),annot=True,fmt='.2f')
plt.show()

显现目标变量如何与其他变量联系的协联系矩阵。所有独立特征都显现与目标变量没有联系或否定联系。

Kaggle-泰坦尼克号数据集的处理

从热力图中能够看出,数据框中各个变量之间的相联系数用不同的色彩来标明,色彩越深,标明相联系数越大(不管正负);色彩越浅,标明相联系数越小(不管正负)。

逻辑回归算法猜测数据

X_train = train_after.drop('Survived', axis=1)
y_train = train_after['Survived']
X_test = test_after.drop('Survived', axis=1)
y_test = test_after['Survived']
model = LogisticRegression()
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
print(y_pred)

Kaggle-泰坦尼克号数据集的处理

将数据保存起来,然后提交。

predict = [X_test['PassengerId'],y_pred]
predict_df = pd.DataFrame(predict).T
predict_df.to_csv(file_path_out+r'\test.csv')

提交的成果如下:

Kaggle-泰坦尼克号数据集的处理

这次成果较榜首次简单处理数据现已产生了挺多的进步,提高了0.5。

榜首次处理数据的成果如下图:

Kaggle-泰坦尼克号数据集的处理

当然我的排名也有所提高啦!

Kaggle-泰坦尼克号数据集的处理

关于数据猜测,数据是十分重要的,任何一个数据都可能对成果有影响,关于数据的处理,一定要细心慎重的考虑,正确的处理数据之间的联系。

(ps:看了一些前辈对Titanic数据的处理,有了许多启发,使我愈加全面的了解这份数据,写这篇文章的时分,恰逢研究生入学,事务繁多,断断续续才写完了这篇数据剖析,今天外面下暴雨。可是看着这份成果心里说不出的快乐,希望新的三年能够认真对数据进行处理和剖析,在毕业之时能够找到一份薪资待遇还不错的工作。)

参阅学习链接:EDA|Titanic_Survivals|LogisticRegression | Kaggle — EDA|Titanic_Survivals|逻辑回归 |卡格尔