别再只用年龄和性别了!挖掘泰坦尼克号数据中的‘隐藏’特征:从姓名头衔到家庭规模的实战技巧

张开发
2026/4/18 14:39:58 15 分钟阅读

分享文章

别再只用年龄和性别了!挖掘泰坦尼克号数据中的‘隐藏’特征:从姓名头衔到家庭规模的实战技巧
超越基础特征泰坦尼克号数据中的高阶特征工程实战当第一次接触泰坦尼克号数据集时大多数数据科学家都会本能地关注那些显而易见的特征乘客的年龄、性别、船票等级。这些基础特征确实能构建一个可用的预测模型但真正的价值往往隐藏在那些需要深入挖掘的隐藏特征中。想象一下1912年的社会结构和现代截然不同——头衔代表着社会地位家庭规模影响着逃生优先级甚至船舱位置都可能决定生死。这些细微但关键的信号正是普通数据分析容易忽略的黄金信息。1. 从姓名中解码社会地位头衔特征工程在爱德华时代的英国一个人的头衔几乎就是其社会地位的速写。泰坦尼克号乘客名单中的Name字段看似简单字符串实则包含了丰富的语义信息。传统处理方式可能直接丢弃这个字段或简单分割姓氏但深入分析会发现每个姓名中都嵌入了如Mr.、Mrs.、Dr.等头衔标记。提取头衔的正则表达式模式import re def extract_title(name): title_pattern re.compile(r,\s*(.*?)\.) match title_pattern.search(name) return match.group(1) if match else None titles df[Name].apply(extract_title)头衔不仅反映性别和婚姻状况更隐含社会阶层信息。我们可以将这些头尾分类映射到更有意义的社交类别原始头衔映射类别社会含义Mr.Gentleman普通成年男性Mrs.Married已婚女性MissSingle未婚女性MasterMinor未成年男性Dr.Professional专业人士Rev.Clergy神职人员Col.Military军官注意头衔映射需要结合历史背景研究。例如Master在爱德华时代特指未成年男孩而非现代语境中的大师。将这些分类进行one-hot编码后模型能够捕捉到社会地位对生存率的影响。实际分析显示头衔为Dr.或Military的乘客生存率显著高于Gentleman类别这与当时妇女儿童优先的逃生原则和专业人士的组织能力高度相关。2. 家庭结构分析超越简单的亲属计数原始数据集中的SibSp(兄弟姐妹/配偶数量)和Parch(父母/子女数量)常被单独使用但组合这些特征能揭示更有价值的家庭结构信息。我们可构建以下衍生特征家庭规模FamilySize SibSp Parch 1包含乘客自己家庭类别单独旅行者(Single)FamilySize 1核心家庭(Nuclear)2 ≤ FamilySize ≤ 4扩展家庭(Extended)FamilySize ≥ 5代际结构有子女的家庭Parch 0多代同堂Parch 0 且 Age 30家庭特征生成代码df[FamilySize] df[SibSp] df[Parch] 1 df[IsAlone] (df[FamilySize] 1).astype(int) df[NuclearFamily] ((df[FamilySize] 2) (df[FamilySize] 4)).astype(int) df[HasChildren] (df[Parch] 0).astype(int)历史记录显示泰坦尼克号沉没时家庭结构显著影响逃生顺序。带小孩的家庭往往被优先安排救生艇而大型家庭团体可能因组织困难而降低整体生存率。我们的特征工程正是要捕捉这种非线性的关系模式。3. 船舱号的秘密从字母到空间位置Cabin字段的缺失率高达77%常被初学者直接丢弃。但仔细观察现有数据会发现船舱编号其实遵循特定编码规则首字母表示甲板层级从A到GA为最上层数字部分表示房间序列通常奇数在左舷偶数在右舷即使面对大量缺失值我们仍可提取有价值的信息甲板层级提取df[Deck] df[Cabin].str[0].fillna(U) # U代表未知船舱位置推断def infer_side(cabin): if pd.isna(cabin) or not cabin[1:].isdigit(): return U return Port if int(cabin[1:]) % 2 else Starboard df[Side] df[Cabin].apply(infer_side)泰坦尼克号的沉没过程存在明显的不对称性——右舷(Starboard)先入水导致不同位置的乘客面临不同的逃生时间压力。将这些空间特征纳入模型后可以观察到上层甲板(A-C)乘客生存率显著高于下层右舷乘客在初期有更多逃生机会某些特定区域(如靠近救生艇的D甲板前部)生存率异常高4. 船票编码的隐藏信息Ticket字段看似随机的字母数字组合实则包含多种信息模式纯数字票号通常表示较早购买的船票包含字母前缀如PC、CA等可能代表特定票种或购票渠道特殊字符如LINE表示公司预留票票种提取函数def extract_ticket_type(ticket): ticket ticket.split()[0] if ticket.isdigit(): return Numeric if / in ticket: return Group if . in ticket: return Special return ticket.upper() df[TicketType] df[Ticket].apply(extract_ticket_type)分析发现某些票种与生存率存在强相关性。例如PC(巴黎专用票)持有者生存率达80%CA(船员家属票)生存率仅20%纯数字票(早期购买)生存率低于字母前缀票这可能反映了不同票种乘客的优先级差异或位置分布特征。5. 特征组合与交互效应单一特征的价值有限真正的威力来自特征间的组合。我们可以创建以下交互特征社会地位与家庭规模高阶人士带小孩的生存优势大家庭中的劳工阶层劣势船舱位置与票价高价票在上层右舷的双重优势低价票在下层左舷的叠加风险交互特征生成示例df[EliteFamily] ((df[Title] Professional) (df[HasChildren] 1)).astype(int) df[LowerDeckMale] ((df[Deck] D) (df[Title] Gentleman)).astype(int)这种特征组合往往能揭示数据中更深层的模式。例如我们的分析显示高阶专业人士带小孩的生存率高达92%下层甲板单身男性的生存率仅为7%中等舱位大家庭的生存率比预期低15%6. 特征有效性评估方法不是所有衍生特征都有价值我们需要系统评估每个特征的贡献单变量分析计算每个特征与目标的相关性绘制特征在不同取值下的生存率分布多变量分析使用决策树查看特征重要性通过正则化模型观察系数大小模型性能测试在验证集上比较特征组合的效果使用递归特征消除(RFE)选择最优子集特征重要性评估代码from sklearn.ensemble import RandomForestClassifier model RandomForestClassifier() model.fit(X_train, y_train) importance pd.DataFrame({ feature: X_train.columns, importance: model.feature_importances_ }).sort_values(importance, ascendingFalse)在实践中发现头衔相关特征和甲板位置的特征重要性通常排在前列而简单的家庭规模特征往往被更精细的家庭结构特征所替代。7. 实战建议与常见陷阱基于多次实验的经验总结推荐做法优先处理高信息密度的字符串字段(Name/Cabin/Ticket)创建反映历史背景的特征组合对每个新特征进行单变量分析需要避免的错误直接删除高缺失率字段而不尝试提取信息忽略特征间的交互作用过度依赖自动化特征选择工具一个典型的反例是直接将Cabin字段的缺失值简单填充为Unknown。更好的做法是提取已知船舱的层级信息根据票价和乘客类别预测可能甲板为真正缺失的值保留Unknown类别这种处理方式在测试中能使模型准确率提升3-5个百分点。

更多文章