可穿戴设备的模式预测, 助你直接迈过高端门槛

作者: 马志强 2015 年 5 月 4 日翻译自本人英文原作

前言

昨天在腾讯科技频道看到一篇文章《人工智能火了 高端人才成了香饽饽》,今天又读到《第一财经周刊》的文章,提到去年(2014)可穿戴设备的投资额高达1万亿美元。在商界其实是可预期的利润引导后才会引起对人才的渴望,不过对于类似人工智能这类领域来说,人才的炼成却不像其他速成行业那样容易。最重要的技能在于编程能力的娴熟和创新的算法的实践。 作者前不久发表于 RPubs的一篇详细介绍一个高准确率的机器学习的偏应用的实例,今天把它翻译成中文(内容有扩展),以飨读者,尤其是在编程高手众多的CSDN,以期抛砖引玉,如能提高中国社区众多程序员的兴趣进而提升中国在这个大潮中的竞争优势,也是幸事。

概要

可穿戴式设备,如智能手环、带传感器的跑鞋、老年人佩戴的心率传感器等已经进入大面积普及的前夜,这些设备可以产生大量的即时数据,而这些数据可以帮助人工智能(机器学习)业者用于商业和医疗健康行业的研究。在这篇文章里,作者将介绍一个预测准确率很高的算法Random Forest (本文实例的准确率超过了99%), 通过一个真实的数据采集过程,即6个志愿者在教练的指导下,穿戴传感器,尝试5种不同的举杠铃的动作,其中只有1种是正确的动作。然后将其各种动作分类标记(字母A-E,只有A为正确动作)、合成到已经产生的数据中,作为预测依据,预测模型生成后将对比预测动作和实际动作。最终可以在实际数据,也即没有动作字段的数据上,做出预测。

原始数据可以在这里获取real data ,更多的信息见 HAR网站here ,Weight Lifting Exercise Dataset 部分. 这是一个来自巴西的研究者的网站,同样的数据他们的模型得到的准确率是78.8%。

应用前景

本文介绍的算法的适用性很高,并非仅仅用于传感器数据预测动作模式方面, 其他方面的应用,比如对于创建某种类型的消费者是否会购买某种产品的预测模型(这方面的例子所需要的基础数据在市场上可以获得,比如美国安客诚(Acxiom)公司已经有成熟的覆盖绝大多数美国消费者的数据);某种饮食习惯的人是否可能更容易罹患某种特定疾病等等。

即使只局限于可穿戴设备市场,当前我们还没有看到任何一款市场上在售的手环具备实时提醒错误的运动动作的功能,如能将预测模型(模型本身不占多少空间)纳入设备中实现这个功能,则也未尝不是一个新的竞争力及可观的利润卖点。

实施说明

全部过程包括3个部分:数据清理和预处理、机器学习、测试集验证。

这些步骤是实施预测所必须的,其中某些步骤很多时候也需要反复重复进行,以提高准确率。这里没有提到的是算法选择,可以把它归入机器学习的过程中,这是因为本文直接使用了 Random Forest方法。

数据清理

在这个子过程中,原始数据被分为用于机器学习模型创建的训练集(占总记录数的70%)和用于交叉验证的测试集(30%),同时在这个子过程中,也去掉了那些显然对预测毫无意义的字段,诸如志愿者姓名,动作时间等, 并且这样做也有防止模型过度匹配的考虑, 比如如果将姓名纳入预测变量,那么很可能造成那些在模式之间(比如动作B和动作C)的处于模糊地带的数据(比如某动作既类似B的特点,有类似C的特点)的最终判断会去依赖姓名。

R语言代码如下:

library(caret); library(kernlab);## Loading required package: lattice## Loading required package: ggplot2#Read data into variableTrainDataOri<-read.table("pml-training.csv",header=TRUE,sep=",",na.strings="NA")#Create sub-training and sub-test datasetinTrain <- createDataPartition(TrainDataOri$classe,p=0.7, list=FALSE)training <- TrainDataOri[inTrain,]testing <- TrainDataOri[-inTrain,]#remove columns# 1.remove derivative volumns which with prefix max_, kurtosis_, skewness_, min_, var_, avg_, stddev_testingNew <- testing[,!grepl("max_|min_|kurtosis_|skewness_|var_|avg_|stddev_",names(testing))]trainingNew <- training[,!grepl("max_|min_|kurtosis_|skewness_|var_|avg_|stddev_",names(training))]# 2.remove row number and user nametestingNew <- testingNew[ , !names(testingNew) %in% c("X","user_name")]trainingNew <- trainingNew[ , !names(trainingNew) %in% c("X","user_name")]# 3.remove timestamptestingNew <- testingNew[,!grepl("timestamp",names(testingNew))]trainingNew <- trainingNew[,!grepl("timestamp",names(trainingNew))]# 4.remove columns which are empty in test dataset(columns with prefix amplitude), avoiding unnecessary unmatching occur.testingNew <- testingNew[,!grepl("amplitude_",names(testingNew))]trainingNew <- trainingNew[,!grepl("amplitude_",names(trainingNew))]数据预处理

在本例中,重要的是要先填充那些原始数据中的空值,这是因为对于RandomForest算法来说,它不会在预测过程中因为空值而报错,,但却会产生不完整的预测结果(这也是作者初次使用该算法时遇到的最困惑的地方,也耗费了较多精力来分析解决)。

trainingNew1<-trainingNew[,c("new_window","classe")]#only 2 factor columns in the new matrix trainingNew1trainingNew2<- trainingNew[,!grepl("new_window|classe",names(trainingNew))] #all other numeric columns into trainingNew2 which will be treated via imputaing.#Run command below to install it if run it first time.#source("")#biocLite("impute") #install impute packagelibrary(impute)imputed<-impute.knn(as.matrix(trainingNew2) ,k = 10, rowmax = 0.5, colmax = 0.99, maxp = 1500)trainingNew2<-imputed$datatrainingLast<-cbind(trainingNew1,trainingNew2) # get final training dataset trainingLast#do same for testing datasettestingNew1<-testingNew[,c("new_window","classe")]testingNew2<- testingNew[,!grepl("new_window|classe",names(testingNew))] imputedTest<-impute.knn(as.matrix(testingNew2) ,k = 10, rowmax = 0.5, colmax = 0.99, maxp = 1500)testingNew2<-imputedTest$datatestingLast<-cbind(testingNew1,testingNew2)

机器学习与模型创建

相信梦想是价值的源泉,相信眼光决定未来的一切,

可穿戴设备的模式预测, 助你直接迈过高端门槛

相关文章:

你感兴趣的文章:

标签云: