在云主机中实现基于随机森林模型的胎儿健康分类:利用胎心宫缩监护图(CTG)数据进行机器学习预测

1 概述

1.1背景介绍

胎儿健康监测是围产期医学的核心环节,胎心宫缩监护图(CTG)作为临床常规监测手段,通过分析胎儿心率、宫缩强度等21项生理指标评估胎儿状态。传统CTG解读依赖产科医生经验判断,存在观性强、效率低、漏诊风险高的问题。随着医疗数据量激增,如何利用机器学习技术实现自动化胎儿健康分级成为产科智能化转型的重要方向。 数据科学价值 1. 自动化特征工程,通过标准化处理消除量纲差异,利用箱线图、热力图识别关键特征(如abnormal_short_term_variability对分类贡献度达19.2%)。
2. 模型优化突破,经网格搜索调参的随机森林模型准确率达94.8%,较基线逻辑回归提升5.1个百分点,病理类F1-score达0.90。
3. 流程效率革命,将传统人工解读流程从15分钟/例压缩至秒级,实现全天候实时监测。

1.2适用对象

  • 个人开发者
  • 高校学生
  • 智慧医疗

1.3案例时间

本案例总时长预计90分钟

1.4案例流程

微信图片_20250327122932.jpg 说明: ①配置开发环境 ②从OBS下载本地文件 ③在CodeArts IDE for python编辑脚本

1.5资源总览

本案例预计花费总计0元 |资源名称|规格|单价(元)|时长(分钟)| |-|-|-|-| |开发者空间-云主机|4vCPUs-8GB ARM Ubuntu Ubuntu 24.04 Server 定制版|免费|90|

2 操作步骤

2.1进入华为云主机

在浏览器输入开发者空间地址,进行登录。选择工作台-我的云主机。点击进入桌面。 如果没有配置主机需要对主机进行配置,相关信息如下图: 屏幕截图 2025-04-04 002433.png 点击安装后进入云主机-进入桌面 屏幕截图 2025-03-06 144534.png 进入华为主机桌面。屏幕截图 2025-03-06 144608.png

2.2下载本地数据

为了方便项目运行我们事先将案例所使用到的数据集参考Fetal Health Classification案例使用对象存储服务OBS,创建桶存储到华为云存储空间中,在后续实验中可以通过链接在华为云主机中进行下载使用。屏幕截图 2025-03-26 233900.png 将复制的链接粘贴在网页上,点击下载。 屏幕截图 2025-03-18 165038.png 数据集示例 image.png

同上述方法下载脚本链接 image.png image.png 案例示例 image.png case1的导入主要目的是避免手动输入代码的过程中出现错误,可以根据case1的内容进行下一步的代码修改。

2.3编辑运行脚本

打开华为云桌面上的CodeArts IDE for Python,选择打开工程,打开刚才下载好的脚本参考Fetal Health Classification案例脚本和数据集。屏幕截图 2025-03-26 234232.png 新建工程,将脚本和数据集放入工程目录下。 屏幕截图 2025-03-18 200724.png

2.4创建和配置虚拟环境

新打开的CodeArts IDE for Python需要下载所需要的第三方库,在下载第三方库时需要在终端进行安装,并配置虚拟环境。

首先安装虚拟环境工具sudo apt-get install python3-venv 创建新的虚拟环境名字叫myenvpython3.12 -m venv myenv 激活虚拟环境source myenv/bin/activate 当看到图中的myenv时即激活成功:屏幕截图 2025-03-26 235632.png 后续进行第三方库的安装安装总代码中的第三方库的方式

pip install numpy
pip install pandas
pip install matplotlib
pip install scikit-learn
pip install seaborn

注意,sklearn库如果安装失败可以使用国内镜像和最新库名进行安装:pip install scikit-learn-i https://pypi.tuna.tsinghua.edu.cn/simple 如下图安装numpy库成功 d917a4c363e7bb7841664672a869a43.png 如下图安装pandas库成功 20722bcd6c1f75b134faa07c258b3c5.png 如下图安装matplotlib库成功 1335e066d0083a61e2e7606e9c5669f.png 如下图安装sklearn库成功 image.png 如下图安装seaborn库成功 image.png 安装成功后对脚本进行运行可得到关于Python数据处理全流程开发、医疗领域分类模型构建核心方法,并具备将本地模型迁移至华为云实现工业级部署的能力。

结果总代码展示

总代码展示,直接在控制台中进行运行展示: ``` # 导入所需的库 import numpy as np

导入numpy库,用于数值计算

import pandas as pd

导入pandas库,用于数据处理和分析

import matplotlib.pyplot as plt

导入matplotlib.pyplot库,用于绘制图形

import seaborn as sns

导入seaborn库,用于绘制统计图表

from sklearn.model_selection import train_test_split

导入train_test_split函数,用于划分训练集和测试集

from sklearn import preprocessing

导入preprocessing模块,用于数据预处理

from sklearn.preprocessing import StandardScaler

导入StandardScaler类,用于标准化数据

from sklearn.pipeline import Pipeline

导入Pipeline类,用于构建机器学习管道

from sklearn.linear_model import LogisticRegression

导入LogisticRegression类,用于逻辑回归模型

from sklearn.tree import DecisionTreeClassifier

导入DecisionTreeClassifier类,用于决策树分类器

from sklearn.ensemble import RandomForestClassifier

导入RandomForestClassifier类,用于随机森林分类器

from sklearn.svm import SVC

导入SVC类,用于支持向量机分类器

from sklearn.svm import LinearSVC

导入LinearSVC类,用于线性支持向量机分类器

from sklearn.model_selection import GridSearchCV

导入GridSearchCV类,用于网格搜索参数优化

from sklearn.model_selection import cross_val_score

导入cross_val_score函数,用于交叉验证

from sklearn.metrics import precision_score, recall_score, confusion_matrix, classification_report, accuracy_score, f1_score

导入评估指标函数

from sklearn import metrics

导入metrics模块,用于评估模型性能

from sklearn.metrics import roc_curve, auc, roc_auc_score import numpy

导入ROC曲线相关函数

np.random.seed(0)

设置随机种子,确保结果的可重复性

np.random.seed(0)

设置随机种子,确保结果的可重复性

data = pd.read_csv("/home/developer/Downloads/case-data.csv") data.head() data.info() data.describe().T

首先,我们来评估目标变量(fetal_health),并判断数据是否不平衡

colours = ["#f7b2b0", "#8f7198", "#003f5c"] # 定义颜色列表,用于绘制图形 sns.countplot(data=data, x="fetal_health", palette=colours) # 使用Seaborn的countplot绘制目标变量的计数图

参数说明:

data:数据集

x:指定要绘制的列(这里是目标变量"fetal_health")

palette:指定颜色主题

plt.savefig("fetal_health_countplot.png") # 保存图形 plt.close() # 关闭图形窗口

计算相关性矩阵

corrmat = data.corr()

设置图形的大小

plt.figure(figsize=(15, 15))

定义颜色映射

cmap = sns.diverging_palette(250, 10, s=80, l=55, n=9, as_cmap=True)

绘制热力图

sns.heatmap(corrmat, annot=True, cmap=cmap, center=0) plt.savefig("correlation_matrix_heatmap.png") # 保存图形 plt.close()

使用Seaborn的lmplot绘制散点图并拟合回归线

sns.lmplot(data=data, x="accelerations", y="fetal_movement", palette=colours, hue="fetal_health", legend_out=False)

参数说明:

data=data:指定数据集

x="accelerations":指定x轴的特征为"accelerations"(每秒加速次数)

y="fetal_movement":指定y轴的特征为"fetal_movement"(每秒胎儿活动次数)

palette=colours:指定颜色主题,使用之前定义的colours列表

hue="fetal_health":根据目标变量"fetal_health"(胎儿健康状况)对数据进行分组并着色

legend_out=False:将图例放置在图形内部,而不是默认的外部位置

plt.savefig("accelerations_vs_fetal_movement.png") # 保存图形 plt.close()

使用Seaborn的lmplot函数绘制散点图,并拟合回归线

sns.lmplot(data=data, # 指定数据集 x="prolongued_decelerations", # 指定x轴变量:延长减速次数 y="fetal_movement", # 指定y轴变量:胎儿活动次数 palette=colours, # 使用之前定义的颜色列表colours hue="fetal_health", # 按照目标变量"fetal_health"(胎儿健康状况)对数据进行分组并着色 legend_out=False) # 将图例放置在图形内部,而不是外部 plt.savefig("prolongued_decelerations_vs_fetal_movement.png") # 保存图形 plt.close()

使用Seaborn的lmplot函数绘制数据的线性模型图

sns.lmplot(data=data, # 指定数据集 x="abnormal_short_term_variability", # 指定x轴变量:异常短期变异的时间百分比 y="fetal_movement", # 指定y轴变量:胎儿活动次数 palette=colours, # 使用之前定义的颜色列表colours来区分不同的类别 hue="fetal_health", # 指定按目标变量"fetal_health"(胎儿健康状况)进行分组并着色 legend_out=False) # 将图例放置在图形内部,而不是外部 plt.savefig("abnormal_short_term_variability_vs_fetal_movement.png") # 保存图形 plt.close()

使用Seaborn的lmplot函数绘制散点图并拟合回归线

sns.lmplot(data=data, # 指定数据集 x="mean_value_of_long_term_variability", # 指定x轴变量:长期变异的平均值 y="fetal_movement", # 指定y轴变量:胎儿活动次数 palette=colours, # 指定颜色主题,使用之前定义的颜色列表 hue="fetal_health", # 指定按目标变量"fetal_health"分类并着色 legend_out=False) # 将图例放置在图形内部 plt.savefig("mean_value_of_long_term_variability_vs_fetal_movement.png") # 保存图形 plt.close()

使用Seaborn的lmplot函数绘制散点图并拟合回归线

sns.lmplot(data=data, # 指定数据集 x="mean_value_of_long_term_variability", # 指定x轴变量:长期变异的平均值 y="fetal_movement", # 指定y轴变量:胎儿活动次数 palette=colours, # 指定颜色主题,使用之前定义的颜色列表 hue="fetal_health", # 指定按目标变量"fetal_health"分类并着色 legend_out=False) # 将图例放置在图形内部 plt.savefig("mean_value_of_long_term_variability_featal_health")

定义需要进行详细可视化分析的特征列

cols = [ 'baseline value', # 胎儿心率基线值(每分钟跳动次数) 'accelerations', # 每秒加速次数 'fetal_movement', # 每秒胎儿活动次数 'uterine_contractions', # 每秒子宫收缩次数 'light_decelerations', # 每秒轻度减速次数 'severe_decelerations', # 每秒重度减速次数 'prolongued_decelerations', # 每秒延长减速次数 'abnormal_short_term_variability', # 异常短期变异的时间百分比 'mean_value_of_short_term_variability', # 短期变异的平均值 'percentage_of_time_with_abnormal_long_term_variability', # 异常长期变异的时间百分比 'mean_value_of_long_term_variability' # 长期变异的平均值 ]

遍历特征列列表(假设cols是包含特征列名的列表)

for i in cols: # 绘制蜂群图(Swarm Plot) sns.swarmplot(x=data["fetal_health"], y=data[i], color="black", alpha=0.5) # 参数说明: # x=data["fetal_health"]:指定x轴为目标变量(胎儿健康状态) # y=data[i]:指定y轴为当前遍历的特征列 # color="black":设置点的颜色为黑色 # alpha=0.5:设置点的透明度为0.5,便于观察重叠的点

# 绘制箱线图(Boxen Plot)
sns.boxenplot(x=data["fetal_health"], y=data[i], palette=colours)
# 参数说明:
# x=data["fetal_health"]:指定x轴为目标变量(胎儿健康状态)
# y=data[i]:指定y轴为当前遍历的特征列
# palette=colours:使用之前定义的颜色列表colours为箱线图的每个类别分配颜色
plt.savefig(f"swarmplot_and_boxenplot_{i}.png")  # 保存图形
# 每次循环绘制完一个特征的蜂群图和箱线图后,调用plt.show()显示图形
# 这样可以逐个查看每个特征与目标变量之间的关系
# 定义颜色列表,用于绘制箱线图
shades = ["#f7b2b0", "#c98ea6", "#8f7198", "#50587f", "#003f5c"]

# 设置图形的大小为20×10英寸,以便更好地展示箱线图
plt.figure(figsize=(20, 10))

# 使用Seaborn的boxenplot绘制箱线图
sns.boxenplot(data=data, palette=shades)
# 参数说明:
# data:指定要绘制的数据集
# palette:指定颜色主题,使用之前定义的shades颜色列表

# 将x轴的标签旋转90度,以便标签文字不会重叠,更易于阅读
plt.xticks(rotation=90)

plt.savefig("p1")  # 保存图形
plt.close()
# 将特征值赋给变量X,目标值赋给变量y
X = data.drop(["fetal_health"], axis=1)  # 从数据集中删除目标列"fetal_health",剩余的列作为特征X
y = data["fetal_health"]  # 提取目标列"fetal_health"作为目标变量y
# 为特征设置一个标准化器
col_names = list(X.columns)  # 获取特征列的名称,用于后续DataFrame的列名
s_scaler = preprocessing.StandardScaler()  # 创建一个StandardScaler对象,用于标准化特征
X_df = s_scaler.fit_transform(X)  # 对特征X进行标准化处理,将数据转换为均值为0、标准差为1的形式
X_df = pd.DataFrame(X_df, columns=col_names)  # 将标准化后的数据转换为DataFrame,并保留原始列名
X_df.describe().T  # 调用describe方法,生成标准化后的特征数据的描述性统计信息,并转置以便于查看
# 查看标准化后的特征分布情况
plt.figure(figsize=(20, 10))  # 设置图形的大小为20×10英寸,以便更好地展示特征分布
sns.boxenplot(data=X_df, palette=shades)  # 使用Seaborn的boxenplot绘制箱线图,展示每个特征的分布情况
# 参数说明:
# data=X_df:指定数据集,X_df是包含标准化后特征的DataFrame
# palette=shades:指定颜色主题,使用之前定义的shades颜色列表

plt.xticks(rotation=90)  # 将x轴的标签旋转90度,避免标签重叠,使标签更易于阅读
plt.savefig("p")  # 保存图形
plt.close()
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_df, y, test_size=0.3, random_state=42)
# 快速模型选择过程
# 构建模型的管道(管道是一种简洁的方式,用于拟合和预测)

# 构建逻辑回归模型的管道
pipeline_lr = Pipeline([('lr_classifier', LogisticRegression(random_state=42))])
# 使用Pipeline封装逻辑回归模型,便于后续的拟合和预测

# 构建决策树模型的管道
pipeline_dt = Pipeline([('dt_classifier', DecisionTreeClassifier(random_state=42))])
# 使用Pipeline封装决策树模型

# 构建随机森林模型的管道
pipeline_rf = Pipeline([('rf_classifier', RandomForestClassifier())])
# 使用Pipeline封装随机森林模型

# 构建支持向量机模型的管道
pipeline_svc = Pipeline([('sv_classifier', SVC())])
# 使用Pipeline封装支持向量机模型

# 将所有管道存储在一个列表中
pipelines = [pipeline_lr, pipeline_dt, pipeline_rf, pipeline_svc]
# 方便后续循环处理

# 创建一个字典,用于快速引用每个管道对应的模型类型
pipe_dict = {0: 'Logistic Regression', 1: 'Decision Tree', 2: 'RandomForest', 3: "SVC"}
# 键是管道在列表中的索引,值是模型的名称

# 对每个管道进行拟合(训练)
for pipe in pipelines:
    pipe.fit(X_train, y_train)
# 使用训练集数据拟合每个模型

# 使用交叉验证评估准确率
cv_results_accuracy = []  # 创建一个空列表,用于存储每个模型的交叉验证结果
for j, model in enumerate(pipelines):  # 遍历管道列表
    cv_score = cross_val_score(model, X_train, y_train, cv=10)  # 对每个模型进行10折交叉验证
    cv_results_accuracy.append(cv_score)  # 将交叉验证结果存储到列表中
    print("%s: %f " % (pipe_dict[j], cv_score.mean()))  # 打印每个模型的平均准确率
    # 查看测试集的预测结果
    pred_rfc = pipeline_rf.predict(X_test)  # 使用随机森林管道模型对测试集进行预测
    accuracy = accuracy_score(y_test, pred_rfc)  # 计算预测结果的准确率
    print(accuracy)  # 打印准确率
    # 构建一个字典,包含将要通过GridSearchCV分析的参数及其可选值
    parameters = { 
        'n_estimators': [100, 150, 200, 500, 700, 900],  # 森林中树的数量
        'max_features': ['auto', 'sqrt', 'log2'],  # 寻找最佳分割时要考虑的特征数量
        'max_depth': [4, 6, 8, 12, 14, 16],  # 树的最大深度
        'criterion': ['gini', 'entropy'],  # 性能评估标准(基尼不纯度或信息增益)
        'n_jobs': [-1, 1, None]  # 并行作业的数量(-1表示使用所有CPU核心)
    }

    # 使用训练集拟合模型,通过GridSearchCV找到最佳参数组合
    # 以随机森林分类器(RandomForestClassifier)为例,使用5折交叉验证(cv=5)
    CV_rfc = GridSearchCV(estimator=RandomForestClassifier(), param_grid=parameters, cv=5)
    CV_rfc.fit(X_train, y_train)  # 拟合训练数据

    # 获取GridSearchCV的结果,查看最佳参数组合
    CV_rfc.best_params_  # 输出最佳参数
    # 使用网格搜索(GridSearchCV)找到的最佳参数来初始化随机森林分类器模型
    RF_model = RandomForestClassifier(**CV_rfc.best_params_)

    # 在训练集上训练随机森林模型
    RF_model.fit(X_train, y_train)

    # 在测试集上测试模型
    predictions = RF_model.predict(X_test)  # 使用训练好的模型对测试集进行预测

    # 计算模型在测试集上的准确率
    accuracy = accuracy_score(y_test, predictions)  # 使用accuracy_score函数计算准确率

    # 输出准确率
    accuracy
    # 计算分类模型的准确率(Accuracy)
    accuracy = accuracy_score(y_test, predictions)  # 使用accuracy_score函数计算测试集的真实标签(y_test)与模型预测标签(predictions)之间的准确率

    # 计算分类模型的召回率(Recall),并使用加权平均方式处理多分类问题
    recall = recall_score(y_test, predictions, average="weighted")  # 使用recall_score函数计算召回率,average="weighted"表示对每个类别的召回率进行加权平均,权重为每个类别的样本数量

    # 计算分类模型的精确率(Precision),并使用加权平均方式处理多分类问题
    precision = precision_score(y_test, predictions, average="weighted")  # 使用precision_score函数计算精确率,average="weighted"表示对每个类别的精确率进行加权平均,权重为每个类别的样本数量

    # 计算分类模型的F1分数(F1 Score),并使用微观平均方式处理多分类问题
    f1_score = f1_score(y_test, predictions, average="micro")  # 使用f1_score函数计算F1分数,average="micro"表示将所有类别的真正例、假正例和假负例汇总后计算F1分数

    # 打印随机森林模型的评估结果
    print("********* Random Forest Results *********")  # 打印标题,表明以下结果是随机森林模型的评估指标
    print("Accuracy    : ", accuracy)  # 打印准确率
    print("Recall      : ", recall)  # 打印召回率
    print("Precision   : ", precision)  # 打印精确率
    print("F1 Score    : ", f1_score)  # 打印F1分数
    print(classification_report(y_test, predictions))
    # 创建一个新的图形窗口,并设置图形的大小为12×8英寸
    plt.subplots(figsize=(12, 8))

    # 计算混淆矩阵
    cf_matrix = confusion_matrix(y_test, predictions)
    # 参数说明:
    # y_test:测试集的真实标签
    # predictions:模型预测的标签

    # 使用Seaborn绘制混淆矩阵的热力图
    sns.heatmap(cf_matrix / np.sum(cf_matrix), cmap=cmap, annot=True, annot_kws={'size': 15})
    # 参数说明:
    # cf_matrix / np.sum(cf_matrix):将混淆矩阵的每个元素除以总和,得到每个类别的比例
    # cmap=cmap:指定颜色映射,使用之前定义的颜色映射
    # annot=True:在热力图的每个单元格中显示数值

    # annot_kws={'size': 15}:设置注释的字体大小为1

```

2.5调试运行脚本

对导入的脚本进行调试,在页面右上角或快捷键shift+F9。 屏幕截图 2025-03-26 235809.png 根据调试结果对相应的代码进行修改,修改成功后,左下角屏幕截图 2025-03-26 235939.png显示为0,进行脚本运行。 屏幕截图 2025-03-27 000028.png 可在调试控制台中进行结果的查看。

2.6结果展示形式

输出的文字结果可以显示在调试控制台中: 屏幕截图 2025-03-20 100147.png 相应的生成的图片以及统计图以图片的形式保存在左侧文件中,可以手动点击进行查看。 屏幕截图 2025-03-27 000314.png 其中运行和调试控制台输出“Logistic Regression:0.8971700.9435736677115988"后不在输出图片可正常生成,为正常现象,成功生成左侧图片文件名称即为运行成功,结果为如下图即为完成,后面不再输出,大约运行时间20分钟。 image.png 其中生成的图片包括但不限于截图中所呈现的图片名称。

2.7扩展阅读与资源推荐


1. 参考书籍
  • 《Python医疗数据分析实战》(Wes McKinney & Joel Grus)
    涵盖医疗数据处理、特征工程、模型解释等全流程,特别适合医疗AI开发者。
  • 《华为云医疗AI解决方案白皮书》
    详细解读华为云在智慧医疗领域的最佳实践,包括数据安全合规、模型部署等关键技术。
  • 《胎儿监护临床指南》(FIGO官方指南)
    深入理解CTG数据的临床意义,建立数据特征与病理指征的映射关系。

2. 在线资源

3. 工具文档

学习路径建议
1. 初学者:从华为云学院微认证课程入门,掌握医疗数据处理基础。
2. 进阶者:参与Kaggle竞赛,实践从数据清洗到模型部署的全流程。
3. 专家级:研读FIGO指南与华为云白皮书,深入理解临床与技术的结合点。

温馨提示:建议在学习过程中使用华为云沙箱环境,结合实际医疗数据场景进行练习,以加速理论与实践的结合。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值