共计 2283 个字符,预计需要花费 6 分钟才能阅读完成。
在医疗数据分析领域,数据质量直接影响模型的预测效果。胎儿健康数据(如 fetal-health.csv)常因设备误差、人为录入等原因存在缺失值和异常值。本文将系统介绍如何处理这些问题,并附上完整的 Python 代码示例。

背景与痛点
医疗数据中的缺失值和异常值是常见问题,尤其在胎儿健康数据中:
- 缺失值 :部分检测指标可能因设备故障或未记录而缺失,导致数据不完整
- 异常值 :设备误差或录入错误可能产生极端值,扭曲统计结果
直接使用原始数据进行建模会导致:
- 模型预测偏差增大
- 分类准确率下降
- 过拟合风险提高
技术方案
缺失值处理
处理缺失值前,需先分析缺失比例和模式:
import pandas as pd
# 加载数据
data = pd.read_csv('fetal-health.csv')
# 计算缺失比例
missing_ratio = data.isnull().mean() * 100
print(missing_ratio.sort_values(ascending=False))
根据缺失情况选择适当方法:
- 删除法 :当缺失比例 <5% 且随机缺失时适用
- 均值 / 中位数填充 :适用于连续特征
from sklearn.impute import SimpleImputer # 中位数填充 imputer = SimpleImputer(strategy='median') data_filled = imputer.fit_transform(data) - KNN 填充 :考虑特征相关性
from sklearn.impute import KNNImputer imputer = KNNImputer(n_neighbors=5) data_knn = imputer.fit_transform(data)
异常值检测
IQR 箱线图法
import matplotlib.pyplot as plt
import seaborn as sns
# 绘制箱线图
plt.figure(figsize=(12,6))
sns.boxplot(data=data)
plt.xticks(rotation=45)
plt.show()
# IQR 计算
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
# 定义异常值边界
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
Z-score 法
from scipy import stats
# 计算 Z -score
z_scores = stats.zscore(data.select_dtypes(include='number'))
# 定义阈值(通常±3)threshold = 3
outliers = (abs(z_scores) > threshold).any(axis=1)
非正态分布特征处理
对于明显偏态的特征:
- 考虑使用对数变换
- 采用中位数而非均值填充
- 使用更稳健的异常值检测方法
代码实现完整流程
# 完整数据清洗流程
import pandas as pd
from sklearn.impute import KNNImputer
from scipy import stats
# 1. 加载数据
data = pd.read_csv('fetal-health.csv')
# 2. 缺失值处理
# 2.1 分析缺失比例
missing_ratio = data.isnull().mean() * 100
# 2.2 对高缺失特征考虑删除
cols_to_drop = missing_ratio[missing_ratio > 30].index
data = data.drop(columns=cols_to_drop)
# 2.3 KNN 填充
imputer = KNNImputer(n_neighbors=5)
data_imputed = pd.DataFrame(imputer.fit_transform(data), columns=data.columns)
# 3. 异常值处理
# 3.1 Z-score 检测
z_scores = stats.zscore(data_imputed.select_dtypes(include='number'))
outliers = (abs(z_scores) > 3).any(axis=1)
# 3.2 替换为分位数边界
for col in data_imputed.select_dtypes(include='number'):
q1 = data_imputed[col].quantile(0.25)
q3 = data_imputed[col].quantile(0.75)
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
data_imputed[col] = data_imputed[col].clip(lower, upper)
避坑指南
- 不要过度删除 :当缺失值比例 <30% 时,优先考虑填充而非删除
- 区分特征类型 :分类特征使用众数填充,连续特征使用中位数 /KNN
- 检查分布一致性 :处理前后对比特征分布,避免引入偏差
延伸思考
- 当某个特征的缺失值超过 30% 时,是否应该直接删除?
- 需考虑该特征的重要性,可通过相关性分析决定
- 如何处理类别不平衡问题?
- 可尝试 SMOTE 过采样方法
from imblearn.over_sampling import SMOTE smote = SMOTE() X_res, y_res = smote.fit_resample(X, y)
总结
通过系统的缺失值和异常值处理,能显著提升胎儿健康数据的质量。本文介绍的方法不仅适用于医疗数据,也可迁移到其他领域的数据预处理工作中。关键是根据数据特点选择合适的方法,并在处理前后进行充分验证。
正文完
发表至: 未分类
近一天内
