共计 2309 个字符,预计需要花费 6 分钟才能阅读完成。
胎儿健康数据分析实战:从数据清洗到建模优化的完整流程
在产科临床实践中,胎心监护、宫缩压力等指标的监测数据是评估胎儿健康状况的重要依据。然而实际医疗数据往往存在质量参差不齐、样本分布不均衡等问题,直接影响后续建模的可靠性。本文将针对这些痛点,通过 Python 工具链演示完整的解决方案。

数据清洗:构建可靠的分析基础
缺失值处理策略对比
医疗设备采集中断或记录疏漏常导致数据缺失。我们首先加载数据集并分析缺失情况:
import pandas as pd
df = pd.read_csv('fetal-health.csv')
print(df.isnull().sum().sort_values(ascending=False))
对于缺失值处理,不同策略适用不同场景:
-
删除记录:当缺失比例 <5% 且随机分布时适用
df_drop = df.dropna() -
均值填充:适用于连续型生理指标
from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') df[['baseline_value', 'accelerations']] = imputer.fit_transform(df[['baseline_value', 'accelerations']]) -
众数填充:适用于分类特征如
fetal_movement
异常值检测与医学合理性校验
使用箱线图识别数值异常点后,必须结合医学知识判断:
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(12,6))
sns.boxplot(data=df[['baseline_value', 'accelerations']])
plt.title('Boxplot of Key Features')
plt.show()
例如胎心率基线正常范围是 110-160bpm,超出此范围的记录需要:
- 核对原始设备日志确认是否采集错误
- 咨询临床医师判断是否病理状态
- 对确认的异常值采用 Winsorization 缩尾处理
特征工程:为建模准备优质输入
数据标准化
不同生理指标量纲差异显著,需进行标准化:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
num_features = ['baseline_value', 'accelerations', 'uterine_contractions']
df[num_features] = scaler.fit_transform(df[num_features])
类别特征编码
对于 fetal_movement 等分类变量:
-
LabelEncoder:适用于有序分类(如胎动频率:无 / 少 / 正常 / 多)
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() df['movement_encoded'] = le.fit_transform(df['fetal_movement']) -
OneHotEncoder:适用于无序分类(如孕妇血型)
from sklearn.preprocessing import OneHotEncoder ohe = OneHotEncoder() movement_ohe = ohe.fit_transform(df[['fetal_movement']]).toarray()
建模优化:应对样本不均衡挑战
SMOTE 过采样技术
原始数据中健康样本占多数会导致模型偏见:
from imblearn.over_sampling import SMOTE
X = df.drop('fetal_health', axis=1)
y = df['fetal_health']
smote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(X, y)
随机森林参数调优
通过网格搜索寻找最优超参数组合:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
param_grid = {'n_estimators': [100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5]
}
rf = RandomForestClassifier()
grid_search = GridSearchCV(rf, param_grid, cv=5, scoring='f1_macro')
grid_search.fit(X_res, y_res)
print(f"Best params: {grid_search.best_params_}")
print(f"Best F1-score: {grid_search.best_score_:.3f}")
医疗数据分析特别注意事项
- 隐私保护:
- 删除所有 PII(个人身份信息)
-
对罕见病例进行 k -anonymity 处理
-
特征相关性分析:
- 避免仅依赖统计显著性,需结合临床意义
- 警惕多重共线性(如宫缩频率与持续时间)
延伸思考
构建临床可用系统还需考虑:
– 如何将模型封装为 API 供 HIS 系统调用
– 实时数据流的处理方案
– 模型解释性报告生成(SHAP/LIME)
通过本文流程,我们实现了从原始数据到优化模型的完整链路。医疗数据分析的特殊性要求我们既要掌握技术工具,也要理解临床逻辑,这正是该领域最迷人的挑战。
正文完
发表至: 未分类
近两天内
