胎儿健康数据分析实战:从数据清洗到建模优化的完整流程

1次阅读
没有评论

共计 2649 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景介绍

胎儿健康预测在临床医学中具有重要意义。通过对胎儿心率、宫缩等指标的分析,医生可以提前发现潜在风险,及时采取干预措施。然而,这类数据通常存在以下挑战:

胎儿健康数据分析实战:从数据清洗到建模优化的完整流程

  • 数据采集过程中容易产生缺失值
  • 不同检测设备导致的数据尺度差异
  • 异常样本(如极端值)干扰模型训练
  • 正负样本比例不平衡

数据探索

首先我们加载数据并查看基本信息:

import pandas as pd
import matplotlib.pyplot as plt

# 加载数据
data = pd.read_csv('fetal-health.csv')

# 查看数据概览
print(data.info())
print(data.describe())

# 绘制缺失值热图
plt.figure(figsize=(10,6))
sns.heatmap(data.isnull(), cbar=False)
plt.title('缺失值分布')
plt.show()

通过上述代码,我们可以快速了解:

  1. 数据集包含 2126 个样本和 22 个特征
  2. 目标变量是 fetal_health,分为 3 个类别
  3. 部分特征存在缺失值
  4. 各特征的数值范围差异较大

数据预处理

缺失值处理

常见的缺失值处理策略有三种:

  1. 直接删除:适合缺失比例很小的特征

    # 删除缺失值超过 5% 的特征
    data = data.dropna(thresh=len(data)*0.95, axis=1)

  2. 均值 / 中位数填充:适合数值型特征

    from sklearn.impute import SimpleImputer
    
    imputer = SimpleImputer(strategy='median')
    data[['feature1','feature2']] = imputer.fit_transform(data[['feature1','feature2']])

  3. 模型预测填充:适合与其他特征相关性强的缺失值

    from sklearn.ensemble import RandomForestRegressor
    
    # 构建预测模型填充缺失值
    # 此处省略具体实现代码 

异常值检测

使用 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

# 标记异常值
outliers = ((data < lower_bound) | (data > upper_bound)).any(axis=1)
data_clean = data[~outliers]

特征工程

  1. 标准化处理:

    from sklearn.preprocessing import StandardScaler
    
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)

  2. 特征选择:

    from sklearn.feature_selection import SelectKBest, f_classif
    
    selector = SelectKBest(f_classif, k=10)
    X_selected = selector.fit_transform(X_scaled, y)

建模实战

模型构建

我们对比三种常见算法:

  1. 逻辑回归(基础模型)

    from sklearn.linear_model import LogisticRegression
    
    lr = LogisticRegression(max_iter=1000)
    lr.fit(X_train, y_train)

  2. 随机森林(集成方法)

    from sklearn.ensemble import RandomForestClassifier
    
    rf = RandomForestClassifier(n_estimators=100)
    rf.fit(X_train, y_train)

  3. XGBoost(提升树)

    from xgboost import XGBClassifier
    
    xgb = XGBClassifier()
    xgb.fit(X_train, y_train)

模型评估

使用交叉验证评估模型性能:

from sklearn.model_selection import cross_val_score

# 评估指标
scoring = ['accuracy','f1_macro','recall_macro']

# 交叉验证
lr_scores = cross_val_score(lr, X, y, cv=5, scoring=scoring)
rf_scores = cross_val_score(rf, X, y, cv=5, scoring=scoring)
xgb_scores = cross_val_score(xgb, X, y, cv=5, scoring=scoring)

模型性能对比:

模型 准确率 F1-score 召回率
逻辑回归 0.78 0.76 0.75
随机森林 0.85 0.83 0.82
XGBoost 0.87 0.85 0.84

避坑指南

数据泄露预防

常见问题:

  • 在预处理阶段使用了全部数据
  • 特征选择时包含了测试集信息

解决方案:

from sklearn.pipeline import Pipeline

# 将预处理和建模封装为 Pipeline
pipe = Pipeline([('scaler', StandardScaler()),
    ('selector', SelectKBest(f_classif, k=10)),
    ('classifier', XGBClassifier())
])

# 这样能确保预处理只使用训练数据
pipe.fit(X_train, y_train)

类别不平衡处理

  1. 重采样方法:

    from imblearn.over_sampling import SMOTE
    
    smote = SMOTE()
    X_res, y_res = smote.fit_resample(X, y)

  2. 类别权重调整:

    model = XGBClassifier(scale_pos_weight=ratio)

生产环境优化

  1. 内存优化:

    # 使用稀疏矩阵
    from scipy.sparse import csr_matrix
    X_sparse = csr_matrix(X)

  2. 模型剪枝:

    xgb = XGBClassifier(max_depth=3, n_estimators=50)

延伸思考

  1. 如何设计特征交叉提升模型性能?
  2. 针对实时预测场景,如何优化模型推理速度?
  3. 当新增监测设备导致数据分布变化时,如何持续优化模型?

通过这个完整流程,我们实现了从原始数据到预测模型的转化。希望这份指南能帮助初学者快速掌握胎儿健康数据分析的核心技能。

正文完
 0
评论(没有评论)