1. 项目背景与数据集解析
心血管疾病预测一直是医疗数据分析的热门方向。Kaggle上的心脏病数据集包含了303条患者记录,每条记录有13个临床特征和1个目标变量(是否患病)。这个数据集特别适合用来演示如何用Matlab实现二元分类预测模型。
数据集中的关键特征包括:
- 年龄、性别等人口统计学数据
- 胸痛类型(4种分类)
- 静息血压、胆固醇水平
- 空腹血糖水平
- 静息心电图结果
- 最大心率
- 运动诱发心绞痛
- ST段压低程度
- 主要血管数量
- 地中海贫血指标
注意:原始数据中的分类变量已经过数值化处理,使用前需要了解每个数值对应的临床含义。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据预处理与特征工程
2.1 数据清洗
首先需要处理缺失值和异常值。这个数据集相对干净,但仍需检查:
matlab复制% 检查缺失值
missing_values = sum(ismissing(data));
% 处理异常血压值
abnormal_bp = data.RestingBP < 90 | data.RestingBP > 200;
data(abnormal_bp,:) = [];
2.2 特征标准化
不同特征的量纲差异很大,需要进行标准化:
matlab复制% Z-score标准化
data.Age = (data.Age - mean(data.Age)) / std(data.Age);
data.RestingBP = (data.RestingBP - mean(data.RestingBP)) / std(data.RestingBP);
% 其他连续变量同理
2.3 特征选择
使用MATLAB的fscmrmr函数进行特征重要性排序:
matlab复制[idx,scores] = fscmrmr(data(:,1:end-1), data.HeartDisease);
bar(scores(idx))
xlabel('特征重要性排名')
3. 模型构建与训练
3.1 逻辑回归模型
作为基线模型,逻辑回归简单有效:
matlab复制mdl = fitglm(data, 'Distribution', 'binomial', 'Link', 'logit');
cvmodel = crossval(mdl, 'KFold', 5);
kfoldLoss(cvmodel)
3.2 随机森林
使用TreeBagger实现:
matlab复制numTrees = 100;
rf = TreeBagger(numTrees, data(:,1:end-1), data.HeartDisease,...
'Method', 'classification', 'OOBPrediction', 'On');
oobError(rf, 'Mode', 'Cumulative');
3.3 SVM模型
带RBF核的SVM通常表现良好:
matlab复制svmModel = fitcsvm(data(:,1:end-1), data.HeartDisease,...
'KernelFunction', 'rbf', 'Standardize', true,...
'OptimizeHyperparameters', 'auto');
4. 模型评估与优化
4.1 评估指标
关键指标包括准确率、AUC、敏感性和特异性:
matlab复制[pred, score] = predict(svmModel, testData);
[~,~,~,auc] = perfcurve(testLabels, score(:,2), 1);
confmat = confusionmat(testLabels, pred);
4.2 超参数调优
使用贝叶斯优化:
matlab复制vars = [optimizableVariable('BoxConstraint',[1e-3,1e3],'Transform','log');
optimizableVariable('KernelScale',[1e-3,1e3],'Transform','log')];
results = bayesopt(@(params)svmErrorFunc(params,data,labels),vars);
4.3 模型解释
使用LIME解释单个预测:
matlab复制explainer = lime(svmModel);
explanation = explain(explainer, testData(1,:));
plot(explanation)
5. 完整实现流程
5.1 数据准备
matlab复制% 从CSV加载数据
data = readtable('heart.csv');
% 划分训练测试集
cv = cvpartition(size(data,1), 'HoldOut', 0.3);
trainData = data(training(cv),:);
testData = data(test(cv),:);
5.2 特征处理管道
matlab复制% 创建预处理管道
preprocessor = [...
tableInputLayer('Normalization', 'zscore'),...
oneHotEncoderLayer('CategoricalVars', [2,3,6,7,9,11])];
5.3 模型训练与验证
matlab复制% 5折交叉验证
cvmdl = crossval(mdl, 'KFold', 5);
loss = kfoldLoss(cvmdl);
% 绘制学习曲线
plot(loss);
xlabel('训练样本比例');
ylabel('分类误差');
6. 实际应用建议
6.1 临床部署考虑
- 模型输出应结合临床决策支持系统
- 需要定期用新数据重新训练
- 预测结果应附带置信度评分
6.2 性能优化技巧
- 使用MATLAB Coder生成C++代码加速预测
- 对大数据集使用tall数组
- 并行计算加速训练过程:
matlab复制options = statset('UseParallel', true);
mdl = fitcsvm(..., 'Options', options);
6.3 常见问题解决
- 类别不平衡:使用代价敏感学习或SMOTE过采样
- 过拟合:增加正则化或使用早停法
- 特征相关性:使用PCA降维
经验分享:在实际医疗应用中,模型解释性往往比绝对准确率更重要。建议优先选择可解释性强的模型,或在复杂模型基础上增加解释层。
7. 扩展方向
- 时间序列分析:加入ECG时序数据
- 多模态融合:结合影像学检查结果
- 风险分层:将二元分类扩展为多分类
- 在线学习:实现增量式模型更新
这个项目展示了如何用MATLAB完整实现一个医疗预测分析流程。从数据探索到模型部署,每个环节都需要严谨的医学知识和统计验证。在实际应用中,建议与临床专家紧密合作,确保模型预测结果具有实际的临床指导价值。
