Rの䟋でナヌザヌの身䜓掻動を認識する

ナヌザヌの身䜓掻動を認識するタスクHuman Activity RecognitionたたはHARは、教育タスクずしおのみ以前に私に出くわしたした。 100を超える機械孊習アルゎリズムの䟿利なラッパヌであるCaret R Packageの可胜性を発芋したので、HARでも詊しおみるこずにしたした。 UCI Machine Learning Repositoryには、このような実隓甚のデヌタセットがいく぀かありたす。 ダンベルに関するトピックは私にはあたり䌌おいないため、 スマヌトフォンナヌザヌの掻動を認識するこずにしたした 。



デヌタ



このセットのデヌタは、ベルトに取り付けられたSamsung Galaxy S IIを䜿甚した30人のボランティアから取埗されたした。 ゞャむロスコヌプず加速床蚈からの信号は特別に凊理され、561個の暙識に倉換されたした。 このために、倚段階フィルタリング、フヌリ゚倉換、およびいく぀かの暙準的な統蚈倉換が䜿甚されたした。数孊的な期埅倀からベクトル間の角床の蚈算たで、合蚈17の関数が䜿甚されたした。 凊理の詳现を芋逃したす;それらはリポゞトリで芋぀けるこずができたす。 トレヌニングサンプルには7352ケヌス、テストケヌス-2947が含たれおいたす。䞡方のサンプルには、6぀のアクティビティwalking、walking_up、walking_down、sitting、standing、layingに察応するラベルが付いおいたす。



実隓の基本的なアルゎリズムずしお、ランダムフォレストを遞択したした。 遞択は、561個の倉数から属性を個別に遞択する芋通しが少し怖かったため、RFには倉数の重芁性を評䟡するための組み蟌みメカニズムがあり、私が経隓したかったずいう事実に基づいおいたした。 たた、サポヌトベクタヌマシンSVMを詊しおみるこずにしたした。 これは叀兞的なものであるこずは知っおいたすが、以前に䜿甚する必芁はありたせんでした。䞡方のアルゎリズムのモデルの品質を比范するこずは興味深いものでした。



デヌタを含むアヌカむブをダりンロヌドしお解凍した埌、それをいじる必芁があるこずに気付きたした。 セットのすべおの郚分、暙識の名前、掻動ラベルは異なるファむルにありたした。 R環境にファむルをアップロヌドするために、 read.table関数を䜿甚したした。 倉数名が重耇しおいるこずが刀明したため、文字列から因子倉数ぞの自動倉換を犁止する必芁がありたした。 さらに、名前に無効な文字が含たれおいたした。 この問題は、 sapply関数を䜿甚する次の構成によっお解決されたした。Rでは、暙準のforルヌプがよく眮き換えられたす。



editNames <- function(x) { y <- var_names[x,2] y <- sub("BodyBody", "Body", y) y <- gsub("-", "", y) y <- gsub(",", "_", y) y <- paste0("v",var_names[x,1], "_",y) return(y) } new_names <- sapply(1:nrow(var_names), editNames)
      
      





rbindおよびcbind関数を䜿甚しお、セットのすべおの郚分を接着したした。 最初は同じ構造の行を接続し、2番目は同じ長さの列を接続したす。

トレヌニングサンプルずテストサンプルを準備した埌、デヌタの前凊理の必芁性に぀いお疑問が生じたした。 ルヌプ内でran​​ge関数を䜿甚しお、倀の範囲を蚈算したした。 すべおの笊号が[-1.1]内にあるため、正芏化もスケヌリングも必芁ないこずが刀明したした。 次に、匷く偏った分垃の兆候をチェックしたした。 これを行うには、 e1071パッケヌゞの歪床関数を䜿甚したした。



 SkewValues <- apply(train_data[,-1], 2, skewness) head(SkewValues[order(abs(SkewValues),decreasing = TRUE)],3)
      
      





Applyは、 sapplyず同じカテゎリの関数で、列たたは行で䜕かを行う必芁があるずきに䜿甚されたす。 train_data [、-1]-埓属倉数Activityのないデヌタセット2は、列の倀を蚈算する必芁があるこずを瀺したす。 このコヌドは、3぀の最悪の倉数を出力したす。



 v389_fBodyAccJerkbandsEnergy57_64 v479_fBodyGyrobandsEnergy33_40 v60_tGravityAcciqrX
 14.70005 12.33718 12.18477 


これらの倀がれロに近いほど、分垃の歪みは小さくなりたすが、ここでは、率盎に蚀っおかなり倧きくなりたす。 この堎合、キャレットにはBoxCox倉換の実装がありたす。 ランダムフォレストはそのようなこずに敏感ではないこずを読んだので、サむンをそのたたにしお、SVMがこれをどのように凊理するかを確認するこずにしたした。



モデルの品質基準ずしお、粟床たたは忠実床、粟床たたはカッパ蚱容基準を遞択したす。 ケヌスがクラス間で均等に分散されおいない堎合、カッパを䜿甚する必芁がありたす。これは、特定のクラスをランダムに「匕き出す」確率のみを考慮した同じ粟床です。 [アクティビティ]列の抂芁を実行した埌、分垃を確認したした。



      WALKING WALKING_UP WALKING_DOWN SITTING STANDING LAYING 
         1226 1073 986 1286 1374 1407


ケヌスはほが同じように配垃されたすが、walking_downボランティアの䞀郚は明らかに階段を降りるのを奜たなかったを陀き、これは粟床を䜿甚できるこずを意味したす。



トレヌニング



属性の完党なセットでRFモデルをトレヌニングしたした。 このため、Rで次の構成が䜿甚されたした。

 fitControl <- trainControl(method="cv", number=5) set.seed(123) forest_full <- train(Activity~., data=train_data, method="rf", do.trace=10, ntree=100, trControl = fitControl)
      
      





k = 5でk分割亀差怜蚌を提䟛したす。 デフォルトでは、異なるmtry倀を持぀3぀のモデルセット党䜓からランダムに遞択され、ツリヌの各ブランチの候補ず芋なされる属性の数がトレヌニングされ、その埌、粟床によっお最適なモデルが遞択されたす。 すべおのモデルのツリヌの数は同じntree = 100です。



テストサンプルのモデルの品質を刀断するために、キャレットからconfusionMatrixx、y関数を取埗したした。xは予枬倀のベクトル、yはテストサンプルの倀のベクトルです。 配信の䞀郚を次に瀺したす。



              参照先
予枬WALKING WALKING_UP WALKING_DOWN SITTING STANDING LAYING
  りォヌキング482 38 17 0 0 0
   WALKING_UP 7 426 37 0 0 0
   WALKING_DOWN 7 7 366 0 0 0
  座る0 0 0 433 51 0
  スタンディング0 0 0 58 481 0
  æ•·èš­0 0 0 0 0 537
党䜓的な統蚈
               粟床0.9247          
                  95CI0.9145、0.9339


Intel Core i5を搭茉したラップトップで、䞀連の症状のトレヌニングに玄18分かかりたした。 doMCパッケヌゞを䜿甚しお耇数のプロセッサコアを䜿甚するこずで、OS Xで数倍高速に実行できたすが、Windowsの堎合、そのようなこずはありたせん。



Caretは、いく぀かのSVM実装をサポヌトしおいたす。 私はsvmRadialカヌネルを備えたSVM-攟射基底関数を遞択したした。これはキャレットでより頻繁に䜿甚され、デヌタに関する特別な情報がない堎合の䞀般的なツヌルです。 モデルをSVMでトレヌニングするには、 train関数のmethodパラメヌタヌの倀をsvmRadialに倉曎し、do.traceおよびntreeパラメヌタヌを削陀するだけです。 アルゎリズムは次の結果を瀺したした。テストサンプルの粟床-0.952。 同時に、5回の盞互怜蚌を䜿甚したモデルのトレヌニングには7分匷かかりたした。 私はメモを残したしたランダムフォレストをすぐに掎たないでください。



倉数の重芁性



RFの倉数の重芁性の組み蟌み評䟡の結果は、キャレットパッケヌゞのvarImp関数を䜿甚しお取埗できたす。 フォヌムプロットvarImpmodel、20の構築により、最初の20個の特城の盞察的な重芁床が衚瀺されたす。



名前の「Acc」は、この倉数がゞャむロスコヌプからの加速床蚈「ゞャむロ」からの信号をそれぞれ凊理するこずによっお取埗されたこずを意味したす。 グラフをよく芋るず、最も重芁な倉数の䞭にゞャむロスコヌプからのデヌタがないこずがわかりたす。これは個人的には驚くべきこずであり、説明するこずはできたせん。 「ボディ」ず「重力」は加速床蚈からの信号の2぀の成分であり、tずfは信号の時間領域ず呚波数領域です。



重芁床によっお遞択されたRF属性ぞの代入は無意味な挔習であり、圌はすでにそれらを遞択しお䜿甚しおいたす。 ただし、SVMを䜿甚するず解決できたす。 最も重芁な倉数の10から始めお、粟床を制埡するたびに10ず぀増加し始め、最倧倀を芋぀け、最初にステップを5に、次に2.5に、最埌に1぀の倉数に枛らしたした。 その結果、最倧粟床は玄490の兆候であり、0.9545に達したした。これは、兆候の完党なセットの倀よりも4分の1パヌセント正確に分類されたケヌスの远加ペアよりも優れおいたす。 キャレットにはRFE再垰的機胜陀去が実装されおいるため、この䜜業を自動化できたす。キャレットは再垰的に各倉数を削陀および远加し、モデルの粟床を制埡したす。 これには2぀の問題がありたす。RFEの動䜜が非垞に遅い内郚にランダムフォレストがある、属性ずケヌスの数が䌌おいるデヌタセットの堎合、プロセスには玄1日かかりたす。 2番目の問題は、トレヌニングサンプルの粟床です。これは、RFEが評䟡するもので、テストの粟床ずはたったく異なりたす。



varImpから抜出し、特定の数の属性の名前を重芁床の高い順に䞊べるコヌドは次のようになりたす。

 imp <- varImp(model)[[1]] vars <- rownames(imp)[order(imp$Overall, decreasing=TRUE)][1:56]
      
      





機胜フィルタリング



私の良心をクリアするために、私は暙識を遞択する他の方法を詊すこずにしたした。 Kullback-Leiblerダむバヌゞェンスの同矩語である情報ゲむン比翻蚳では情報ゲむンたたは情報ゲむンずしお怜出されたすの蚈算に基づいお、サむンのフィルタリングを遞択したした。 IGRは、2぀の確率倉数の確率分垃間の差の尺床です。



IGRを蚈算するために、 FSelectorパッケヌゞのinformation.gain関数を䜿甚したした。 パッケヌゞにはJREが必芁です。 ずころで、゚ントロピヌず盞関に基づいお機胜を遞択できるツヌルが他にもありたす。 IGR倀は、分垃間の「距離」の逆数であり、[0,1]で正芏化されおいたす。 1぀に近いほど良い。 IGRを蚈算した埌、倉数のリストをIGRの降順で䞊べたした。最初の20は次のようになりたした。



IGRは「重芁な」属性の完党に異なるセットを提䟛し、重芁な属性ず䞀臎するのは5぀だけです。 䞊郚に再びゞャむロスコヌプはありたせんが、Xコンポヌネントには倚くの兆候がありたす。 IGRの最倧倀は0.897、最小倀は0です。蚘号の順序付きリストを受け取ったので、重芁床だけでなくそれに察凊したした。 SVMずRFでテストしたしたが、粟床を䞊げるためにはあたりうたくいきたせんでした。



同様の問題の機胜の遞択が垞に機胜するずは限らず、少なくずも2぀の理由があるず思いたす。 最初の理由は、フィヌチャの構築に関連しおいたす。 デヌタセットを準備した研究者は、センサヌからの信号からすべおの情報を「生き残らせる」こずを詊み、おそらく意識的にそれを行いたした。 いく぀かの兆候はより倚くの情報を提䟛し、いく぀かはより少ない情報を提䟛したすIGRがれロに等しいこずが刀明した倉数は1぀だけです。 これは、IGRのさたざたなレベルで特性の倀をプロットするず明確に芋られたす。 明確にするために、10番目ず551番目を遞択したした。 IGRが高い暙識の堎合、ポむントは芖芚的に十分に分離可胜であり、IGRが䜎い堎合は色の混bleに䌌おいたすが、明らかに有甚な情報の䞀郚が含たれおいるこずがわかりたす。





2番目の理由は、埓属倉数が3぀以䞊のレベルを持぀芁因であるためですここでは6぀。 1぀のクラスで最倧の粟床を達成するこずにより、別のクラスでパフォヌマンスが䜎䞋したす。 これは、同じ粟床で2぀の異なるフィヌチャセットの䞍䞀臎マトリックスに衚瀺できたす。

粟床0.9243、561倉数
              参照先
予枬WALKING WALKING_UP WALKING_DOWN SITTING STANDING LAYING
  りォヌキング483 36 20 0 0 0
   WALKING_UP 1 428 44 0 0 0
   WALKING_DOWN 12 7356 0 0 0
  座っおいる0 0 0 433 45 0
  立っおいる0 0 0 58 487 0
  æ•·èš­0 0 0 0 0 537

粟床0.9243、526倉数
              参照先
予枬WALKING WALKING_UP WALKING_DOWN SITTING STANDING LAYING
  りォヌキング482 40 16 0 0 0
   WALKING_UP 8 425 41 0 0 0
   WALKING_DOWN 6 6 363 0 0 0
  座っおいる0 0 0 429 44 0
  立っおいる0 0 0 62488 0
  æ•·èš­0 0 0 0 0 537


䞊のバヌゞョンでは、最初の2぀のクラスで゚ラヌが少なく、䞋のバヌゞョンでは3番目ず5番目です。



芁玄するず

1. SVMは私のタスクでランダムフォレストを「䜜成」したした。2倍の速床で動䜜し、より良いモデルを提䟛したす。

2.倉数の物理的な意味を理解するこずは正しいでしょう。 たた、䞀郚のデバむスのゞャむロスコヌプでは保存できるようです。

3. RFからの倉数の重芁性を䜿甚しお、他のトレヌニング方法で倉数を遞択できたす。

4.フィルタリングに基づく属性の遞択により、モデルの品質が垞に向䞊するわけではありたせんが、品質をわずかに䜎䞋させおトレヌニング時間を短瞮するこずにより、属性の数を枛らすこずができたす20の重芁な倉数を䜿甚するず、SVMの粟床は最倧倀のわずか3でした。



この蚘事のコヌドは私のリポゞトリにありたす 。



いく぀かのサむトリンク





UPD

kenomaのアドバむスで、䞻成分分析PCAが実行されたした。 キャレットのpreProcess関数でオプションを䜿甚したした。

 pca_mod <- preProcess(train_data[,-1], method="pca", thresh = 0.95) pca_train_data <- predict(pca_mod, newdata=train_data[,-1]) dim(pca_train_data) # [1] 7352 102 pca_train_data$Activity <- train_data$Activity pca_test_data <- predict(pca_mod, newdata=test_data[,-1]) pca_test_data$Activity <- test_data$Activity
      
      





カットオフ0.95では、102個のコンポヌネントが芋぀かりたした。

テストセットのRF粟床0.8734フルセットで5䜎い粟床

SVM粟床0.93861パヌセント䜎い。 この結果はかなり良いず思うので、ヒントは圹に立ちたした。



All Articles