学生休息室

分享学生如何在日常项目中使用MATLAB和Simulink的技术和现实例子#学生成功#万博1manbetx

WiDS数据马拉松2021的MATLAB基准代码

简介

大家好,我是Neha Goel, MathWorks学生竞赛团队人工智能/数据科学竞赛的技术主管。MathWorks很高兴能够通过向每位参与者提供万博1manbetx免费的MATLAB许可证、教程和入门资源来支持WiDS数据马拉松2021。

要请求您的免费许可证,请转到MathWorks网站,按“索取软件”键,填写索取软件表格。您将在72个营业小时内获得执照。

2021年WiDS数据马拉松通过麻省理工学院GOSSIS(全球开源疾病严重程度评分)倡议的数据关注患者健康。由全球WiDS团队为您带来西部大数据创新中心,以及WiDS数据马拉松委员会,开放至2021年3月1日。了解更多有关wid Datathon,或报名参加今天。

数据马拉松的任务是训练一个模型,该模型将患者记录数据作为输入,并输出预测患者被诊断患有某种类型糖尿病的可能性,从而为ICU的治疗提供信息。在这篇博客文章中,我将介绍MATLAB中基本的启动器代码工作流程。其他训练方法的其他资源链接在博客文章的底部。

加载和准备数据

这个数据集提供了一个了解现实数据问题带来的数据建模和处理挑战的机会。在这篇博客中,我将讨论一些处理数据挑战的基本方法。要学习更多的方法,你可以通过这个数据科学教程系列视频

步骤1:加载数据

报名参加比赛,并从Kaggle下载数据文件。”TrainingWiDS2021.csv为训练数据文件,UnlabeledWiDS2021.csv为测试数据。
下载文件后,请确保这些文件位于MATLAB路径中。这里我使用readtable函数读取文件并将其存储为表。TreatAsEmpty将空值处理为文件中的数字列的占位符文本。表元素对应字符“NA”将被设置为“南”当进口。也可以使用MATLAB导入数据导入工具

TrainSet = readtable('TrainingWiDS2021.csv','TreatAsEmpty','NA');

步骤2:清理数据

这个数据集最大的挑战是数据很混乱。180个预测列,130157个有大量缺失值的观测值。数据转换和建模将是避免过度拟合问题的关键领域。
使用总结函数,我分析了预测因子的类型,每个预测因子列的最小值,最大值,中值和缺失值的数量。这帮助我得出相关的假设来清理数据。

摘要(小火车);

有许多不同的方法来处理缺失值和预测器选择。在这篇博客中,我们将介绍其中一种基本方法。您也可以参考本文档了解其他方法:清理混乱和丢失的数据

注意:所演示的数据清理方法是任意选择的,以减少预测器列的数量。

删除表的字符列

这背后的原因是我选择训练模型的算法是fitclinear它只允许数值矩阵作为输入参数。因此,删除“分类”或“非数字”类型的变量。

TrainSet = removevars(TrainSet,{'种族','性别','hospital_admit_source','icu_admit_source',…“icu_stay_type”、“icu_type '});

从所有重要预测器中移除最小值

在分析了DataDictionaryWiDS2021.csv文件提供了Kaggle数据,我注意到从第40列到166列的偶数列对应于预测器的最小值至关重要的类别。

TrainSet = removevars(TrainSet,(40:2:166));

删除有30个或更多缺失预测因子的观测值

我做的另一个假设是,有30个或更多缺失预测值的观察结果(患者)可以被移除。

TrainSet = rmmissing(TrainSet,1,'MinNumMissing',30);

删除有30个或更多缺失预测因子的观测值

我做的另一个假设是,有30个或更多缺失预测值的观察结果(患者)可以被移除。

TrainSet = rmmissing(TrainSet,1,'MinNumMissing',30);

填充缺失的值

下一步是填充所有NaN值。一种方法是使用fillmissing函数使用线性插值填充数据。其他方法包括将NaN值替换为平均值或中值和使用CurveFitting应用程序删除异常值

TrainSet = convertvars(TrainSet,@iscategorical,'double');TrainSet = fillmissing(TrainSet,'linear');

在这一步中,我移动我们的标签预测器diabetes_mellitus到表的最后一列,因为对于MATLAB和Classification learner app中的一些算法,最后一列是默认的响应变量。

TrainSet = movevars(TrainSet,'diabetes ','After',110);

步骤3:创建培训数据

一旦我有了干净的训练数据。我分离了标签预测器diabetes_mellitus并创建两个单独的表XTrain:预测数据,YTrain:类标签

XTrain = removevars(TrainSet,{'糖尿病'});YTrain = trainset .diabetes;

步骤4:创建测试数据

下载UnlabeledWiDS2021.csv文件从Kaggle。方法读取文件readtable函数将其存储为表。您也可以使用导入工具来加载数据。

XTest = readtable('UnlabeledWiDS2021.csv','TreatAsEmpty','NA');

我使用了类似于上面训练数据的方法来清理测试数据。XTest是没有标签预测器的测试数据。

删除表的字符列

XTest = removevars(XTest,{'种族','性别','hospital_admit_source',…“icu_admit_source”、“icu_stay_type”、“icu_type '});

从所有重要预测器中移除最小值

的最小值至关重要的类别对应于第40列到166列的偶数列。

XTest = removevars(XTest, (40:2:166));

填充缺失的值

XTest = convertvars(XTest,@iscategorical,'double');XTest = fillmissing(XTest,'linear');

第五步:训练一个模型

在MATLAB中,你可以用两种不同的方法训练一个模型。

  1. 使用MATLAB自定义机器学习算法函数
  2. 使用分类学习应用程序训练模型。

在这里,我介绍了使用这两种方法的步骤。我鼓励这两种方法都尝试一下,并使用不同的算法和参数来训练模型。这将有助于优化和比较不同模型的分数。

选项1:使用自定义算法

二元分类问题可以使用各种算法,如决策树,支持向量机和逻辑回归。这里我使用fitclinear分类模型。它利用高维预测数据训练线性二元分类模型。

将表转换为数字矩阵,因为fitclinear函数只接受数字矩阵作为输入参数。

XTrainMat = table2array(XTrain);XTestMat = table2array(XTest);

拟合模型

函数中的名称值对输入参数提供了调优模型的选项。这里我使用sparsa(可分离近似稀疏重建)作为求解器,它具有默认值套索正则化。为了优化模型,我做了一些超参数优化。

“OptimizeHyperparameters”作为“汽车”使用{λ,学习者}而且收购函数名允许您在函数每秒过度使用某个区域时修改行为。

您可以使用交叉验证选项进一步交叉验证输入参数中的数据:crossval, KFold, CVPartition等。请查看fitclinear文档以了解输入参数。

Mdl = fitclinear(XTrainMat,YTrain,'ObservationsIn','rows','Solver','sparsa',…‘OptimizeHyperparameters’,‘汽车’,‘HyperparameterOptimizationOptions’,……结构(“AcquisitionFunctionName”、“expected-improve ment-plus '));

对测试集进行预测

一旦我们准备好了你的模型,你就可以使用predict函数对你的测试集进行预测。它将拟合模型和具有相似预测因子的测试数据作为训练数据的输入。输出是预测的标签和分数。

[label,scores] = predict(Mdl,XTestMat);

选项2:使用分类学习者App

训练模型的第二种方法是使用分类学习者app.它允许您交互式地训练、验证和调优分类模型。让我们看看使用它的步骤。

  • 应用程序页签,在“机器学习”组中,单击分类学习者
  • 点击新会话并选择数据(小火车)。指定响应变量(diabetes_mellitus).
  • 选择验证方法,避免过拟合。你可以选择坚持验证交叉验证选择k-fold的个数。
  • 分类学习者选项卡,在模型类型节中,选择要训练的算法。逻辑回归,全支持向量机,全快速训练
  • 您还可以尝试通过使主成分分析降低维数。
  • 中参数的设置可以进一步改进模型高级对话框
  • 选中所有必需选项后,单击火车
  • 左边的历史窗口显示了训练过的不同模型及其精度。
  • 模型在验证数据上的性能可以通过混淆矩阵而且ROC曲线部分。
  • 为了对测试集进行预测,我通过选择导出模型出口模式分类学习者选项卡

验证数据的ROC曲线,从Classification Learner App导出,采用中位数高斯SVM模型

对测试集进行预测

导出的模型保存为trainedModel在工作空间中。然后,您可以使用predictFcn

标签为测试集上的预测标签。分数是正面和负面班级每个观察的分数。

[label,scores] = trainedModel.predictFcn(XTest);

提交和评估

第六步:Kaggle提交

根据id和预测分数创建一个结果表。提交文件的格式为:

encounter_id, diabetes_mellitus

您可以将所有测试结果放在MATLAB表中,这使得可视化和写入所需的文件格式变得容易。我存储了分数的阳性标签(第二列)。

testResults = table(XTest.encounter_id,scores(:,2),'VariableNames',…{'encounter_id','diabetes '});

将结果写入CSV文件。这是你要提交的挑战文件。

writetable(检测结果,“testResults.csv”);

第七步:评估

提交的Kaggle排行榜将根据预测目标和观察目标之间的受试者工作特征(ROC)曲线下的面积(diabetes_mellitus).提交你的testResults.csv在Kaggle上生成上述文件,以查看您的测试数据集的AUC分数。

AUC(曲线下面积)是ROC曲线所包围的面积。完美分类器的AUC = 1,完全随机分类器的AUC = 0.5。通常情况下,您的模型将在可能的AUC值范围[0,1]之间的某个地方得分。

混淆矩阵图用于了解当前选择的分类器在每个类中的执行情况。要在训练模型后查看混淆矩阵,可以使用MTALABplotconfusion函数。

对模型进行评价,MATLAB有perfcurve函数。它计算假阳性,真阳性,阈值和auc得分。函数的输入参数包括测试标签、分数和正类标签。

为你的自我评估的目的您可以创建测试标签(欧美)通过从训练集中划分一个子集,并使用从训练集中生成的分数trainedModel

注意:通过此函数计算的auc可能与Kaggle排行榜上计算的auc不同。

(玻璃钢,tpr,用力推,auc) = perfcurve(欧美,分数(:,2),' 1 ');

感谢您跟随这段代码!我们很高兴知道您将如何修改此启动器代码并使其成为您的。我强烈建议查看下面的参考资料部分,以获得关于如何改进基准测试模型的更多想法。
欢迎在Kaggle论坛上与我们联系或发邮件给我们studentcompetitions@mathworks.com如果你还有其他问题。

额外的资源

  1. 数据科学教程
  2. MATLAB中的缺失数据
  3. 监督学习工作流和算法
  4. 在分类学习App中训练分类模型
  5. 导出分类模型预测新数据
  6. 8 MATLAB数据科学备考单
|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。