泰坦尼克号 - 从灾难中学习机器学习/Titanic - Machine Learning from Disaster(kaggle竞赛)第八集(利用“同组效应”提升预测准确性)

此次目的:
hello大家好,俺是没事爱瞎捣鼓又分享欲爆棚的叶同学!!!准备出几期博客来记录我学习kaggle数据科学入门竞赛的过程,顺便也将其中所学习到的知识分享出来。(所学主要的内容来自与b站大学恩师“编程教学-Python“的教学视频内容)

烦啊!明天就要开学了,就要上课了!受不了一点!假期就这么快速的结束了!欲哭无泪!算了浅浅的学点吧!哦对最近还和一个朋友规划了一个事情,制作一个东西,先卖个关子,一个成功了就揭秘,没成功就当没发生哈哈哈哈哈!!!下面转入正题了噢!

我们在数据科学中,寻找隐藏在数据中的模式和关系是提升模型预测性能的关键。这篇博客我们将探讨如何利用泰坦尼克号数据集中乘客的姓氏信息,通过识别同组效应来改进生存率的预测。

1. 数据准备与提取

首先,我们从乘客的名字中提取姓氏,并统计每个姓氏的乘客数量。这一步帮助我们确定每个姓氏是否可以作为一个家庭或组的代表,从而为后续的分析提供依据。

full.head()

 

#提取乘客的姓氏及相应的乘客数
full['Surname'] = full['Name'].map(lambda x: x.split(',')[0].strip())
SurNameDict = full['Surname'].value_counts()
display(SurNameDict)
full['SurnameNum'] = full['Surname'].map(SurNameDict)
  • full['Name'] 是乘客姓名的列,通过 map() 函数和 lambda 表达式,我们对每个乘客的姓名进行操作。
  • x.split(',')[0] 将乘客的姓名按逗号分割,取第一个部分,即姓氏部分。
  • strip() 去除姓氏部分前后的空格。
  • 最终,提取出的姓氏被存储在一个新列 Surname 中。

 

2. 分析男性的同组效应

为了更深入地分析,我们将数据集中的男性乘客筛选出来,条件包括:性别为男性、年龄大于12岁、且家庭成员数不少于2。接着,我们通过计算同一姓氏下乘客的平均生存率来识别“同生共死”的模式。

MaleDf = full[(full['Sex'] == 'male') & (full['Age'] > 12) & (full['familyNum'] >= 2)]
MSurNamDf = MaleDf['Survived'].groupby(MaleDf['Surname']).mean()
MSurNamDf.head()
MSurNamDf.value_counts()
  • full['Sex'] == 'male':筛选性别为男性的乘客。
  • full['Age'] > 12:筛选年龄大于12岁的男性乘客。
  • full['familyNum'] >= 2:筛选家庭成员数不少于2人的男性乘客(包括他们自己)。
  • 这些条件组合在一起,通过逻辑与 & 运算符,将符合条件的乘客筛选出来,并存储在 MaleDf 数据框中。
  • mean():计算每个姓氏下的男性乘客的平均生存率。

 

 

通过分析,我们发现大多数同姓氏的男性乘客确实表现出“同生共死”的特征。基于这一点,我们将生存率为1的姓氏中的男性数据进行修改,增强其预测为“可以幸存”的概率。

3. 分析女性及儿童的同组效应

同样地,我们将数据集中的女性和12岁以下的儿童筛选出来,并分析他们的同组效应。结果显示,这一群体中也存在明显的“同生共死”特征。我们对生存率为0的姓氏中的女性及儿童数据进行修改,以提高其预测为“并未幸存”的概率。

#大多数同姓氏的男性存在“同生共死”的特点,因此利用该同组效应,我们对
#生存率为1的姓氏里的男性数据进行修改,提升其预测为“可以幸存”的概率

#提取乘客的姓氏及相应的乘客数
full['Surname']=full['Name'].map(lambda x:x.split(',')[0].strip())
SurNameDict=full['Surname'].value_counts()
display(SurNameDict)
full['SurnameNum']=full['Surname'].map(SurNameDict)

#将数据分为两组
FemChildDf = full[((full['Sex'] == 'female') | (full['Age'] <= 12)) & (full['familyNum'] >= 2)]

#分析男性同组效应
FCSurNamDf = FemChildDf['Survived'].groupby(FemChildDf['Surname']).mean()
FCSurNamDf.head()
FCSurNamDf.value_counts()

 

4. 数据修正与模型优化

基于上述分析,我们对数据集中的部分乘客信息进行了修正:

  • 对于生存率为1的姓氏中的男性乘客,我们将其性别改为女性,年龄改为5岁。
  • 对于生存率为0的姓氏中的女性及儿童,我们将其性别改为男性,年龄改为60岁。
    #与男性特征相似,女性及儿童中也存在明显的“同生共死”的特点,因此利用
    #同组效应,对生存率为0的姓氏里的女性及儿童数据进行修改,提升其预测为
    #“并未幸存”的概率
    
    #迁就算法
    #男性数据修正为:1.性别改为女;2.年龄改为5
    #女性及儿童数据修正为:1.性别改为男;2.年龄改为60
    
    
    #大多数同姓氏的男性存在“同生共死”的特点,因此利用该同组效应,我们对
    #生存率为1的姓氏里的男性数据进行修改,提升其预测为“可以幸存”的概率
    
    # 获得生存率为1的姓氏
    MSurNamDict = MSurNamDf[MSurNamDf.values == 1].index
    
    # 获得生存率为0的姓氏
    FCSurNamDict = FCSurNamDf[FCSurNamDf.values == 0].index
    
    # 对男性数据进行修正
    full.loc[(full['Survived'].isnull()) & (full['Surname'].isin(MSurNamDict)) &
            (full['Sex'] == 'male'), 'Sex'] = 'female'
    full.loc[(full['Survived'].isnull()) & (full['Surname'].isin(MSurNamDict)) &
            (full['Sex'] == 'male'), 'Age'] = 5
    
    # 对女性及儿童数据进行修正
    full.loc[(full['Survived'].isnull()) & (full['Surname'].isin(FCSurNamDict)) &
            ((full['Sex'] == 'female') | (full['Age'] <= 12)), 'Sex'] = 'male'
    full.loc[(full['Survived'].isnull()) & (full['Surname'].isin(FCSurNamDict)) &
            ((full['Sex'] == 'female') | (full['Age'] <= 12)), 'Age'] = 60
    

    通过上述数据修正,我们利用同组效应来优化模型预测,并提升了模型的准确性。这种策略在处理具有群体行为特征的数据时特别有效,也为我们提供了在复杂数据集中挖掘潜在模式的一种新方法。

    5. 总结

    同组效应的识别与利用,尤其是在姓氏等群体特征明显的数据中,可以显著提升预测模型的性能。这种方法不仅适用于泰坦尼克号数据集,也为其他类似问题提供了宝贵的参考。

    在以后的研究中,我们可以进一步探讨如何更好地结合其他特征(如家庭关系、社交网络等)来完善此类分析方法,以更精确地捕捉群体行为的特征,从而进一步提升模型的预测能力。

哎!写一半不小心咪了一会儿哈!几天有点太累了,可能心累身体也累哈哈哈(“双累”),哎开学了也好,不然天天在出租屋里没啥事干也有点无聊,昨天下午午睡了一会儿,起来时顿感空虚,不过感觉也是在过渡期,以前在宿舍热闹惯了,忽然一个人出来住,有时候真有点无聊嘞!但没办法,时间会淡化一切的,多把精力放在学习与兴趣爱好上,应该就会好一些!周末回寝室再玩玩,慢慢适应吧!你我都加油!!!

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值