文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【机器学习实战】基于python对泰坦尼克幸存者进行数据分析与预测

2023-09-02 13:49

关注

🙋‍♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读👨‍🎓,曾获得华为杯数学建模国家二等奖🏆,MathorCup 数学建模竞赛国家二等奖🏅,亚太数学建模国家二等奖🏅。

✍️研究方向:复杂网络科学

🏆兴趣方向:利用python进行数据分析与机器学习,数学建模竞赛经验交流,网络爬虫等。

泰坦尼克号的沉没是历史上最惨痛的沉船事件之一。

1912年4月15日,泰坦尼克号在其处女航中与冰山相撞后沉没,2224名乘客和船员中的1502人死亡。

在这个数据分析项目中,我们需要完成对什么样的人有可能幸存的分析。

特别是,我们需要你应用机器学习的工具来预测哪些乘客在悲剧中幸存下来。

在本文中,我们就从数据的角度出发对泰坦尼克幸存者进行分析与预测,话不多说我们开始吧。

本项目数据基于Kaggle中泰坦尼克数据,需要的小伙伴可以自行登录Kaggle中进行下载,或者私信我索要链接。

kaggle的链接如下:

KAGGLE竞赛链接

当我们成功注册账号后,可以在竞赛链接中找到泰坦尼克沉船存活的竞赛链接,如下图所示:
在这里插入图片描述
进入竞赛页面后,可以看到关于竞赛的简单介绍以及其他人的代码等内容,在这里我们点击Data。
在这里插入图片描述
注意下面的数据介绍,这里的数据介绍将会帮助我们了解数据的基本情况以及其代表的内容。
在这里插入图片描述
我们获取到数据之后,打开编译环境准备开始进行数据分析,在本文中我使用的是jupyter进行数据分析,当然可以选择自己习惯的编译环境进行后续的工作。

拿到数据之后,我们首先编写代码将其读取进编译环境中,代码如下:

# 导入pandasimport pandas as pd# 将训练集数据导入data = pd.read_csv('train.csv')

导入数据后的结果如下:
在这里插入图片描述

📃数据观察

🔖数据清理4C原则

在我们拿到数据后,我们需要对数据进行初步的观察以及数据清洗。这里介绍Kaggle大佬提出的数据清理4C原则,其分别是:

在这一步中,我们将调用pandas中的基本函数对数据进行初步的观察。我们首先调用info()查看数据的类型以及基本情况,代码如下:

data.info()

结果如下:
在这里插入图片描述
当我们调用该函数后,可以看到所有数据的类型以及基本情况。

这里需要注意我标注的数据,我们发现Age数据与其它数据相比数量少了很多,也就是我们说的缺失值。与此同时,可以看到Cabin以及Embarked也存在缺失的情况。

这些都需要我们关注,并在后续进行一些处理。

随后,我们调用describe()函数进一步观察数据的分布情况,该函数可以帮助我们计算每列数据的分布以及平均值等内容。代码如下:

data.describe()

结果如下:

在这里插入图片描述
这里我们发现Parch数据的75%都是0,存在明显的分布不均匀的情况,后续可能需要处理。

📃缺失值处理(Completing)

在上节中,我们发现数据存在一定的缺失情况,我们首先对其进行可视化,这能够使得我们对数据的观察更直观。

在这里我们用到了missingno库进行缺失数据的可视化,其对缺失数据的可视化更加直观。

使用之前,请确保自己已经安装该库。

使用该库进行可视化的代码如下:

# 在数据中抽样100个单位data_sample = data.sample(100)msno.matrix(data_sample)

结果如下:
在这里插入图片描述
可以发现,Cabin的缺失值较为明显,Age也存在一些缺失值。

因为数据中每列代表的情况不尽相同,所以我们将针对数据进行不同的处理方法。

我们再通过代码来观察一下缺失的数据情况,代码与结果如下:

missing_data = data.isnull().sum()missing_data = missing_data [missing_data >0]missing_data 

在这里插入图片描述

🔖Embarked的处理

我们首先处理Embarked列,在上边的数据观察中发现其拥有两个缺失值,因为相对于全部的一千条数据来说其量级较小,所以我们在这里直接选择该列缺失的两条数据进行删除处理,代码如下:

# 在data中寻找Embarked的缺失值 找到后在原表中将其行删除data.dropna(axis=0, how='any',subset=['Embarked'], inplace=True)

dropna 参数介绍
axis: default 0指行,1为列
how: {‘any’, ‘all’}, default ‘any’指带缺失值的所有行;'all’指清除全是缺失值的
thresh: int,保留含有int个非空值的行
subset: 对特定的列进行缺失值删除处理
inplace: 这个很常见,True表示直接在原数据上更改

🔖Age的处理

在上述观察中,我们发现Age存在一定的缺失情况,接下来我们对其进行处理。

我们由Kaggle中的数据介绍中了解到,其表示乘客的年龄,且缺失值相对来说较多,不能够直接采用删除的方式。

我们首先观察Age的分布情况,绘制年龄的直方图,代码如下:

data.hist(column='Age')

结果如下:
在这里插入图片描述
我们注意到,年龄的分布存在一定的偏态,这时候更适合采用中位数进行填充。

注意:偏态分布的大部分值都聚集在变量分布的一侧,中位数可以很好的表示中心趋势。

所以,我们对年龄的缺失值进行中位数的填充。代码如下:

data['Age'].fillna(data['Age'].median(), inplace=True)

至此,我们对于年龄的缺失值处理完毕。

🔖Cabin的处理

我们首先看一下Cabin的数据解释:Cabin number(机舱号码)

对于该特征来说,仿佛对于最终的数据帮助不大。即使其对于最后的数据是非常重要的,由于其缺失值过多且不容易探寻其中的规律,我们还是选择对其做删除的处理。

代码如下:

# 这里我直接删除了该列del data['Cabin']

至此,所有数据的缺失值处理完毕。

📃异常值的检测与处理(Correcting)

在本例中,我们能够进行检测并处理的主要是Age特征,因为我们预先知道其大概的范围。在这里我们绘制箱线图观察其数据的异常情况决定是否需要进行处理,代码如下:

data['Age'].plot.box()

结果如下:
在这里插入图片描述
在这里,我们可以看到该数据的最高点在80,符合我们对于数据的预先认知,遂不进行处理。

📃特征构建(Create)

在这部分中,要求我们对不同的特征有一定的了解以及认识,在这里我列出所有的特征含义。

特征名称含义
survival是否存活,1表示存活,0表示没有
pclass表示票的种类,分别为1,2,3等
sex性别
Age年龄
sibsp在泰坦尼克号上的兄弟姐妹/配偶的数量
parch在泰坦尼克号上的父母/子女人数
ticket票号
fare乘客票价
cabin机舱号
embarked上岸港口 ,C = Cherbourg, Q = Queenstown, S = Southampton

在这里,我们提取两个特征,分别是乘客家庭规模,是否独自一人,并对票价以及年龄进行分段构造两个新的特征。

注意:针对不同的项目采取的特征提取工作并不相同,因为这需要根据具体的业务进行分析并提取。

我们首先针对家庭规模以及是否独自一人创建新的两个特征,代码如下:

data['FamilySize'] = data['SibSp'] + data['Parch'] + 1data['IsAlone'] = 1 data['IsAlone'].loc[data['FamilySize'] > 1] = 0

然后,我们对年龄和票价进行分段,代码如下:

data['FareBin'] = pd.qcut(data['Fare'], 4)data['AgeBin'] = pd.cut(data['Age'].astype(int), 5)

这里简单介绍一下上述两个函数的区别与作用
qcut:根据传入的数值进行等频分箱,即每个箱子中含有的数的数量是相同的。
cut:根据传入的数值进行等距离分箱,即每个箱子的间距都是相同的。

特别的,在本节中特征工程的过程要根据实际业务进行不同的特征提取,这个过程需要我们对业务有足够的理解程度。几个好的特征对后续的模型精确程度有很大的积极影响。

📃数据格式转换(Convert)

某些特定的格式在很多模型中其实是不适用的,在本例中经过上述处理后的数据如下所示:

在这里插入图片描述

图中的性别等内容都为字符类型,这显然在模型中存在一定的不兼容情况,这就需要我们进行一定程度的格式转换。

在本部分中,我们要处理的有以下几个部分:

我们首先对需要删除的两列进行删除的操作,代码如下:

del data['PassengerId']del data['Ticket']

然后我们对Name进行处理,将其中的身份信息提取出来,代码如下:

 data['Title'] = data['Name'].str.split(", ", expand=True)[1].str.split(".", expand=True)[0]

结果如下:
在这里插入图片描述
最后,我们对需要编码的数据进行编码:

from sklearn.preprocessing import OneHotEncoder, LabelEncoderlabel = LabelEncoder()data['Sex_Code'] = label.fit_transform(data['Sex'])data['Embarked_Code'] = label.fit_transform(data['Embarked'])data['Title_Code'] = label.fit_transform(data['Title'])data['AgeBin_Code'] = label.fit_transform(data['AgeBin'])data['FareBin_Code'] = label.fit_transform(data['FareBin'])

编码后的结果如下:

在这里插入图片描述
至此,数据格式转换已经完毕。

在本节中,我们将基于上述数据进行模型的构建,并且通过不同的评价指标进行构建。

📃模型构建

在这里我将会使用基础的分类模型进行模型的构建,并挑选出初步表现最好的模型进行参数调节。代码如下:

# 处理不需要的数据列data_x = data.copy()del data_x['Survived']del data_x['Name']del data_x['Sex']del data_x['FareBin']del data_x['AgeBin']del data_x['Title']del data_x['Embarked']# 构建ydata_y = data['Survived']# 导入包from sklearn import svm, tree, linear_model, neighbors, naive_bayes, ensemble, discriminant_analysis, gaussian_processfrom sklearn.model_selection import cross_val_score# 定义常用的几种分类模型MLA = {    #随机森林    '随机森林':ensemble.RandomForestClassifier(),    #逻辑回归    '逻辑回归':linear_model.LogisticRegressionCV(max_iter=3000),    #SVM    'SVM':svm.SVC(probability=True),    #树模型    '树模型':tree.DecisionTreeClassifier(),    }# 进行5折交叉验证并选择f1作为评价指标for model_name in MLA:    scores = cross_val_score(MLA[model_name], X=data_x, y=data_y, verbose=0, cv = 5, scoring='f1')    print(f'{model_name}:',scores.mean())

结果如下:
在这里插入图片描述
我们可以看到,目前随机森林的效果最好,所以我们选择随机森林进行参数调节。

📃参数调节

在这里我们选择使用网格调参的方式进行参数调节,代码如下:

from sklearn.model_selection import GridSearchCVn_estimators = [3,5,10,15,20,40, 55]max_depth = [10,100,1000]parameters = { 'n_estimators': n_estimators, 'max_depth': max_depth}model = ensemble.RandomForestClassifier()clf = GridSearchCV(model, parameters, cv=5)clf = clf.fit(data_x, data_y)clf.best_estimator_

结果如下:
在这里插入图片描述
在这里,我们选择了几个简单的参数进行调节,可以根据自己的实际情况对不同的参数进行调节。我们再进行一次交叉验证求平均值看一下效果,结果如下:
在这里插入图片描述
可以看到与刚才的效果相比有一些提升。

至此,我们的基于python对泰坦尼克幸存者进行分析与预测已经完全结束。

当然,这只是对整个数据分析的过程的简单介绍,大家可以根据实际的情况进行不同程度的更改。

在数据分析的过程中还需要进行可视化等不同的内容,大家可以根据自己的需要进行编码或分析。

最后,验证集的数据清洗以及处理的相关工作大同小异,感兴趣的朋友们可以自己按照上述步骤进行操作,或在评论区与我讨论。

需要源码的朋友可以私信我进行索取,我们下次再见。

请添加图片描述

来源地址:https://blog.csdn.net/weixin_44035098/article/details/129490248

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯