此次目的:
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. 总结
同组效应的识别与利用,尤其是在姓氏等群体特征明显的数据中,可以显著提升预测模型的性能。这种方法不仅适用于泰坦尼克号数据集,也为其他类似问题提供了宝贵的参考。
在以后的研究中,我们可以进一步探讨如何更好地结合其他特征(如家庭关系、社交网络等)来完善此类分析方法,以更精确地捕捉群体行为的特征,从而进一步提升模型的预测能力。
哎!写一半不小心咪了一会儿哈!几天有点太累了,可能心累身体也累哈哈哈(“双累”),哎开学了也好,不然天天在出租屋里没啥事干也有点无聊,昨天下午午睡了一会儿,起来时顿感空虚,不过感觉也是在过渡期,以前在宿舍热闹惯了,忽然一个人出来住,有时候真有点无聊嘞!但没办法,时间会淡化一切的,多把精力放在学习与兴趣爱好上,应该就会好一些!周末回寝室再玩玩,慢慢适应吧!你我都加油!!!