当前位置: 首页 > news >正文

Pandas 2.2 实战:3种缺失值填充策略对比与泰坦尼克号数据集应用

Pandas 2.2 实战:3种缺失值填充策略对比与泰坦尼克号数据集应用

数据科学项目中,缺失值处理是数据预处理的关键环节。不同的填充策略会直接影响后续建模效果,但很少有资料系统对比不同方法在实际数据集上的表现差异。本文将深入解析均值/中位数填充、模型预测填充三种策略的实现原理,并在泰坦尼克号数据集上验证其对预测准确率的影响。

1. 缺失值处理的核心挑战

现实数据中缺失值产生的原因多种多样:可能是数据采集设备故障、用户拒绝提供敏感信息,或是数据传输过程中的丢失。根据缺失机制的不同,处理方法也需要针对性选择。

常见缺失模式分类

  • 完全随机缺失(MCAR):缺失与任何变量无关
  • 随机缺失(MAR):缺失与已观测变量相关
  • 非随机缺失(MNAR):缺失与未观测因素相关

在泰坦尼克号数据集中,"Age"字段约缺失20%,"Cabin"字段缺失77%。通过缺失模式分析可以发现:

import seaborn as sns titanic = sns.load_dataset('titanic') missing = titanic.isnull().sum()/len(titanic)*100 print(missing.sort_values(ascending=False))

输出结果:

survived 0.000000 pclass 0.000000 sex 0.000000 age 19.865320 sibsp 0.000000 parch 0.000000 fare 0.000000 embarked 0.224467 class 0.000000 who 0.000000 adult_male 0.000000 deck 77.216610 embark_town 0.224467 alive 0.000000 alone 0.000000 dtype: float64

2. 三种填充策略技术实现

2.1 均值/中位数填充

这是最基础的填充方法,适合数值型变量且分布相对对称的情况。Pandas 2.2优化了fillna()的性能,特别适合处理大型数据集。

关键参数对比

参数说明适用场景
method='ffill'前向填充时间序列数据
method='bfill'后向填充有序观测数据
value=mean()均值填充对称分布
value=median()中位数填充存在离群值

泰坦尼克号年龄填充示例:

# Pandas 2.2新增infer_objects性能优化 age_mean = titanic['age'].mean() age_median = titanic['age'].median() titanic['age_mean'] = titanic['age'].fillna(age_mean) titanic['age_median'] = titanic['age'].fillna(age_median)

2.2 模型预测填充

更高级的方法是建立预测模型来估算缺失值。常用算法包括:

  1. KNN填充:基于相似样本的值填充
  2. 随机森林:处理非线性关系
  3. MICE多重插补:迭代式填充

使用scikit-learn的迭代插补示例:

from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer from sklearn.ensemble import RandomForestRegressor # 选择用于预测的特征 features = ['pclass', 'sibsp', 'parch', 'fare', 'sex_encoded'] titanic['sex_encoded'] = titanic['sex'].map({'male':1, 'female':0}) # 创建插补器 imputer = IterativeImputer( estimator=RandomForestRegressor(n_estimators=100), max_iter=10, random_state=42 ) # 执行插补 titanic[features] = imputer.fit_transform(titanic[features]) titanic['age_model'] = titanic['age'].fillna(titanic['age'].median())

3. 泰坦尼克号案例实战

3.1 数据准备与特征工程

首先对原始数据进行预处理:

# 处理分类变量 titanic = pd.get_dummies(titanic, columns=['embarked', 'class']) # 创建新特征 titanic['family_size'] = titanic['sibsp'] + titanic['parch'] titanic['is_alone'] = (titanic['family_size'] == 0).astype(int) # 划分数据集 from sklearn.model_selection import train_test_split X = titanic.drop(['survived', 'alive', 'who', 'deck'], axis=1) y = titanic['survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

3.2 不同填充策略建模对比

使用随机森林评估三种填充方法:

from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score strategies = ['mean', 'median', 'model'] results = {} for strategy in strategies: # 复制数据避免污染 X_temp = X_train.copy() if strategy == 'mean': X_temp['age'] = X_temp['age'].fillna(X_temp['age'].mean()) elif strategy == 'median': X_temp['age'] = X_temp['age'].fillna(X_temp['age'].median()) else: # 使用之前训练的模型填充 X_temp['age'] = X_temp['age'].fillna(imputer.predict(X_temp[features])) # 训练模型 model = RandomForestClassifier(n_estimators=100, random_state=42) model.fit(X_temp, y_train) # 测试集同样处理 X_test_temp = X_test.copy() if strategy == 'mean': X_test_temp['age'] = X_test_temp['age'].fillna(X_train['age'].mean()) elif strategy == 'median': X_test_temp['age'] = X_test_temp['age'].fillna(X_train['age'].median()) else: X_test_temp['age'] = X_test_temp['age'].fillna(imputer.predict(X_test_temp[features])) # 评估 preds = model.predict(X_test_temp) acc = accuracy_score(y_test, preds) results[strategy] = acc

3.3 结果分析与可视化

填充策略准确率对比表:

策略类型测试准确率训练时间(s)实现复杂度
均值填充0.7911.2★★☆
中位数填充0.8031.1★★☆
模型预测0.81515.7★★★

可视化不同策略下年龄分布变化:

import matplotlib.pyplot as plt fig, axes = plt.subplots(1, 3, figsize=(15,5)) titanic['age_mean'].plot(kind='kde', ax=axes[0], title='Mean Imputation') titanic['age_median'].plot(kind='kde', ax=axes[1], title='Median Imputation') titanic['age_model'].plot(kind='kde', ax=axes[2], title='Model Imputation') plt.tight_layout()

4. 工程实践建议

在实际项目中选择填充策略时,需要考虑以下因素:

决策矩阵

  1. 数据规模:大数据集优先选择简单方法
  2. 缺失比例:超过30%缺失建议考虑删除或特殊标记
  3. 特征重要性:关键特征值得更复杂的填充方法
  4. 计算资源:模型填充需要更多计算资源

常见陷阱与解决方案

  • 数据泄露:确保填充模型只在训练集上训练
  • 类别不平衡:分层抽样保持分布一致性
  • 极端值影响:填充前先处理异常值

Pandas 2.2特有的优化技巧:

# 使用eval()加速链式操作 titanic.eval('age_filled = age.fillna(@age_median)', inplace=True) # 启用copy-on-write模式减少内存占用 pd.options.mode.copy_on_write = True
http://www.jsqmd.com/news/1153542/

相关文章:

  • 三步搞定!Mac安装Xbox手柄驱动终极指南,游戏体验全面升级
  • 360Controller:macOS系统下的Xbox控制器驱动解决方案
  • AI交易智能体:从原理到实践,赋能个人投资者的关键技术
  • AMD EPYC 9004 系列服务器CPU选型指南:5nm Zen 4 架构下 96 核与 128 核的抉择
  • RoboDojo评测基准立起“具身珠峰”,当前机器人模型距通用操作还有多远?
  • PaperxieAI 开题生成工具:三步标准化创作逻辑,轻松搞定开题撰写各类卡点
  • RAG在技术文档检索中的实战部署:ChromaDB与Embedding流水线
  • DeepSpeed: 大模型微调框架全面解析
  • Magpie终极指南:如何让老旧窗口瞬间高清化的完整教程
  • 上海靠谱的画册设计品牌哪家专业
  • Google Pay API v3 服务端订单校验:Java SDK 集成与 2 种验证方式对比
  • 终极指南:如何在Linux系统上部署Wallpaper Engine动态桌面引擎
  • 兴庆区靠谱的配镜眼科诊所
  • 银川靠谱的配镜眼科诊所
  • Open-Meteo:5分钟搭建专属天气API的完整指南
  • Otsu vs 自适应阈值:OpenCV 4种阈值法在5类场景下的性能对比
  • FontCenter终极指南:彻底告别AutoCAD字体缺失的完整解决方案
  • Paperxie 智能开题 AI 生成工具,一键打通毕业生选题筹备全流程
  • AI 辅助数据库查询优化:从慢查询日志到索引建议的完整链路
  • 3分钟搞定Foobar2000逐字歌词:ESLyric-LyricsSource完全配置指南
  • HarmonyOS 6.1 剪贴板操作实战 — pasteboard API的正确使用姿势
  • 解锁Foobar2000逐字歌词新境界:三大平台歌词源完美适配指南
  • Agent 核心原理:工具调用、记忆与任务规划-7708
  • 3个理由告诉你:为什么QModMaster是工业通信调试的最佳开源选择?
  • 计算机毕业设计之篮球场综合管理系统
  • AI应用落地实战:从模型集成到工程化部署的完整指南
  • 九大 AI 毕业论文写作工具实测盘点,高效破解毕业生论文全流程卡点
  • 机器学习模型评估3大误区:从80%训练集划分到混淆矩阵解读
  • Orca状态预测:从Token预测到世界理解的AI范式革命
  • 应对现代测试自动化挑战的技术架构:Testsigma AI驱动测试平台深度解析