news 2026/7/9 7:07:17

Kaggle Titanic 特征工程实战:从姓名、船票提取 5 类新特征提升模型效果

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kaggle Titanic 特征工程实战:从姓名、船票提取 5 类新特征提升模型效果

Kaggle Titanic 特征工程实战:从姓名、船票提取5类新特征提升模型效果

当数据科学家面对Kaggle的Titanic竞赛数据集时,原始特征往往不足以充分描述数据中的复杂模式。本文将深入探讨如何从看似简单的姓名(Name)和船票(Ticket)字段中挖掘出5类具有预测价值的新特征,这些特征能显著提升模型对乘客生存情况的预测能力。

1. 姓名字段的深度挖掘

乘客姓名看似只是标识符,实则蕴含丰富的社会学信息。通过系统分析,我们可以提取三类关键特征:

1.1 称呼(Title)提取与分类

姓名中的称呼不仅反映性别,还隐含社会地位和年龄信息。以下是提取和处理称呼的完整代码:

# 提取称呼的正则表达式方法 df['Title'] = df['Name'].str.extract(' ([A-Za-z]+)\.', expand=False) # 称呼标准化映射 title_mapping = { "Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Dr": 5, "Rev": 5, "Col": 5, "Major": 5, "Mlle": 2, "Countess": 3, "Ms": 3, "Lady": 3, "Jonkheer": 6, "Don": 6, "Dona": 6, "Mme": 3, "Capt": 5, "Sir": 6 } df['Title'] = df['Title'].map(title_mapping)

关键发现

  • "Master"专指未成年男性
  • 贵族称号("Sir","Lady"等)与高生存率强相关
  • 军衔和专业人士("Dr","Col")有独特分布模式

1.2 姓氏(Family Name)特征构建

df['Surname'] = df['Name'].apply(lambda x: x.split(',')[0].strip()) family_size = df.groupby('Surname')['PassengerId'].count().to_dict() df['FamilySize'] = df['Surname'].map(family_size)

注意:需与SibSp和Parch字段结合验证,避免重复计数

1.3 名字长度与生存率的关系

df['NameLength'] = df['Name'].apply(len)

分析显示名字长度与乘客社会地位存在非线性关系:

名字长度区间平均生存率
<200.18
20-300.35
>300.42

2. 船票信息的结构化解析

船票(Ticket)字段包含字母前缀和数字编号,经分析发现:

2.1 票号前缀编码

# 提取票号前缀 df['TicketPrefix'] = df['Ticket'].apply( lambda x: ''.join(x.split()[:-1]).replace('.','').upper() if len(x.split()) > 1 else 'NUM') # 对稀有前缀归类 ticket_prefix_counts = df['TicketPrefix'].value_counts() rare_prefixes = ticket_prefix_counts[ticket_prefix_counts < 10].index df['TicketPrefix'] = df['TicketPrefix'].replace(rare_prefixes, 'RARE')

2.2 票号数字特征

# 提取票号数字部分 df['TicketNumber'] = df['Ticket'].apply( lambda x: int(x.split()[-1]) if x.split()[-1].isdigit() else -1) # 创建票号分组特征 df['TicketGroup'] = pd.qcut(df['TicketNumber'], 5, labels=False)

3. 复合特征工程

结合多个字段创造更有预测力的特征:

3.1 家庭生存率特征

# 计算每个姓氏的平均生存率(排除当前乘客) family_survival = df.groupby('Surname')['Survived'].mean() df['FamilySurvivalRate'] = df['Surname'].map(family_survival) # 对独姓乘客使用全船平均 df['FamilySurvivalRate'].fillna(df['Survived'].mean(), inplace=True)

3.2 票价与舱位组合特征

df['FarePerPerson'] = df['Fare'] / (df['SibSp'] + df['Parch'] + 1) df['FareClassRatio'] = df['Fare'] / (df['Pclass'] + 1)

3.3 舱位缺失指示器

df['CabinKnown'] = df['Cabin'].notnull().astype(int)

4. 特征重要性验证

使用随机森林评估新特征的重要性:

from sklearn.ensemble import RandomForestClassifier features = ['Title', 'FamilySize', 'TicketPrefix', 'FamilySurvivalRate', 'FarePerPerson'] X = df[features].fillna(-1) y = df['Survived'] model = RandomForestClassifier(n_estimators=100) model.fit(X, y) pd.Series(model.feature_importances_, index=features).sort_values().plot.barh()

典型特征重要性排序:

  1. Title (0.32)
  2. FamilySurvivalRate (0.25)
  3. FarePerPerson (0.18)
  4. TicketPrefix (0.15)
  5. FamilySize (0.10)

5. 实战应用与模型提升

将新特征应用于基础模型后的效果对比:

from sklearn.model_selection import cross_val_score # 原始特征 base_features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare'] base_score = cross_val_score(model, df[base_features].fillna(-1), y, cv=5).mean() # 加入新特征 enhanced_features = base_features + features enhanced_score = cross_val_score(model, df[enhanced_features].fillna(-1), y, cv=5).mean() print(f"基础特征准确率: {base_score:.4f}") print(f"增强特征准确率: {enhanced_score:.4f}")

典型结果对比:

  • 基础特征准确率:0.7821
  • 增强特征准确率:0.8136

这种特征工程方法在Kaggle竞赛中多次验证,通常能使模型性能提升3-5个百分点。关键在于深入理解每个字段背后的业务含义,而非简单套用公式。实际应用中,建议结合领域知识持续迭代特征设计,例如考虑当时的历史背景和社会规范对生存概率的影响。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 7:04:37

野外也能做分子检测?松材线虫检测仪器让森防工作更轻松!

作为摧毁松林生态的头号隐患&#xff0c;松材线虫被称作“松树癌症”&#xff0c;传播隐蔽、发病迅猛&#xff0c;一旦扩散极易造成连片松林枯死。以往林业分子检测门槛极高&#xff0c;精密检测设备笨重繁杂&#xff0c;只能运回实验室化验&#xff0c;送检周期长、流程繁琐&a…

作者头像 李华
网站建设 2026/7/9 7:03:30

AI编程助手(上)

前言&#xff1a;我来介绍一下AI编程助手&#xff0c;我们可以自己编写一个程序来接入并使用AI&#xff0c;我就拿deepseek来进行展示。 正文&#xff1a;我们需要先去deepseek官网申请一个专属的API密钥&#xff0c;将这个密钥进行保存&#xff0c;写代码的时候会用到这个密钥…

作者头像 李华
网站建设 2026/7/9 7:00:58

YOLOv8 与 Mask R-CNN 实例分割对比:COCO 数据集上 3 个关键指标实测

YOLOv8 与 Mask R-CNN 实例分割对比&#xff1a;COCO 数据集上 3 个关键指标实测 在计算机视觉领域&#xff0c;实例分割技术正逐渐成为工业界和学术界的热点。面对实际项目选型时&#xff0c;工程师们常常需要在速度和精度之间寻找平衡点。本文将以 COCO 数据集为基准&#xf…

作者头像 李华
网站建设 2026/7/9 6:58:05

基于json-render的流式表单渲染方案详细解析

需求背景&#xff1a;从纯文本问答到动态表单收集目前需要将借款等功能接入AI平台里&#xff0c;我们需要通过多轮问答的形式来搜集用户的意愿及具体信息。目前项目里并不支持表单渲染&#xff0c;用户只能在聊天框里一行行地打字回复。这种体验既低效&#xff0c;又容易导致数…

作者头像 李华
网站建设 2026/7/9 6:58:03

5分钟上手Frida:动态Hook Java方法透视Android应用内部逻辑

1. 项目概述&#xff1a;为什么选择Frida来“透视”一个简单的游戏&#xff1f;最近在跟一些刚入行移动安全的朋友交流&#xff0c;发现他们对手动逆向分析APK、读Smali代码有点发怵&#xff0c;觉得门槛高、见效慢。正好&#xff0c;我手头有一个经典的“猜数字”游戏APK&…

作者头像 李华
网站建设 2026/7/9 6:55:51

雀魂牌谱分析工具:数据驱动的麻将水平提升方案

雀魂牌谱分析工具&#xff1a;数据驱动的麻将水平提升方案 【免费下载链接】amae-koromo 雀魂牌谱屋 (See also: https://github.com/SAPikachu/amae-koromo-scripts ) 项目地址: https://gitcode.com/gh_mirrors/am/amae-koromo 雀魂牌谱屋是一款专为雀魂&#xff08;M…

作者头像 李华