Kaggle泰坦尼克之灾:逻辑回归模型实现笔记(一)

栏目:娱乐资讯  时间:2023-08-08
手机版

  这是第一次写博客,作为一个刚刚上路的小白,要学的东西很多。本来很多笔记都是以文本的形式储存在本地的,但是很想尝试写一次博客。大学快一年了,学的东西不多,但也不少。不多是在整个专业知识来说的,看了许多大牛的经历,深深感觉到自己要走的路还长,而相对于大学目前要求的基本专业内容,也算是学了不少的东西。

  这个是应实验室学长的要求完成的一个自学作业。说实话,一开始看这个kaggle题目,完全不知道它讲的是什么东西,然后通过查阅了许多资料,最后在寒小阳的《机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾》这篇文章帮助下完成了这道题目的第一步。又受到简书上王树义老师的文章影响,最终决定尝试写一篇博客笔记,内容则是选择了我刚刚完成的kaggle的初体验题目:泰坦尼克之灾。

  这篇博客主要是一个笔记,记录了泰坦尼克之灾的代码实现方法,实际上这个笔记还不能算完整,最后模型的优化还没有完成,但内心想完成这篇笔记的念头很重了。所以在完成了大纲的内容,和主要知识点的整理后,我便开始了这个笔记的填写。

  这篇笔记中的代码实现框架采用是寒小阳先生的文章,如果有同学是和我一样刚刚接触机器学习的数据分析,作为学习的话,我建议是看寒小阳先生的文章。那篇文章要更加有趣,语言还是很幽默的。本文的内容主要是对寒小阳先生代码的重新实现,主要是有一些函数的使用方法不相同。因为这个是笔记类型的,所以有些地方或许没有很详细的表达。好了,那就不扯废话了。

  这是一道数据分析的入门题,很适合新手初步了解数据分析是什么东西,怎么实现的。不过数据分析不只是做到这个,它还有对文本情感的分析,图像数字识别等等,具有不同的方向,所以我还有好长的路要走。

  kaggle链接

  本题处理的数据集是泰坦尼克号上的乘客的基本信息,然后凭借这些数据的信息来判断这些乘客最后有没有幸存下来。这里采用的处理算法是逻辑回归,但事实上还有其他的算法也可以完成处理。可以参考scikit-learn提供的一张导图来选择合适的算法。在这里插入图片描述

  关于逻辑回归,寒小阳先生有很详细的介绍,可以在下面的链接看到,我也重新附上了他实现这道题的链接:

  《机器学习系列(1)_逻辑回归初步》,作者:寒小阳

  《机器学习系列(2)_从初等数学视角解读逻辑回归》,作者:寒小阳

  《机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾》,作者:寒小阳

  pandas包:

  DataFrame(简写df)

  pd.read_csv()

  pd.get_dumines(data, prefix)

  pd.concat(data, axis)

  df.notnull()

  df.isnull()

  df.as_matrix()

  df.loc()

  df.drop(data, axis, inplace)

  df.filter(regex)

  df.index

  df.sort_index()

  df.sort_values()

  matplotlib包

  pyptlot包

  这部分的函数见matplot的笔记(当然说我自己的笔记啦)

  其中pandas提供了plt接口直接依据df数据绘制图像。

  这个接口在某些情况下好像并不理想,比如bar图像的坐标的ticks横向,更改值容易造成数据错误。

  numpy包:

  np.astype()

  np.int32()

  sklearn包:

  ensemble模块中的RandForestRegressor算法(简写rfr)

  rfr.fit()

  rfr.predict()

  preprocessing模块中的StandardScaler()函数(简写scalar)

  scalar.fit()

  scalar.fit().transform()

  linear_model模块中的LogisticRegression算法(简写clf)

  clf.fit()

  clf.predict()

  把这些函数列出来的原因是收到我开头提到的那位王老师影响,王老师在一篇关于文本情感分析机器学习文章中是先让我们去了解需要用到的函数怎么用后再去尝试敲代码,我认为这样挺好,所以把所有用到的函数都列出来了,除了matplotlib包的,主要是有点多,便懒得整理了。

  附上pandas和scikit-learn的官方手册:

  pandas:http://pandas.pydata.org/pandas-docs/stable/reference/index.html

  scikit-learn:https://scikit-learn.org/stable/glossary.html

  我认为处理数据前的第一步是了解数据,通过各种合理方便的手段了解数据的基本情况。如用excel查看csv文件中的数据,并依据kaggle里面的提示,我们会接触到以下数据:

  Passengerld, Survived, Pclass, Name, Sex, Age, SibSp, Parch, Ticket, Fare, Cabin, Embarked。

  整理到表格是这样的:

  数据训练集train.csv测试集test.csvPassengerld 乘客ID作为唯一标识,总共有891个作为唯一标识,总共有418个Survived 幸存情况0表示遇难,1表示幸存;无缺失值最后预测对象,无本项数据Pclass 乘客等级/船舱等级1头等舱,2二等舱,3三等舱;无缺失值1头等舱,2二等舱,3三等舱;无缺失值Name 名字无缺失值Name 名字Sex 性别无缺失值无缺失值Age 年龄共714个,有缺失值共332个,有缺失值SibSp 船上的兄妹/配偶数无缺失值无缺失值Parch 船上的子女/父母数无缺失值无缺失值Ticket 船票的编号无缺失值无缺失值Fare 船票的费用无缺失值共417个,有缺失值Cabin 船舱编号共204个,有缺失值共91个,有缺失值Embarked 登船口S、C、Q三个港口;共879,有缺失值无缺失值 这里主要需要数据可视化的内容,这一步在单独的py文件中实现。

  首先是将数据导入,然后建立一个专门的文件夹DF来存放可视化的图片和文件。

  有几点必须要说明一下,这块数据关系的分析我是将基本上有关系的属性都进行了一些分析,或许会有一些不严谨的地方和多余的分析,但主要是作为一篇笔记。如果不想看的可以跳过。

  目前我的感悟是,这些图像分析是到用到的时候才会去写它们的代码,比如说补全Age的时候,我们需要判断哪些属性可以被用来作为特征。还有就是任何合理便捷的手段来认识这些数据应该都是可行的,只不过作为初学者,应该是通过matplotlb来认识数据,帮助我们了解数据分析。所以,不一定要和我一样去把这些数据全部分析个完,也不需要提前分析好所有数据。其实有些代码是我后来补上的,很多应该是在系统优化阶段准备的,只是我把它放在了这里罢了。

  同时声明一下,其中个别代码是按照寒小阳先生的代码来写的。

  1、通过describe来查看数据的一些基本信息。

  在这里插入图片描述

  生存率大概在38%,平均年龄在30,船票价格平均在32左右。

  2、可视化分析

  引入包,添加中文支持,我用的spyder需要添加这个中文支持

  数据分析主要目的是两个:

  分析有缺失值的属性和其他属性的关系,填补缺失值分析Survived和其他属性的关系 2.1、生存情况

  在这里插入图片描述

  生存情况的统计,三分之一左右的人幸存。

  2.2、乘客等级分布

  在这里插入图片描述

  大部分是三等舱,头等舱和二等舱相差不大。

  2.3、乘客性别统计

  在这里插入图片描述

  男性的人数是女性的人数2倍左右,结合电影剧情分析,女的应该比男的更容易幸存。

  2.4、女&男和生存的关系

  在这里插入图片描述

  女性比男性更容易幸存,幸存人数里面女性是男性的两倍多,所以性别Sex是一个主要特征。

  2.5、年龄与生存的关系

  在这里插入图片描述

  儿童的更容易幸存,年龄18~60的情况一般情况下有一半偏少的人幸存,超过60的,幸存率较低,所以年龄也是一个主要特征。

  2.6、各乘客等级的获救情况

  在这里插入图片描述

  从幸存率上来看,头等舱和二等舱的乘客更容易幸存,所以应该是主要特征

  2.7、各登录港口乘客的获救情况

  在这里插入图片描述

  S港人数最多,Q港人数最少,但生存率都在三分之一左右,C港的生存率过半,等下看看是什么影响的,性别还是船舱等级

  2.8、根据舱等级和性别的获救情况

  在这里插入图片描述

  不同等级船舱男女性的生存情况, 可以看出高级船舱对生存率的影响要比性别的略高。

  2.9、不同等级船舱的年龄分布

  头等舱平均年龄: 38.233440860215055

  二等舱平均年龄: 29.87763005780347

  三等舱平均年龄: 25.14061971830986

  在这里插入图片描述

  不同船舱的年龄分布差不多,所以船舱等级高的更容易幸存不是年龄造成的。

  但明显的是平均年龄依次递减,头等舱平均年龄最高,这应该是影响年龄的一个特征。

  2.10、不同港口的船舱等级、性别情况

  在这里插入图片描述

  首先可以看出的是性别和港口无关,但是船舱等级好像没有太大规律可言,Q港口基本上是三等舱的,C港口二等舱较少。

  2.11、不同港口的年龄分布

  在这里插入图片描述

  不同港口的年龄也分布差不多,所以综上港口不大适合作为一个主要特征,先作为一个备选特征

  2.12、船票费用和生存的关系

  在这里插入图片描述

  好像没有太大关系,不是主要特征,作为备选特征

  2.13、兄妹&配偶数和生存的关系

  在这里插入图片描述

  兄妹&配偶数越多,生存的越少,猜测父母数/子女可能也是这样。

  2.14、子女&父母数和生存的关系

  在这里插入图片描述

  确实是这样。

  2.15、按Cabin有无看获救情况

  在这里插入图片描述

  缺失值有点多,按照图像的情况看无缺失值的更容易生存,所以预处理的时候按照是否有Cabin来处理吧。

  2.16、年龄和船票费用的关系

  按照常识年龄和船票价格肯定有所联系。

  在这里插入图片描述

  但事实上好像没有太大关系啊。

  2.17、年龄和SibSp的关系

  在这里插入图片描述

  两者还是有点关系的,可以作为年龄的特征。

  2.18、年龄和Parch的关系

  在这里插入图片描述

  两者的关系不是很大,但可以作为年龄的备选特征

  2.19、年龄和性别的关系

  在这里插入图片描述

  好像没有太大关系,作为年龄的备选特征。

  接下来第三、四、五步都是数据的预处理过程

  在第二步中,

  我们发现年龄Age主要和Pclass,Parch,SibSp有关,Fare、Sex可以作为备选特征。

  而Cabin则按照有和无来区分。

  下面是实现代码:

  其中对于年龄采用随机森林分类回归来处理缺失值

  这一步是对训练集的缺失值的处理,测试集的处理则放到后面测试集的预处理中

  用df.to_csv()函数可以查看完成缺失值处理的数据集

  逻辑回归建模,需要输入的特征是数值型特征,所以需要对数据的特征因子化

  特征因子化:以Cabin为例,原本一个属性维度,因为其取值可以是[‘yes’,‘no’],而将其平展开为’Cabin_yes’,'Cabin_no’两个属性。

  原本Cabin取值为yes的,在此处的"Cabin_yes"下取值为1,在"Cabin_no"下取值为0;

  原本Cabin取值为no的,在此处的"Cabin_yes"下取值为0,在"Cabin_no"下取值为1。

  特征因子化通过pd的get_dumies()函数来完成:

  对于完成因子化的数据链接到原数据集上

  逻辑回归建模中,浮动值极大的数字对收敛速度影响较大,所以要把Age和Fare进行scaling,也就是将他们特征化到[-1,1]之间。

  成功得到了clf这个模型,下面就是对测试集内容进行相同的预处理后就可以把特征数据填入获取结果了。

  上传到Kaggle得到的结果是0.766,以上就是一个模型建立的第一步,接下来是对模型的优化和调整以获取更好的模型。

  这篇笔记最后还是完成了,或许有一些没有校对的错误,不过我自己不再校对了,如果有同学或大佬指出来,我会去修正的。这也算是完成了一个小梦想吧。

  王树义老师给自己的标签是终身学习者,我则是一个刚刚踏上学习的小白,未来我不知道可以走到哪一步,我希望我也可以一名合格的软件工程师。虽然到大学时候才真正意识到学习的可贵(以前说学习重要的时候怕都是在说屁话吧),所以终身学习者我怕是做不到的了,但是至少从现在开始。最后感谢寒小阳先生文章指引我进入了机器学习的第一步,以及王老师文章中散发着的强烈的学习精神。

  还有博客笔记会不会写第二章,这个得看以后我自己情况了,这篇只是一个尝试罢了,现在更多的是学习,怕是没有太多时间去弄博客笔记吧,虽然很多零碎的知识是需要一个笔记,但是存在本地然后上传到云端就好啦。写博客还是太费神了,heyhey,就是懒啦。

  最后这个笔记上的所有代码都上传在GitHub,网址如下

  https://github.com/DimBottom/KaggleTitanic.git

  first_test文件是数据模型的建立实现代码,而first_test2文件则是数据可视化部分的代码。

上一篇:一个人一天消耗多少卡路里
下一篇:成人黄疸是什么原因引起的呢

最近更新娱乐资讯