
1. 心脏病数据集Kaggle医学特征二元分类项目概述今天要分享的是一个基于Kaggle心脏病数据集的医学特征二元分类项目使用Matlab实现心血管疾病预测模型。这个项目特别适合医学数据分析初学者和Matlab使用者因为它涵盖了从数据预处理到模型构建的完整流程。这个数据集包含了303个样本每个样本有14个属性其中13个是医学特征最后一个是目标变量是否患有心脏病。数据集的特征包括年龄、性别、胸痛类型、静息血压、胆固醇水平等临床指标。我们的目标是通过这些特征建立一个能够准确预测心脏病风险的分类模型。提示Kaggle上的心脏病数据集是医学机器学习领域的经典入门数据集结构清晰且特征含义明确非常适合作为二元分类的练手项目。我选择Matlab实现这个项目有几个原因首先Matlab在医学图像处理和数据分析领域有成熟的工具箱其次它的矩阵运算能力非常适合处理这类结构化医学数据最后Matlab的可视化功能可以直观展示数据分析结果和模型性能。2. 数据预处理与特征分析2.1 数据加载与初步检查在Matlab中加载CSV格式的数据集非常简单data readtable(heart.csv); summary(data)第一件事是检查数据质量。这个数据集有几个需要注意的地方有6个样本含有缺失值表现为0特别是在胆固醇(chol)和静息血压(trestbps)字段年龄范围从29岁到77岁大部分样本集中在40-60岁之间目标变量(目标)已经编码为0和11表示患有心脏病2.2 缺失值处理策略对于医学数据集直接删除含有缺失值的样本可能不合适因为样本量本来就不大。我采用了以下策略% 替换0值为该列的中位数 data.chol(data.chol 0) median(data.chol(data.chol ~ 0)); data.trestbps(data.trestbps 0) median(data.trestbps(data.trestbps ~ 0));选择中位数而非均值是因为医学数据往往存在离群值中位数更加稳健。2.3 特征标准化不同特征的量纲差异很大比如年龄(20-80)和静息血压(90-200)。标准化可以提高模型性能numericVars {age,trestbps,chol,thalach,oldpeak}; data{:,numericVars} normalize(data{:,numericVars});2.4 特征相关性分析通过计算特征间的相关系数矩阵可以发现corrMatrix corr(table2array(data(:,1:13))); heatmap(corrMatrix)结果显示最大心率(thalach)与年龄呈负相关(-0.4)这与医学常识一致。而胸痛类型(cp)与目标变量的相关性最高(0.43)这是一个重要信号。3. 模型构建与训练3.1 数据集划分采用70-30的比例划分训练集和测试集rng(42); % 设置随机种子保证可重复性 cv cvpartition(data.目标,HoldOut,0.3); trainData data(training(cv),:); testData data(test(cv),:);3.2 逻辑回归模型作为基线模型首先尝试逻辑回归mdl fitglm(trainData,Distribution,binomial,... Link,logit);模型训练后检查系数可以发现胸痛类型(cp)的系数为正且显著运动诱发心绞痛(exang)的系数为负这与医学知识一致3.3 支持向量机(SVM)模型SVM通常在小数据集上表现良好SVMModel fitcsvm(trainData(:,1:13),trainData.目标,... KernelFunction,rbf,... Standardize,true);需要特别调整的是核函数和惩罚参数C。通过交叉验证寻找最优参数opts struct(Optimizer,bayesopt,ShowPlots,true,... AcquisitionFunctionName,expected-improvement-plus); SVMModel fitcsvm(trainData(:,1:13),trainData.目标,... OptimizeHyperparameters,auto,... HyperparameterOptimizationOptions,opts);3.4 随机森林模型随机森林能自动处理特征交互RFModel TreeBagger(100,trainData(:,1:13),trainData.目标,... Method,classification,... OOBPrediction,On);查看特征重要性imp RFModel.OOBPermutedPredictorDeltaError; bar(imp) title(Feature Importance);结果显示thalach(最大心率)和cp(胸痛类型)是最重要的两个预测因子。4. 模型评估与比较4.1 评估指标选择对于医学诊断模型单纯看准确率不够。我们关注准确率(Accuracy)灵敏度(Sensitivity/Recall)特异度(Specificity)AUC-ROC曲线% 逻辑回归评估 probs predict(mdl,testData); [~,~,~,AUC] perfcurve(testData.目标,probs,1);4.2 性能比较模型准确率灵敏度特异度AUC逻辑回归0.820.850.780.88SVM(RBF核)0.850.880.810.91随机森林0.870.890.840.934.3 混淆矩阵可视化confusionchart(testData.目标,predict(SVMModel,testData(:,1:13))) title(SVM Confusion Matrix)从结果看随机森林表现最好但SVM也很接近。考虑到医学应用我们可能更看重灵敏度减少假阴性。5. 模型优化与部署5.1 特征选择通过递归特征消除(RFE)减少冗余特征opts statset(display,iter); [fs,history] sequentialfs(critfun,trainData{:,1:13},... trainData.目标,options,opts);最终选择了7个关键特征年龄、胸痛类型、静息血压、胆固醇、最大心率、运动诱发心绞痛和ST段压低。5.2 集成方法尝试将逻辑回归和随机森林集成finalProbs 0.7*predict(RFModel,testData(:,1:13)) ... 0.3*predict(mdl,testData);这种加权集成将AUC提升到了0.94说明不同模型确实捕捉到了数据的不同方面。5.3 模型部署为DLL如果需要将模型集成到医疗系统中可以导出为DLLcodegen predictHeartDisease -args {coder.typeof(trainData{1,1:13},[1 13])}这样C或其他语言程序就可以调用这个预测函数了。6. 实际应用中的注意事项在真实医疗场景应用这个模型时有几个关键点需要考虑数据漂移问题不同医院采集的数据可能有系统性差异需要定期重新校准模型解释性要求医疗决策需要可解释性随机森林虽然准确但解释性不如逻辑回归伦理考量避免模型对特定年龄或性别群体产生偏见临床验证任何医学预测模型都需要严格的临床验证才能实际应用我在实际测试中发现模型对40-60岁人群预测最准但对年轻人和老年人效果稍差。这可能是因为数据集中这些年龄段的样本较少。解决方法是收集更多边缘年龄段的样本重新训练。另一个实用技巧是建立预测置信度指标。当模型对某个预测的置信度低于阈值时建议临床医生进行更详细的检查[~,scores] predict(RFModel,newData); confidence max(scores,[],2); if confidence 0.7 disp(建议进行进一步检查); end