第三章_机器学习算法与实践——监督学习算法中的线性回归(二)


文章目录
根据之前的课程大纲,我们现在进入第三章 “机器学习算法与实践” 的第一个子章节 —— 监督学习算法中的线性回归部分。本章节将从基础公式开始,系统讲解单变量和多元线性回归的理论与实践,重点结合护理领域的患者预后预测和护理工作量预测案例,并通过 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 护理专业解读
根据模型结果,我们可以得出以下护理专业解读:
- 特征重要性排序(按权重绝对值):
-
DRG 权重(权重系数:0.421):疾病诊断相关分组权重越高,护理工时需求越大
-
年龄(权重系数:0.287):年龄越大,护理工时需求越高
-
合并症评分(权重系数:0.243):并发症越多,护理复杂度越高
-
呼吸机使用(权重系数:0.189):使用呼吸机的患者需要更多护理时间
-
入院途径(权重系数:0.125):急诊入院患者通常需要更多护理关注
- 模型性能评估:
-
R² = 0.68 表示模型能够解释 68% 的护理工时变异
-
平均预测误差率为 15.2%,说明模型具有较好的预测精度
-
RMSE 为 1.8 小时,考虑到平均护理工时为 11.8 小时,这个误差在可接受范围内
- 实际应用价值:
-
可以用于护理人力资源的动态调配
-
帮助护士长提前预测护理工作量,优化排班计划
-
为护理成本核算提供依据

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=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2=1−TSSRSS
其中, 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=n1∑i=1n∣yi−y^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=n1∑i=1n(yi−y^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=n1∑i=1n(yi−y^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} 调整R²=1−(1−R2)⋅n−p−1n−1
其中, n n n是样本量, p p p是特征数量。
特点与应用:
-
考虑了模型复杂度(特征数量)的影响
-
当增加的特征对模型性能提升有限时,调整 R² 会下降
-
用于比较不同特征数量的模型
在多元线性回归中,调整 R² 通常比 R² 更可靠,特别是当特征数量接近样本量时。

3.5 PyCharm 高级功能应用
3.5.1 调试功能在机器学习中的应用
PyCharm 的调试功能在机器学习模型开发中非常重要。以下是一些关键调试技巧:
断点设置与调试流程:
-
在代码行号区域单击设置断点
-
右键断点设置条件(如
epoch == 10) -
使用调试模式运行(绿色甲虫图标)
-
F8 单步执行,F7 进入函数,Shift+F8 跳出函数
-
在调试窗口查看变量值和形状
机器学习特定调试场景:
- 数据维度检查:
# 在模型训练前设置断点
print(f"X_train shape: {X_train.shape}") # (800, 7)
print(f"y_train shape: {y_train.shape}") # (800,)
- 参数更新过程监控(模拟梯度下降):
# 在梯度下降循环中设置断点
for epoch in range(100):
if epoch % 10 == 0:
print(f"Epoch {epoch}: Loss = {loss:.2f}, Weights = {weights}")
- 模型预测结果验证:
# 在预测后设置断点
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 仓库:
-
VCS > Enable Version Control Integration > 选择 Git
-
Git > Initialize Repository
-
将文件添加到版本控制: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 课堂实践
任务一:基于糖尿病患者数据构建血糖控制预测模型
-
数据准备:使用提供的糖尿病患者数据集(包含年龄、BMI、血压、血糖等信息)
-
特征工程:选择合适的特征并进行预处理
-
模型构建:分别构建单变量(使用血糖作为特征)和多元线性回归模型
-
模型评估:计算 R²、MAE、MSE、RMSE
-
结果分析:解释模型参数的护理意义
任务二:护理满意度预测
-
使用模拟的护理满意度调查数据
-
特征包括:护理人员态度、护理技术、环境舒适度、沟通效果等
-
目标变量:患者满意度评分(1-10 分)
-
构建多元线性回归模型,分析各因素对满意度的影响
4.2 优化练习
必做题:
- 理论推导:
-
推导单变量线性回归的正规方程解
-
证明梯度下降更新公式的正确性
- 编程实现:
-
使用 NumPy 手动实现单变量线性回归(不使用 scikit-learn)
-
计算并输出模型参数和评估指标
- 模型改进:
-
在患者预后预测模型中尝试添加新的特征(如 “pain_duration”)
-
比较添加特征前后的模型性能变化
选做题:
-
参数调优:尝试不同的学习率(如 0.001、0.01、0.1),观察梯度下降的收敛情况
-
特征选择:使用不同的特征组合,找出最优特征子集
-
模型对比:将线性回归与其他简单模型(如 k 近邻)进行对比
五、总结
通过本章的学习,我们掌握了以下核心内容:
- 理论基础:
-
线性回归的数学原理和公式推导
-
梯度下降算法和正规方程的适用场景
-
模型评估指标的计算和解读
- 实践技能:
-
使用 PyCharm 进行完整的机器学习项目开发
-
护理数据的预处理和特征工程方法
-
构建单变量和多元线性回归模型
-
使用模型评估指标优化模型
- 护理应用:
-
患者预后预测模型的构建和应用
-
护理工作量预测模型的开发和解读
-
模型结果在护理实践中的应用价值
下一步学习建议:
-
深入学习其他监督学习算法(如逻辑回归、决策树)
-
学习处理非线性关系的方法(如多项式回归)
-
了解模型的正则化技术(岭回归、Lasso)
-
探索深度学习在护理中的应用
更多推荐



所有评论(0)