罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

用MATLAB分析可穿戴设备的健身数据

随着苹果(Apple)、谷歌和三星(Samsung)等智能手机巨头的加入,用可穿戴设备收集和跟踪健康和健身数据即将成为主流。但如果你收集数据,如果你不分析它又有什么意义呢?

今天的嘉宾博主,古原竹内他想分享他在一个公共存储库中找到的举重数据集的分析。

内容

动机、数据集和预测精度

人类活动识别(HAR)举重运动数据集提供测量来确定“一项活动执行得有多好”。6名受试者用5种不同的方式进行一组10次单侧哑铃肱二头肌卷曲。

当我遇到这个数据集时,我立即想到了构建一个移动应用程序,以告知最终用户他们是否正确地执行了练习,如果不正确,他们犯了哪些常见错误。我使用了强大的“随机森林”算法,看看能否建立一个成功的预测模型来支持这样的应用程序。我做到了99%预测准确率我想和大家分享我的研究成果。

该数据集提供了39,242个样本,包含159个变量,标记有5种类型的活动需要检测- 1种正确方法和4种常见错误:

  1. 完全符合规格(A类)
  2. 肘部向前投掷(B类)
  3. 哑铃只举一半(C类)
  4. 哑铃只放一半(D类)
  5. 臀部前倾(E类)

传感器被放置在受试者的腰带、臂章、手套和哑铃上,如下所述:

引用韦洛索,大肠;提高身价,a;Gellersen h;Ugulino w;举重运动的定性活动识别。第四届与SIGCHI合作国际会议论文集(增强人类'13)。斯图加特,德国:ACM SIGCHI, 2013。阅读更多:

数据预处理和探索性分析

通常不能直接使用原始数据。预处理是分析工作流的重要组成部分,对下游有重要影响。

  1. 加载数据集并检查缺失值的数据
  2. 对数据集进行分区以进行交叉验证
  3. 清理并规范化变量
  4. 选择预测变量(特征)

在这些步骤中,交叉验证是预测建模的关键步骤。粗略地说,您保留部分可用数据以供以后测试,并使用剩余的数据集构建模型。被保留的集合称为“测试集”,我们用于建模的集合称为“训练集”。这使得overfit您的模型,因为您可以根据建模过程中没有使用的数据来测试您的模型,从而让您了解模型在未知数据下的实际表现。

探索性分析通常从可视化数据开始,以了解其细微差别。下面前四个变量的图表明:

  1. 数据是按类组织的,比如'AAAAABBBBBCCCCC'。这可能是数据收集方式的产物,而现实生活中的数据可能不是这样结构的,因此我们希望使用更真实的数据来构建我们的模型。我们可以通过随机重新排列数据来解决这个问题。
  2. 数据点聚集在几个不同的平均值周围-表明测量是由以几种不同方式校准的设备进行的
  3. 这些变量在E类(洋红色)中表现出独特的模式-这些变量将有助于分离它

审查preprocess.m如果你对细节感兴趣。

进行预处理

随机森林预测模型

数据集在校准方面有一些问题。我们可以进一步预处理数据,以消除校准差距。然而,这一次,我想使用一种灵活的预测算法叫做随机森林.在MATLAB中实现了该算法TreeBagger类可在统计工具箱

随机森林变得流行起来,特别是在它被一些获奖者使用之后Kaggle比赛.它使用在随机数据子集上训练的大量决策树(即“森林”),并使用这些树的多数投票来预测结果。它倾向于产生高度准确的结果,但算法的复杂性使其缓慢且难以解释。

为了加速计算,我将启用支持的并行选项金宝app并行计算工具箱.如果不使用不必要的代码,可以注释掉它。

模型构建完成后,您将看到混淆矩阵这将实际的类标签与预测的类标签进行比较。如果所有东西都在一条对角线上,那么你就达到了100%的准确度。非对角线数字是错误分类的错误。

该模型具有非常高的预测精度,尽管我们之前看到我们的数据集存在一些校准问题。

初始化并行选项-如果不使用并行,则删除注释

Poolobj = gcp(“nocreate”);%不创建新池,即使没有池退出如果isempty (poolobj) parpool (“本地”2);结束Opts = statset(“UseParallel”,真正的);
使用“本地”配置文件启动并行池(parpool)…连接2个工人。

创建100棵树的随机森林模型,并行启用…

rfmodel = TreeBagger(100,table2array(Xtrain),Ytrain,...“方法”“分类”“oobvarimp”“上”“选项”、选择);
下面是相同模型的非并行版本rfmodel = TreeBagger(100,table2array(Xtrain),Ytrain,…“方法”、“分类”、“oobvarimp”,“上”);

预测测试集的类标签。

[Ypred, Yscore] =预测(rfmodel table2array (Xtest));

计算混淆矩阵和预测精度。

C =混淆(Ytest,分类(Ypred));disp (array2table (C,“VariableNames”, rfmodel。一会,“RowNames”rfmodel.ClassNames))流('测试集的预测精度:%f\n\n'总和(C(逻辑(眼(5))))/笔(和(C)))
A B C D E ____ ___ ___ ___ ___ A 1133 1 0 0 0 B 4 728 1 0 0 C 0 3 645 3 0 D 0 0 8 651 0 E 0 0 0 6 741测试集的预测精度:0.993374

按树数划分分类错误

我碰巧在模型中选取了100棵树,但是您可以检查与预测中使用的树的数量相关的错误分类错误。图表显示,100棵树是多余的——我们可以用更少的树,这样会让它走得更快。

图绘制(oobError (rfmodel));包含(“已生长树木的数目”);ylabel (“袋外分类错误”);

变量的重要性

对随机森林的一个主要批评是,它是一个黑盒算法,不容易理解它在做什么。然而,随机森林可以提供变量重要性度量,它对应于模型中给定变量存在和不存在时预测误差的变化。

对于我们假设的举重训练师移动应用程序,随机森林的实现过于繁琐和缓慢,所以你想使用一个更简单的预测模型和更少的预测变量。随机森林可以帮助你选择哪些预测器你可以放弃,而不会牺牲太多的预测精度。

让我们看看你怎么做TreeBagger

获取变量名

vars = Xtrain.Properties.VariableNames;

获取和排序可变重要性分数。因为我们“oobvarimp”“上”,该模型包含OOBPermutedVarDeltaError作为可变重要性的衡量标准。

varimp = rfmodel.OOBPermutedVarDeltaError';[~, idxvarimp] = (varimp)进行排序;标签= vars(idxvarimp);

绘制排序后的分数。

图barh (varimp (idxvarimp), 1);ylim (52 [1]);集(gca),“YTickLabel”、标签“YTick”1:元素个数(标签)标题(“变量重要性”);包含(“分数”

用ROC图评估权衡

现在让我们在预测变量的数量和预测精度之间进行权衡。的受试者工作特征(ROC)Plot提供了一种方便的方法来可视化和比较二进制分类器的性能。将假阳性率与各种预测阈值的真阳性率绘制成曲线。如果你得到一个完全随机的结果,曲线应该沿着对角线。如果你得到100%的准确率,那么曲线应该拥抱左上角。这意味着您可以使用曲线下面积(AUC)来评估每个模型的表现如何。

让我们用不同的预测变量集绘制ROC曲线,使用“C”类作为正类,因为我们一次只能做一个类,而且前面的混淆矩阵显示这个类比其他类有更多的错分类错误。你可以使用perfcurve计算ROC曲线。

看看myROCplot.m查看详情。

nFeatures = [3,5,10,15,20,25,52];myROCplot (Xtrain Ytrain Xtest,欧美,“C”、nFeatures varimp)

有12个特征的简化模型

根据前面的分析,即使使用10个特征,看起来也可以获得很高的准确率。假设我们确定了12个特征。我们现在知道,你不必使用手套上的数据来进行预测,所以我们假设的最终用户需要购买的传感器就少了一个。鉴于这个结果,我甚至可能会考虑放弃臂带,只使用腰带和哑铃传感器。

显示包含哪些功能。

disp(表(varimp (idxvarimp (1:12)),“RowNames”var (idxvarimp (1:12)),...“VariableNames”, {“重要性”}));
重要性__________ accel_arm_y 0.69746 pitch_dumbbell 0.77255 accel_arm_z 0.78941 accel_belt_x 0.81696 magnet_arm_y 0.81946 accel_arm_x 0.87168 magnet_arm_x 0.87897 accel_dumbbell_x 0.92222 magnet_forearm_x 1.0172 total_accel_belt 1.0461 gyros_arm_z 1.1077 gyros_belt_x 1.1235

关闭并行池。

删除(poolobj);

结论和下一步-将代码集成到应用程序中

尽管我最初对数据感到担忧,但我们能够使用只有12个特征的随机森林模型保持较高的预测精度。然而,考虑到随机森林的内存占用和缓慢的响应时间,它可能不是一个理想的移动应用程序模型。

下一步是找到一个更简单的模型,例如物流回归,它的表现还不错。您可能需要对数据进行更多的预处理以使其工作。

最后,我以前从未尝试过这个,但你可以从MATLAB中生成C代码,并将其合并到移动应用程序中。MATLAB到iPhone Made Easy浏览详情。

你用可穿戴设备记录你的活动吗?你试过分析数据吗?告诉我们你的经历在这里




发布与MATLAB®R2014a


评论

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