技术心得记录:机器学习——用逻辑回归及随机森林实现泰坦尼克号的生存预测

简介: 技术心得记录:机器学习——用逻辑回归及随机森林实现泰坦尼克号的生存预测

1.实验背景


本次实验是Kaggle上的一个入门比赛——Titanic: Machine Learning from Disaster。比赛选择了泰坦尼克号海难作为背景,并提供了样本数据及测试数据,要求我们根据样本数据内容建立一个预测模型,对于测试数据中每个人是否获救做个预测。样本数据包括891条乘客信息及获救情况,测试数据有418条乘客信息。样本数据的样例如下:


Passenger:乘客唯一识别id


Survived:是否存活,0为否,1为是


Pclass:船舱等级,1、2、3等


Name:姓名


Sex:性别


Age:年龄


SibSp:和该乘客一起旅行的兄弟姐妹和配偶的数量

//代码效果参考: http://www.jhylw.com.cn/320825391.html


Parch:和该乘客一起旅行的父母和孩子的数量


Ticket:船票号


Fare:船票价格


Cabin:船舱号


Embarked:登船港口 S=英国南安普顿Southampton(起航点) C=法国 瑟堡市Cherbourg(途经点) Q=爱尔兰 昆士Queenstown(途经点)


我们的目标就是根据上述字段信息以及乘客的获救情况,实现一个预测乘客是否存活的模型。下面我们来看一下用到的模型。


2.模型简介


通过分析案例,我们可以看出这是一个很明显的二分类问题,即判断乘客是否遇难,关于二分类的模型很多,这里用到了三种模型:线性回归模型、逻辑回归模型跟随机森林模型。本次实验也参考了 寒小阳的CSDN博客以及网页云课堂的免费公开课。下面就对这三个模型进行介绍。


线性回归模型


线性回归模型很简单,可以看成多项式方程的拟合问题。只有一个自变量,称为一元线性回归;有多于一个的变量,称为多元线性回归。对于一元线性回归,经常采用最小二乘的方法拟合出一条最逼近各点的曲线,如下图所示:


多元线性回归自变量不止一个,形式如式子:Y = a1X1+a2X2+a3X3+a4X4+a5X5+.....+anXn。一元线性回归是找一条拟合直线,而对于多元线性回归则是找到一个超平面,使这个超平面距离各点的距离最小。


其实无论是一元线性回归还是多元线性回归,它们的通式是Y = ω‘X+b。通过训练数据,找到最合适的w‘和b,也就实现了模型的求解。


这样,我们输入不同的自变量,就可以找到对应的因变量,达到预测的目的。


逻辑回归模型


线性回归存在一个最大的问题就是,它的自变量是连续变化的,是区间变量,而现实生活中很多变量不是连续的,例如属性变量或者序列变量。在这里,像我们样本数据中的年龄属性就是序列变量,因为年龄正常情况下不存在小数,不可能我们说一个人12.25岁;数据中的船舱等级、性别、登船港口等都是属性变量,这些变量的取值都是固定的。


所以对于现实生活中很多实例,线性回归模型不再很适用,这时候就要考虑逻辑回归模型。


其实逻辑回归可以看做广义的线性回归,只不过它通过函数L把 w‘X+b对应一个隐状态p,p = L(ω‘X+b),相当于对于结果Y又用一个函数L进行修饰得到L(Y)。如果没有函数L则是线性回归,如果函数L是多项式函数,就是多项式回归,而如果L是logistic函数,就是logistic回归。


logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。


我们通常用0和1来表示二分类的结果,而ω‘X+b得到的值可能不是0-1范围内,我们需要找到一个函数对于ω‘X+b结果进行处理,使其值在【0,1】里面。于是便找到Sigmoid Function作为我们的L函数,它的函数式如下:


Sigmoid Function的函数图像如下,它的绘制函数是:


1 import matplotlib.pyplot as plt


2 import numpy as np


3


4 def Sigmoid(x):


5 return 1.0 / (1.0 + np.exp(-x))


6


7 x= np.arange(-10, 10, 0.1)


8 #Sigmoid函数


9 h = Sigmoid(x)


10 plt.plot(x, h)


11 #坐标轴上加一条竖直的线(0位置)


12 plt.axvline(0.0, color='k')


13 plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted')


14 plt.axhline(y=0.5, ls='dotted', color='k')


15 #y轴标度


16 plt.yticks(【0.0, 0.5, 1.0】)


17 #y轴范围


18 plt.ylim(-0.1, 1.1)


19 plt.show()


我们又把L函数叫做激活函数,激活函数不只Sigmoid Function一种,还有tanh函数、ReLU函数等等,函数的选择要根据适用场景来定。


我们通过Sigmoid Function把结果值变为【0,1】之间的数值,那么怎么才能求出最合适的ω'跟b呢?


对于单个样本,这里就是每一个乘员数据,我们定义了损失函数(Loss Functon)来评价预测的结果。它的形式是这样的:?(a,y),这里的a就是L(ω‘X+b),y则是预测的真值。?是一个衡量预测值与真值大小的函数,最常用的就是对数形式的函数,为:?(a,y) = -【yloga +(1-y)log(l-y)】。


而成本函数(Cost Function)则是所有样本函数的加权求平均。我们要想求出最合适的ω'跟b,就要是成本函数的值最小,首先对ω'跟b赋予初值,这时候我们对成本函数求导,利用反向传播,可以得到一次dω'跟db。


通过梯度下降法ω' = ω'+dω',b = b+db就得到更新后的ω'跟b。最后通过一步步的梯度下降,使得成本函数C的值最小,这时候我们就找到了最优的ω'跟b。如下图所示,通过不断调整ω'跟b,使得损失函数C到达最低点。


当然,我们的实现过程很简单,只需要几行代码就可以搞定。


随机森林模型


在谈随机森林模型前,需要理解决策树模型。最简单的一个决策树只有一个分支,例如考到60分以上是及格,60分以下是不及格。当影像因素很多事,会根据这些因素建立很多决策层,最终得到结果。如下图所示,就是一个决策树:


决策树模型很容易产生过拟合现象,模型泛化能力很弱。基于决策树模型,又出现了随机森林模型,通过选择选择任意数量的决策树,通过从样本数据数据中有放回的随机抽取一些样本去训练这些决策树,最终的结果是综合所有决策树的判断给出最合理的决策。


说了这么多模型,其实模型的实现过程很简单,因为python的sklearn库已经把上面这些函数通通封装好了,只需要调用即可。


3.数据预处理


在进行实验之前,这里先说明一下用到的库函数。pandas、sklearn、numpy以及绘图库函数matplotlib。


机器学习的绝大多数运算是矩阵运算,需要输入的数据是数值型。而我们这里很多数据是字符型,我们首先需要对于数据进行预处理。


首先读入我们的数据:


1 # 正则表达式模块


2 import re


3


4 # 由于年龄中有空值,需要先用平均值对年龄的缺失值进行填充,因为矩阵运算只能是数值型,不能是字符串


5 titanic【'Age'】 = titanic【'Age'】.fillna(titanic【'Age'】.mean())


6 # 同理,由于Embarked(登船地点)里面也有空值,所以也需要用出现最多的类型对它进行一个填充


7 titanic【'Embarked'】 = titanic【'Embarked'】.fillna('S')


8


9 # 对于性别中的male与female,用0和1来表示。首先看性别是否只有两个值


10 # 对于登船地点的三个值S C Q,也用0 1 2分别表示


11 # print(titanic【'Sex'】.unique())


12 # print(titanic【'Embarked'】.unique())


13 titanic.loc【titanic【'Sex'】 == 'male', 'Sex'】 = 0


14 titanic.loc【titanic【'Sex'】 == 'female', 'Sex'】 = 1


15


16 titanic.loc【titanic【'Embarked'】 == 'S', 'Embarked'】 = 0


17 titanic.loc【titanic【'Embarked'】 == 'C', 'Embarked'】 = 1


18 titanic.loc【titanic【'Embarked'】 == 'Q', 'Embarked'】 = 2


19


20 # 加上其余的属性特性


21 titanic【"FamilySize"】 = titanic【"SibSp"】 + titanic【"Parch"】


22


23 # 姓名的长度


24 titanic【"NameLenght"】 = titanic【"Name"】.apply(lambda x: len(x))


25


26


27 # 定义提取姓名中Mr以及Mrs等属性


28 def get_title(name):


29 title_search = re.search(' (【A-Za-z】+).', name)


30 if title_search:


31 return title_search.group(1)


32 return ""


33


34


35 titles = titanic【"Name"】.apply(get_title)


36 # 对于姓名中的一些称呼赋予不同的数值


37 title_mapping = {'Mr': 1, 'Miss': 2, 'Mrs': 3, 'Master': 4, 'Dr': 5, 'Rev': 6, 'Major': 7, 'Mlle': 8, 'Col': 9,


38 'Capt': 10, 'Ms': 11, 'Don': 12, 'Jonkheer': 13, 'Countess': '14', 'Lady': 15, 'Sir': 16, 'Mme': 17}


39 for k,v in title_mapping.items():


40 titles【titles == k】 = v


41 titanic【'Titles'】 = titles


这时候,我们需要画图看一下这些数据对于最后获救的结果影响到底有多大。


首先是乘客船舱等级获救情况统计:


1 # 导入图表函数


2 import matplotlib.pyplot as plt


3 from pylab import *


4 # 图表汉字正常显示


5 mpl.rcParams【'font.sans-serif'】 = 【'SimHei'】


6 # 图表负值正常显示


7 matplotlib.rcParams【'axes.unicode_minus'】 = False


8


9 # 查看各等级乘客等级的获救情况


10 fig = plt.figure()


11 # 设置图表颜色的alpha参数


12 fig.set(alpha=0.2)


13


14 Suvived_0 = titanic.Pclass【titanic.Survived == 0】.value_counts()


15 Suvived_1 = titanic.Pclass【titanic.Survived == 1】.value_counts()


16 df = pandas.DataFrame({u"获救": Suvived_1, u"未获救": Suvived_0})


17 df.plot(kind='bar', stacked=True)


18 plt.title(u'各乘客等级的获救情况')


19 plt.xlabel(u'乘客等级')


20 plt.ylabel(u'人数')


21 plt.show()


再看一下不同性别的获救情况:


1 # 按性别分组


2 fig = plt.figure()


3 fig.set(alpha=0.2)


4


5 Survived_m = titanic.Survived【titanic.Sex == 0】.value_counts()


6 Survived_f = titanic.Survived【titanic.Sex == 1】.value_counts()


7 df = pandas.DataFrame({u'男性': Survived_m, u'女性': Survived_f})


8 df.plot(kind='bar', stacked=True)


9 plt.title(u'不同性别获救情况')


10 plt.xlabel(u'性别')


11 plt.ylabel(u'人数')


12 plt.show()


还有不同年龄的获救情况统计:


1 # 不同年龄获救情况


2 fig = plt.figure()


3 fig.set(alpha=0.2)


4 plt.scatter(titanic.Survived, titanic.Age)


5 plt.ylabel(u'年龄')


6 plt.grid(b=True, which='major', axis='y')


7 plt.title(u'不同年龄的获救情况(1为获救)')


8 plt.show()


<a href="javascript:void(0);" onclick="copyCnblogsCod

目录
打赏
0
0
0
0
32
分享
相关文章
生物医药蛋白分子数据采集:支撑大模型训练的技术实践分享
作为生物信息学领域的数据工程师,近期在为蛋白质相互作用预测AI大模型构建训练集时,我面临着从PDB、UniProt等学术数据库获取高质量三维结构、序列及功能注释数据的核心挑战。通过综合运用反爬对抗技术,成功突破了数据库的速率限制、验证码验证等反爬机制,将数据采集效率提升4倍,为蛋白质-配体结合预测模型训练提供了包含10万+条有效数据的基础数据集,提高了该模型预测的准确性。
77 1
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
255 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
技术实践 | 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型快速搭建专业领域知识问答机器人
Qwen2-VL是一款具备高级图像和视频理解能力的多模态模型,支持多种语言,适用于多模态应用开发。通过PAI和LLaMA Factory框架,用户可以轻松微调Qwen2-VL模型,快速构建文旅领域的知识问答机器人。本教程详细介绍了从模型部署、微调到对话测试的全过程,帮助开发者高效实现定制化多模态应用。
机器学习中模型选择和优化的关键技术——交叉验证与网格搜索
本文深入探讨了机器学习中模型选择和优化的关键技术——交叉验证与网格搜索。介绍了K折交叉验证、留一交叉验证等方法,以及网格搜索的原理和步骤,展示了如何结合两者在Python中实现模型参数的优化,并强调了使用时需注意的计算成本、过拟合风险等问题。
209 6
在数字化时代,推荐系统成为互联网应用的重要组成部分,通过机器学习技术根据用户兴趣和行为提供个性化推荐,提升用户体验
在数字化时代,推荐系统成为互联网应用的重要组成部分,通过机器学习技术根据用户兴趣和行为提供个性化推荐,提升用户体验。本文探讨了推荐系统的基本原理、常用算法、实现步骤及Python应用,介绍了如何克服数据稀疏性、冷启动等问题,强调了合理选择算法和持续优化的重要性。
199 4
探索机器学习中的自然语言处理技术
【10月更文挑战第38天】在本文中,我们将深入探讨自然语言处理(NLP)技术及其在机器学习领域的应用。通过浅显易懂的语言和生动的比喻,我们将揭示NLP技术的奥秘,包括其工作原理、主要任务以及面临的挑战。此外,我们还将分享一些实用的代码示例,帮助您更好地理解和掌握这一技术。无论您是初学者还是有经验的开发者,相信您都能从本文中获得宝贵的知识和启示。
77 3
【重磅发布】AllData数据中台核心功能:机器学习算法平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
320 6
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
83 6

热门文章

最新文章

下一篇
oss创建bucket