别再只用Cleveland数据了!手把手教你用Python合并UCI心脏病4大原始数据集(含数据清洗与缺失值处理)

发布时间:2026/5/30 1:10:51

别再只用Cleveland数据了!手把手教你用Python合并UCI心脏病4大原始数据集(含数据清洗与缺失值处理) 构建更全面的心脏病研究数据集Python实战四大UCI原始数据整合在医学数据分析领域UCI心脏病数据集长期被视为经典基准数据。但一个鲜少被提及的事实是超过90%的研究论文仅使用了Cleveland子集这种选择性使用可能导致模型泛化能力存疑。本文将带您突破这一局限使用Python完整整合四个原始数据源构建真正具有代表性的增强版数据集。1. 为什么需要整合四大原始数据集Cleveland子集虽然使用广泛但仅包含303条记录且全部来自美国克利夫兰诊所。相比之下完整数据集还包含匈牙利心脏病研究所的294条记录加州长滩退伍军人医疗中心的200条记录瑞士苏黎世大学医院的123条记录这种地域多样性对构建鲁棒的预测模型至关重要。例如不同地区的心电图诊断标准可能存在细微差异仅使用单一来源数据训练的模型可能无法适应这种变化。提示完整数据集可使样本量提升近3倍同时增加人口统计学和地域多样性。2. 数据获取与初步探索首先需要从UCI官网获取原始文件import pandas as pd import numpy as np # 定义数据源URL data_sources { cleveland: https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data, hungarian: https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.hungarian.data, switzerland: https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.switzerland.data, longbeach: https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.va.data }每个文件都包含76个原始特征但实际研究中常用的14个核心特征为特征名描述数据类型age患者年龄数值sex性别(1男,0女)分类cp胸痛类型(1-4)分类trestbps静息血压(mm Hg)数值chol血清胆固醇(mg/dl)数值fbs空腹血糖120mg/dl布尔restecg静息心电图结果分类thalach最大心率数值exang运动诱发心绞痛布尔oldpeakST段压低值数值slopeST段斜率分类ca主要血管数分类thal地中海贫血分类target诊断结果分类3. 数据清洗与格式统一各子集间的数据格式差异是整合的主要挑战。我们需要处理缺失值表示不一致Cleveland使用?Hungarian使用-9.0其他子集混合使用NA和空字符串分类编码差异thal特征在Cleveland中使用3/6/7编码其他子集可能使用不同方案清洗流程示例def clean_dataset(df, source_name): # 统一缺失值标记 df.replace([?, -9.0, NA, ], np.nan, inplaceTrue) # 处理特定子集的特殊问题 if source_name hungarian: # 匈牙利数据集有额外的空格问题 df df.apply(lambda x: x.str.strip() if x.dtype object else x) # 统一列名 columns [age, sex, cp, trestbps, chol, fbs, restecg, thalach, exang, oldpeak, slope, ca, thal, target] df.columns columns return df4. 高级特征工程与验证合并后的数据集需要进行一致性验证数值范围检查年龄是否在合理范围(30-100)静息血压是否在医学合理区间跨数据集分布分析# 检查各子集的年龄分布 merged_data.groupby(source)[age].describe() # 输出结果示例 count mean std min 25% 50% 75% max source cleveland 303.0 54.44 9.04 29.0 48.0 56.0 61.0 77.0 hungarian 294.0 52.61 11.12 28.0 45.0 54.0 60.0 80.0 longbeach 200.0 56.32 10.64 32.0 49.0 57.0 63.5 82.0 switzerland 123.0 51.23 9.87 30.0 44.0 52.0 58.0 78.0 这种分析可以揭示潜在的数据采集偏差例如不同地区患者的平均年龄差异。5. 构建增强版数据集的完整流程以下是整合过程的完整代码框架def build_enhanced_heart_dataset(): # 1. 下载所有原始数据 datasets {} for name, url in data_sources.items(): df pd.read_csv(url, headerNone) df[source] name # 添加来源标记 datasets[name] clean_dataset(df, name) # 2. 垂直合并 merged pd.concat(datasets.values(), ignore_indexTrue) # 3. 统一分类编码 merged[thal] merged[thal].map({ 3.0: 0, 6.0: 1, 7.0: 2, # Cleveland编码 0.0: 0, 1.0: 1, 2.0: 2 # 其他子集编码 }) # 4. 处理目标变量 merged[target] (merged[target] 0).astype(int) # 二分类转换 # 5. 智能填充缺失值 from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer num_cols [age, trestbps, chol, thalach, oldpeak] imp IterativeImputer(max_iter10, random_state42) merged[num_cols] imp.fit_transform(merged[num_cols]) return merged6. 数据质量评估与可视化整合完成后建议进行全面的质量检查缺失值分析使用热图可视化各特征的缺失情况计算每个特征的完整性比例分布一致性检查绘制各子集特征的分布对比图使用统计检验评估分布差异import matplotlib.pyplot as plt import seaborn as sns # 示例比较胆固醇分布 plt.figure(figsize(10,6)) sns.boxplot(xsource, ychol, datamerged_data) plt.title(血清胆固醇水平的跨数据集比较) plt.show()这种分析可能揭示有趣的现象例如不同地区患者的平均胆固醇水平存在显著差异这可能是饮食文化差异的反映。7. 实际应用建议使用增强数据集时有几个实用技巧分层抽样确保训练集包含各子集的代表性样本源特征工程将数据来源作为额外特征帮助模型识别潜在偏差增强验证使用留出某个子集的方法测试模型泛化能力最终得到的数据集不仅样本量更大而且包含了宝贵的跨地域多样性这对构建真正稳健的心脏病预测模型至关重要。在实际项目中这种全面性往往意味着模型在真实医疗环境中的表现差异。

相关新闻