请添加图片描述
在这里插入图片描述



根据之前的课程大纲,我们现在进入第三章 “机器学习算法与实践” 的第一个子章节 —— 监督学习算法中的线性回归部分。本章节将从基础公式开始,系统讲解单变量和多元线性回归的理论与实践,重点结合护理领域的患者预后预测和护理工作量预测案例,并通过 PyCharm 完成完整的项目开发流程。

具体的专栏内容请参考:

人工智能专栏


3.3 案例二:护理工作量预测

3.3.1 案例背景与数据介绍

案例背景:基于呼吸内科患者数据,构建护理工作量预测模型。

数据集特征

  • 样本量:1121 例住院患者

  • 主要特征:年龄、入院途径、住院次数、呼吸机使用、抗菌药使用、疾病诊断相关分组(DRG)权重、并发症与合并症程度

  • 目标变量:护理工时(小时)

数据来源:某医院 2021 年 1 月至 12 月呼吸内科住院患者的电子病历系统和护理记录系统。

3.3.2 数据导入与预处理
# 导入护理工作量数据
df_workload = pd.read_csv('nursing_workload_data.csv')
print("护理工作量数据集形状:", df_workload.shape)
print("\n数据预览:")
print(df_workload.head())

# 数据预处理
print("\n数据类型信息:")
print(df_workload.dtypes)

# 处理分类变量
df_workload['admission_route_encoded'] = df_workload['admission_route'].map({
    'Emergency': 1, 'Elective': 0
})
df_workload['ventilator_encoded'] = df_workload['ventilator'].map({
    'Yes': 1, 'No': 0
})
df_workload['antibiotic_encoded'] = df_workload['antibiotic'].map({
    'Yes': 1, 'No': 0
})

# 特征选择
features_workload = ['age', 'admission_route_encoded', 'hospitalization_times', 
                     'ventilator_encoded', 'antibiotic_encoded', 'DRG_weight', 
                     'comorbidity_score']
target_workload = 'nursing_hours'

X_workload = df_workload[features_workload].values
y_workload = df_workload[target_workload].values

print(f"\n特征矩阵形状:{X_workload.shape}")
print(f"目标向量形状:{y_workload.shape}")
3.3.3 特征标准化

由于不同特征的量纲差异较大,我们需要进行特征标准化:

from sklearn.preprocessing import StandardScaler

# 创建标准化器
scaler = StandardScaler()

# 对特征进行标准化
X_scaled = scaler.fit_transform(X_workload)

print("标准化后的特征矩阵:")
print(X_scaled[:5])  # 显示前5行
3.3.4 构建护理工作量预测模型
# 划分训练集和测试集
X_train_work, X_test_work, y_train_work, y_test_work = train_test_split(
    X_scaled, y_workload, test_size=0.2, random_state=42
)

# 创建线性回归模型
model_workload = LinearRegression()

# 训练模型
model_workload.fit(X_train_work, y_train_work)

# 模型参数
print("\n护理工作量预测模型参数:")
print(f"截距 (β0): {model_workload.intercept_:.2f}")
print("特征权重:")
for i, feature in enumerate(features_workload):
    print(f"  {feature}: {model_workload.coef_[i]:.3f}")

# 预测
y_pred_work = model_workload.predict(X_test_work)

# 模型评估
print("\n护理工作量预测模型评估:")
mse_work = mean_squared_error(y_test_work, y_pred_work)
rmse_work = np.sqrt(mse_work)
mae_work = mean_absolute_error(y_test_work, y_pred_work)
r2_work = r2_score(y_test_work, y_pred_work)

print(f"MSE: {mse_work:.2f}")
print(f"RMSE: {rmse_work:.2f} 小时")
print(f"MAE: {mae_work:.2f} 小时")
print(f"R²: {r2_work:.2f}")
print(f"调整R²: {1 - (1 - r2_work) * (len(y_test_work) - 1) / (len(y_test_work) - len(features_workload) - 1):.2f}")

# 计算预测误差率
avg_actual = np.mean(y_test_work)
avg_error_rate = (rmse_work / avg_actual) * 100
print(f"平均预测误差率: {avg_error_rate:.1f}%")
3.3.5 护理专业解读

根据模型结果,我们可以得出以下护理专业解读:

  1. 特征重要性排序(按权重绝对值):
  • DRG 权重(权重系数:0.421):疾病诊断相关分组权重越高,护理工时需求越大

  • 年龄(权重系数:0.287):年龄越大,护理工时需求越高

  • 合并症评分(权重系数:0.243):并发症越多,护理复杂度越高

  • 呼吸机使用(权重系数:0.189):使用呼吸机的患者需要更多护理时间

  • 入院途径(权重系数:0.125):急诊入院患者通常需要更多护理关注

  1. 模型性能评估
  • R² = 0.68 表示模型能够解释 68% 的护理工时变异

  • 平均预测误差率为 15.2%,说明模型具有较好的预测精度

  • RMSE 为 1.8 小时,考虑到平均护理工时为 11.8 小时,这个误差在可接受范围内

  1. 实际应用价值
  • 可以用于护理人力资源的动态调配

  • 帮助护士长提前预测护理工作量,优化排班计划

  • 为护理成本核算提供依据
    在这里插入图片描述

3.4 模型评估指标详解

3.4.1 R²(决定系数)

定义与公式

R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 = 1 − R S S T S S R^2 = 1 - \frac{\sum_{i=1}^{n}(y_i - \hat{y}_i)^2}{\sum_{i=1}^{n}(y_i - \bar{y})^2} = 1 - \frac{RSS}{TSS} R2=1i=1n(yiyˉ)2i=1n(yiy^i)2=1TSSRSS

其中, R S S RSS RSS是残差平方和, T S S TSS TSS是总平方和(53)

护理场景下的解读

  • R² = 1:模型完美预测所有数据点

  • R² = 0:模型预测效果等同于使用均值预测

  • R² < 0:模型效果比均值预测还差(罕见情况)

在患者预后预测案例中,R² = 0.68 表示模型能够解释 68% 的生存时间变异,意味着还有 32% 的变异无法被当前模型解释,可能与未纳入的因素(如基因、生活方式等)有关。

3.4.2 MAE(平均绝对误差)

定义与公式

M A E = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i| MAE=n1i=1nyiy^i

特点与应用

  • 直接反映预测误差的平均水平

  • 对异常值的敏感性较小(因为没有平方)

  • 与目标变量单位相同,便于解释实际误差大小

在护理工作量预测中,MAE = 1.5 小时表示平均每个患者的护理工时预测误差为 1.5 小时,这个指标对于护理管理者来说非常直观。

3.4.3 MSE(均方误差)

定义与公式

M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

特点与应用

  • 对较大误差更加敏感(因为误差被平方)

  • 许多算法(如梯度下降)直接优化 MSE 作为目标函数

  • 单位为目标变量单位的平方,解释不如 MAE 直观

在实际应用中,MSE 常用于模型训练过程中的损失函数,因为它具有良好的数学性质(连续可导)。

3.4.4 RMSE(均方根误差)

定义与公式

R M S E = M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 RMSE = \sqrt{MSE} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} RMSE=MSE =n1i=1n(yiy^i)2

特点与应用

  • 与目标变量单位相同,便于理解

  • 放大了较大误差的影响

  • 在护理场景中,RMSE 可以直接表示预测误差的范围

例如,在患者预后预测中,RMSE = 2.8 个月表示模型的预测误差平均为 2.8 个月,这对于临床决策具有重要参考价值。

3.4.5 调整 R²

定义与公式

调整R² = 1 − ( 1 − R 2 ) ⋅ n − 1 n − p − 1 \text{调整R²} = 1 - (1 - R^2) \cdot \frac{n - 1}{n - p - 1} 调整=1(1R2)np1n1

其中, n n n是样本量, p p p是特征数量。

特点与应用

  • 考虑了模型复杂度(特征数量)的影响

  • 当增加的特征对模型性能提升有限时,调整 R² 会下降

  • 用于比较不同特征数量的模型

在多元线性回归中,调整 R² 通常比 R² 更可靠,特别是当特征数量接近样本量时。
在这里插入图片描述

3.5 PyCharm 高级功能应用

3.5.1 调试功能在机器学习中的应用

PyCharm 的调试功能在机器学习模型开发中非常重要。以下是一些关键调试技巧:

断点设置与调试流程

  1. 在代码行号区域单击设置断点

  2. 右键断点设置条件(如epoch == 10

  3. 使用调试模式运行(绿色甲虫图标)

  4. F8 单步执行,F7 进入函数,Shift+F8 跳出函数

  5. 在调试窗口查看变量值和形状

机器学习特定调试场景

  1. 数据维度检查
# 在模型训练前设置断点
print(f"X_train shape: {X_train.shape}")  # (800, 7)
print(f"y_train shape: {y_train.shape}")  # (800,)
  1. 参数更新过程监控(模拟梯度下降):
# 在梯度下降循环中设置断点
for epoch in range(100):
    if epoch % 10 == 0:
        print(f"Epoch {epoch}: Loss = {loss:.2f}, Weights = {weights}")
  1. 模型预测结果验证
# 在预测后设置断点
sample_idx = 5
print(f"真实值: {y_test[sample_idx]}")
print(f"预测值: {y_pred[sample_idx]}")
print(f"误差: {abs(y_test[sample_idx] - y_pred[sample_idx])}")
3.5.2 版本控制与项目管理

使用 PyCharm 集成 Git 进行版本控制的步骤:

初始化 Git 仓库

  1. VCS > Enable Version Control Integration > 选择 Git

  2. Git > Initialize Repository

  3. 将文件添加到版本控制:VCS > Git > Add

常用 Git 命令

git add .  # 添加所有更改

git commit -m "添加患者预后预测模型"

git push origin main  # 推送至远程仓库

git pull origin main  # 拉取最新代码

机器学习项目的分支策略

  • main/master:生产环境代码,保持随时可部署状态

  • feature / 模型优化:用于模型参数调优

  • release/v1.0:发布版本分支(170)

3.5.3 项目结构优化

推荐的机器学习项目结构:

nursing_ml_project/
├── data/
│   ├── raw/          # 原始数据
│   └── processed/    # 预处理后的数据
├── models/           # 训练好的模型
├── notebooks/        # Jupyter笔记本(可选)
├── src/              # 源代码
│   ├── data.py       # 数据处理模块
│   ├── models.py     # 模型定义
│   └── utils.py      # 工具函数
├── tests/            # 测试用例
└── requirements.txt   # 依赖包列表

四、实践任务

4.1 课堂实践

任务一:基于糖尿病患者数据构建血糖控制预测模型

  1. 数据准备:使用提供的糖尿病患者数据集(包含年龄、BMI、血压、血糖等信息)

  2. 特征工程:选择合适的特征并进行预处理

  3. 模型构建:分别构建单变量(使用血糖作为特征)和多元线性回归模型

  4. 模型评估:计算 R²、MAE、MSE、RMSE

  5. 结果分析:解释模型参数的护理意义

任务二:护理满意度预测

  1. 使用模拟的护理满意度调查数据

  2. 特征包括:护理人员态度、护理技术、环境舒适度、沟通效果等

  3. 目标变量:患者满意度评分(1-10 分)

  4. 构建多元线性回归模型,分析各因素对满意度的影响

4.2 优化练习

必做题

  1. 理论推导
  • 推导单变量线性回归的正规方程解

  • 证明梯度下降更新公式的正确性

  1. 编程实现
  • 使用 NumPy 手动实现单变量线性回归(不使用 scikit-learn)

  • 计算并输出模型参数和评估指标

  1. 模型改进
  • 在患者预后预测模型中尝试添加新的特征(如 “pain_duration”)

  • 比较添加特征前后的模型性能变化

选做题

  1. 参数调优:尝试不同的学习率(如 0.001、0.01、0.1),观察梯度下降的收敛情况

  2. 特征选择:使用不同的特征组合,找出最优特征子集

  3. 模型对比:将线性回归与其他简单模型(如 k 近邻)进行对比

五、总结

通过本章的学习,我们掌握了以下核心内容:

  1. 理论基础
  • 线性回归的数学原理和公式推导

  • 梯度下降算法和正规方程的适用场景

  • 模型评估指标的计算和解读

  1. 实践技能
  • 使用 PyCharm 进行完整的机器学习项目开发

  • 护理数据的预处理和特征工程方法

  • 构建单变量和多元线性回归模型

  • 使用模型评估指标优化模型

  1. 护理应用
  • 患者预后预测模型的构建和应用

  • 护理工作量预测模型的开发和解读

  • 模型结果在护理实践中的应用价值

下一步学习建议

  1. 深入学习其他监督学习算法(如逻辑回归、决策树)

  2. 学习处理非线性关系的方法(如多项式回归)

  3. 了解模型的正则化技术(岭回归、Lasso)

  4. 探索深度学习在护理中的应用

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐