【人工智能】机器学习——泰坦尼克号(更新中)

发布于:2024-05-21 ⋅ 阅读:(161) ⋅ 点赞:(0)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 字段描述

在这里插入图片描述

2. info()方法

在这里插入图片描述在这里插入图片描述

3. 数据分布

在这里插入图片描述

38%的乘客生存率

在这里插入图片描述

超过76%的乘客没有与父母和孩子一起旅行

在这里插入图片描述

大约31% 的乘客与亲属一起登船

在这里插入图片描述

少于1%的乘客付了高达512美元的船票费,少于1%的乘客年龄在64~80岁

在这里插入图片描述

Sex特征中有65%为男性

577➗891=0.6476

Cabin 中的count 与unique并不相等,说明有些乘客共享一个Cabin

Embarked一共有3种取值,其中从S港口登船的人最多

Ticket的特征下,有22%左右的重复值(unique=618)

在这里插入图片描述

4. 特征相关性分析

女性有更大的存活率

train_df[['Sex','Survived']].groupby(['Sex'],as_index=False).mean()

在这里插入图片描述

上等舱的乘客(Plass=1)有更大的存活率

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

在这里插入图片描述

SipSp和Parch与Survive有相关性

train_df[['SibSp', 'Survived']].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)

在这里插入图片描述

train_df[['Parch', 'Survived']].groupby(['Parch'], as_index=False).mean().sort_values(by='Survived', ascending=False)

在这里插入图片描述

Age与Survived有相关性

使用了seaborn库中的FacetGrid对象来绘制一个分面图(faceted plot),其中按照train_df数据集中的’Survived’列的值(0表示未存活,1表示存活)来分面,并在每个分面中绘制’Age’列的直方图:

g = sns.FacetGrid(train_df,col='Survived')
g.map(plt.hist, 'Age',bins=20)
plt.show()

'Age’参数指定了要绘制直方图的列,bins=20指定了直方图中条形的数量
在这里插入图片描述

5. 数据清洗与预处理

前面我们已经收集了一些假设和结论,接下来清洗数据

修正数据

丢弃Cabin 和 Ticket这两个特征(同时在训练集和测试集中丢弃)

train_df = train_df.drop(['Ticket','Cabin'], axis=1) #axis 删除的是列(axis=1)还是行(axis=0)
test_df = test_df.drop(['Ticket','Cabin'], axis=1)
combine = [train_df, test_df]

female 转换为1,male 转换为0

for dataset in combine:
    dataset['Sex'] = dataset['Sex'].map({'male': 0, 'female': 1}).astype(int)

train_df.head()

在这里插入图片描述

创建数据

Title特征

从Name特征中提取Title特征,并测试Title与Survive之间的关系

在泰坦尼克号数据集中,乘客的姓名(Name 列)通常包含了他们的称谓(如 Mr., Mrs., Miss., Master, Dr., etc.),这些称谓后面通常跟着一个点(.)和乘客的名字。由于这些称谓可能与乘客的社会地位、年龄或性别有关,它们可能包含对预测乘客生存几率有用的信息。

在数据分析和机器学习的预处理阶段,提取这些称谓并将其作为新的特征(或称为列)添加到数据集中是很常见的做法。这有助于捕捉原始数据中可能隐藏的模式或相关性,并可能提高模型的预测性能。

for dataset in combine:
    dataset['Title'] = dataset['Name'].str.extract('([A-Za-z]+)\.',expand=False)
pd.crosstab(dataset['Title'], dataset['Sex'])

使用 pandas 的 .str.extract() 方法可以很容易地从包含这些称谓的字符串中提取它们。在这个方法中,我们使用了正则表达式 ([A-Za-z]+)\. 来匹配一个或多个字母(不区分大小写),后面紧跟着一个点号(.)。正则表达式的括号 () 用于捕获匹配的文本,而 expand=False 参数确保只返回一个列
在这里插入图片描述
再将Title特征中常见的称呼用“Rare”来替代:

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_df[['Title','Survived']].groupby(['Title'],as_index=False).mean()

在这里插入图片描述
再将离散型的Title转化为有序的数值型:

title_mapping = {"Mr":1,"Miss":2,"Mrs":3,"Master":4,"Rare":5}
for dataset in combine:
    dataset['Title'] = dataset['Title'].map(title_mapping)
dataset['Title'] = dataset['Title'].fillna(0)
train_df.head()

在这里插入图片描述
丢弃Name 特征和PassengerId 特征

现在丢弃训练集和测试集中的Name特征,丢弃训练集的PassengerId特征

train_df = train_df.drop(['Name','PassengerId'], axis=1) #axis 删除的是列(axis=1)还是行(axis=0)
test_df = test_df.drop(['Name'], axis=1)
combine = [train_df, test_df]

在这里插入图片描述

IsAlone 特征

组合Parch和SibSp特征,创建一个新的FamilySize特征,再通过FamilySize特征创建一个名为IsAlone的特征。最后丢弃Parch、SibSp和FamilySize特征,保留IsAlone特征。

for dataset in combine:
    dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1
train_df[['FamilySize','Survived']].groupby(['FamilySize'],as_index=False).mean().sort_values(by='Survived',ascending=False)

在这里插入图片描述