泰坦尼克号数据集单乘客多模型生存概率预测实现方法
泰坦尼克号多模型生存概率预测扩展方案
代码扩展实现
无需改动原有建模逻辑,仅做最小补充即可实现需求,所有原有类名、API、处理流程完全保持不变:
- 标准化阶段保存训练集指定列的均值、标准差,确保单样本预测时使用和训练阶段完全一致的标准化尺度
- 初始化
svm.SVC时传入probability=True参数(不改变原有类名),开启概率预测能力 - 封装预测函数,完成索引校验、特征预处理、多模型概率提取、指定格式输出
完整扩展后代码如下:
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn import svm from sklearn.neighbors import KNeighborsClassifier from sklearn.naive_bayes import GaussianNB from sklearn.ensemble import GradientBoostingClassifier from sklearn.metrics import accuracy_score # 1. 原有数据预处理流程保持不变 df = pd.read_csv('train.csv') df = df.drop(['Ticket', 'Cabin', 'PassengerId', 'Name'], axis=1) df['Age'] = df['Age'].fillna(df['Age'].mean()) df = pd.get_dummies(df, columns=['Sex', 'Pclass', 'Embarked'], drop_first=True) # 2. 原有数据集划分流程保持不变 X = df.drop('Survived', axis=1) y = df['Survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 3. 原有特征标准化流程补充:保存训练集统计量,用于后续单样本标准化 scale_cols = ['Age', 'Fare', 'SibSp', 'Parch'] train_mean = X_train[scale_cols].mean() train_std = X_train[scale_cols].std() X_train[scale_cols] = (X_train[scale_cols] - train_mean) / train_std X_test[scale_cols] = (X_test[scale_cols] - train_mean) / train_std # 4. 原有模型训练、准确率对比流程保持不变 models = { 'LogisticRegression': LogisticRegression(), 'SVC': svm.SVC(probability=True), 'KNeighborsClassifier': KNeighborsClassifier(), 'GaussianNB': GaussianNB(), 'GradientBoostingClassifier': GradientBoostingClassifier() } for name, model in models.items(): model.fit(X_train, y_train) y_pred = model.predict(X_test) acc = accuracy_score(y_test, y_pred) print(f"{name}准确率:{round(acc*100,2)}%") # ------------------- 扩展功能部分 ------------------- def predict_passenger_survival(N): # 校验索引合法性 if N not in X.index: return f"索引{N}不存在于处理后的数据集中,无法预测" # 提取样本并按训练集规则做标准化 passenger_feat = X.loc[[N]].copy() passenger_feat[scale_cols] = (passenger_feat[scale_cols] - train_mean) / train_std # 提取各模型生存概率(predict_proba返回[未生存概率, 生存概率],取索引1的值) prob_map = {} for model_name, clf in models.items(): survival_prob = clf.predict_proba(passenger_feat)[0][1] prob_map[model_name] = round(survival_prob * 100) # 按指定格式拼接输出 return f"索引为{N}的乘客,LogisticRegression预测生存概率为{prob_map['LogisticRegression']}%,SVC预测为{prob_map['SVC']}%,KNeighborsClassifier预测为{prob_map['KNeighborsClassifier']}%,GaussianNB预测为{prob_map['GaussianNB']}%,GradientBoostingClassifier预测为{prob_map['GradientBoostingClassifier']}%" # 调用示例:预测索引为5的乘客服从概率 print(predict_passenger_survival(5))
功能适用范围说明
该功能不支持无前置处理的任意乘客预测,具体规则如下:
- 对于
train.csv中存在、且经过预处理后保留在特征集X中的乘客:无论该样本被划分到训练集还是测试集,只要传入的索引N在X.index范围内,都可以直接调用函数输出可靠的预测概率 - 对于数据集外的新乘客:无法通过索引直接调用预测,必须严格对齐现有预处理规则:删除Ticket、Cabin、PassengerId、Name列,Age缺失值使用原训练集的Age均值填充,按照原训练集的独热编码列结构做
drop_first=True的哑变量转换,再用之前保存的训练集均值、标准差对Age、Fare、SibSp、Parch做Z-score标准化,保证输入特征的维度、列顺序、数值尺度和训练集完全一致,才能得到有效预测结果,直接传入原始新数据会触发维度不匹配报错,或得到完全失真的结果。
内容的提问来源于stack exchange,提问作者zum809
相关产品推荐
相关产品推荐

