此次目的:
hello大家好,俺是没事爱瞎捣鼓又分享欲爆棚的叶同学!!!准备出几期博客来记录我学习kaggle数据科学入门竞赛的过程,顺便也将其中所学习到的知识分享出来。(所学主要的内容来自与b站大学恩师“编程教学-Python“的教学视频内容)
一. 构造新特征 Title
首先,我们从乘客的姓名中提取出头衔(Title
)作为一个新的特征。在泰坦尼克号数据集中,乘客的姓名通常包含头衔信息,例如“Mr.”、“Mrs.”等。
# 从Name中提取Title
full['Title'] = full['Name'].map(lambda x: x.split(',')[1].split('.')[0].strip())
# 查看Title数据分布
full['Title'].value_counts()
注意:split与lambda函数讲解。划重点!!!
full['Name']
:从数据集full
中提取Name
列,这列包含全名。.map(lambda x: ...)
:对Name
列的每一个值(即每一个名字)应用一个匿名函数(lambda函数)。x.split(',')[1]
:首先将名字字符串以逗号分割,通常名字的格式是“姓氏, 称谓 名字”,这一步提取逗号后面的部分。.split('.')[0]
:然后再以句号分割,通常称谓与名字之间有句号,这一步提取句号前的称谓部分。.strip()
:最后去掉提取出的称谓前后的空格。
头衔数据提取后,我们可以看到不同的头衔类型。为了减少类别的数量,我们将相似的头衔进行合并,比如将“Miss”和“Mlle”合并为“Miss”,将“Don”、“Sir”等头衔归为“Royalty”。
# 将Title信息进行整合
TitleDict = {
'Mr': 'Mr',
'Mlle': 'Miss',
'Miss': 'Miss',
'Master': 'Master',
'Jonkheer': 'Master',
'Mme': 'Mrs',
'Ms': 'Mrs',
'Mrs': 'Mrs',
'Don': 'Royalty',
'Sir': 'Royalty',
'the Countess': 'Royalty',
'Dona': 'Royalty',
'Lady': 'Royalty',
'Capt': 'Officer',
'Col': 'Officer',
'Major': 'Officer',
'Dr': 'Officer',
'Rev': 'Officer'
}
full['Title'] = full['Title'].map(TitleDict)
full['Title'].value_counts()
在整合头衔后,我们可以通过可视化来分析不同头衔乘客的生存率:
# 可视化Title与Survived之间的关系
sns.barplot(data=full, x='Title', y='Survived')
二. 构造家庭成员数量特征 familyNum
接下来,我们构造了家庭成员数量(familyNum
)这一特征。familyNum
等于乘客的Parch
(父母或子女数量)与SibSp
(兄弟姐妹或配偶数量)之和再加上乘客自己。
# 计算家庭成员数量
full['familyNum'] = full['Parch'] + full['SibSp'] + 1
# 查看familyNum与Survived的关系
sns.barplot(data=full, x='familyNum', y='Survived')
分析显示,家庭成员数量在2到4人时,乘客的生存率较高,而没有家庭成员或家庭成员数量过多时生存率较低。基于此,我们将家庭规模分为小(0)、中(1)、大(2)三类。
# 将家庭规模分为小(0), 中(1), 大(2)三类
def familysize(familyNum):
if familyNum == 1:
return 0
elif 2 <= familyNum <= 4:
return 1
else:
return 2
full['familysize'] = full['familyNum'].map(familysize)
full['familysize'].value_counts()
# 查看familysize与Survived的关系
sns.barplot(data=full, x='familysize', y='Survived')
注意:
.map(familysize)
:对familyNum
列的每一个值应用familysize
函数,并根据返回值创建一个新的列familysize
,表示家庭规模的分类。
三. 提取船舱类型特征 Deck
船舱类型(Deck
)的首字母也可以作为一个有价值的特征。通过提取Cabin
字段的首字母,我们可以构造出Deck
特征。
full['Cabin'].unique()
.unique()
: 这是一个Pandas函数,用于返回一个包含Cabin
列中所有唯一值的数组。唯一值是指在该列中不重复出现的值。
# 提取Cabin字段首字母作为Deck
full['Deck'] = full['Cabin'].map(lambda x: x[0])
# 查看不同Deck类型乘客的生存率
sns.barplot(data=full, x='Deck', y='Survived')
-
full['Cabin']
: 从数据集full
中提取Cabin
列,该列通常表示乘客的舱位编号。 -
.map(lambda x: x[0])
:.map(...)
函数对Cabin
列中的每个值(即每个舱位编号)应用一个函数。lambda x: x[0]
是一个匿名函数(lambda函数),它接收每个舱位编号字符串x
,并返回这个字符串的第一个字符x[0]
。- 这个第一个字符通常表示乘客所处的甲板(Deck),如"A", "B", "C"等。
-
full['Deck'] = ...
: 这部分将提取出的首字母(甲板编号)存储在新的Deck
列中。
四. 共票号乘客数量特征 TickCom
和 TickGroup
最后,我们通过统计相同票号的乘客数量,构造了共票号乘客数量(TickCom
)特征,并进一步将其分为三类(TickGroup
)。
# 提取各票号的乘客数量
TickCountDict = full['Ticket'].value_counts()
TickCountDict.head(20)
# 将同票号乘客数量数据并入数据集中
full['TickCom'] = full['Ticket'].map(TickCountDict)
# 查看TickCom与Survived的关系
sns.barplot(data=full, x='TickCom', y='Survived')
# 将TickCom分为三类
def TickCountGroup(num):
if 2 <= num <= 4:
return 0
elif num == 1 or 5 <= num <= 8:
return 1
else:
return 2
full['TickGroup'] = full['TickCom'].map(TickCountGroup)
# 查看TickGroup与Survived的关系
sns.barplot(data=full, x='TickGroup', y='Survived')
五.总结与鼓励
通过特征工程,我们构造了多个新的特征,并分析了它们与乘客生存率之间的关系。这些特征可以帮助提升机器学习模型的预测能力,从而更准确地预测乘客的生存情况。特征工程是一项重要且复杂的工作,它需要不断的尝试和调整,以便找到对模型最有帮助的特征。再坚持坚持,咱就要了解到模型啦!!!也许一下子接受很难,但可以将这一系列作为了解,了解整个数据科学竞赛和数据分析处理预测的整个过程,为以后系统学习相关知识打下基础,提前对整个流程有关全局了解,降维打击。加油加油!!!
六.最近更的不勤的原因
噗嗤,马上要开学了,所有要陪提前回校的好兄弟们疯狂几天哈哈哈!!!还要因为上学期没有好好学数据库,但又感觉数据库还是很有趣的知识,于是也在抽空自学,预告一下,后面应该会做数据库相关课程哈!
展示一下这段时间哈哈哈哈,吃吃吃,玩玩玩,逛逛逛......好好享受最好几天啦!开学好好学习啦!