はじめに
この記事は、前回の記事「MATLABの機械学習で脳波を識別 その1」の続きとなる内容です。前回の内容を読んでいる前提で話が進みますので、まだ読んでいない方は先にその1から見ておいてください。
やりたいこと(おさらい)
・手の運動中の脳波4パターン(以下の①~④)を学習させる
①右手を前方に動かす運動
②右手を後方に動かす運動
③左手を前方に動かす運動
④左手を後方に動かす運動
・学習したアルゴリズムを使って、運動イメージ中の脳波が①~④のどれか判別させる
分類アルゴリズムの学習
前回は学習データ(ClassifyMat)および評価データ(VerifyMat)の作成まで終わったので、今回は実際に学習の方を進めていきます。
学習には、MATLABの中にある分類学習器アプリを使用しました。MATLAB画面上部の「アプリ」タブから探せます。
アプリを開くと「新規セッション」のボタンがあるので、そちらから学習データを選択します。
実際の画面は下記です。変数としてClassifyMatを選択し、応答がLabel、予測子がLabel以外の7つの特徴量になっていることを確認します。
データの選択、設定ができたら「セッションの開始」ボタンを押します。
すると、早速上のような画面が表示されると思います。
次に、色々とモデルやパラメータを選んでいく必要があるわけですが、今回はざっくりと、機械学習がどれぐらい使えるのかを見たいので、「すべてのクイック学習」→「学習」の順にクリックして、おおまかな傾向を見たいと思います。
すると、上のような結果が出ると思います。左側に手法がいくつか並んでいて、それぞれ精度が表示されていると思いますが、「細かいKNN」の精度が1番高くなっているので(混同行列の結果も悪くなさそうです)、今回はシンプルにこれを使っていきたいと思います。
学習済みのモデルを使って、評価データを分類させるには、モデルをエクスポートしなければならないようです。アプリの右上「エクスポート」のボタンから、「モデルのエクスポート」を行います。
そうすると、MATLABのワークスペースに、上記で作成したtrainedModelが置かれるので、これを使って評価データを予測します。コードは下記。
YPredicted = trainedModel.predictFcn(VerifyMat(:,1:7));
また、評価データの真のクラスと、trainedModelによって予測されたクラスの混同行列を作ります。コードと結果は下記の通り。
Y = mat2cell(table2array(VerifyMat(:,end)),height(VerifyMat));
confusionchart(cellstr(Y{1,1}),YPredicted);
RightForwardに正しく分類できたものが全体の6割強という感じでした。
考察
今回、えいやで機械学習を試してみましたが、あまり深く作りこみをしていなくてもある程度の精度は得られたかなと思います(とはいえ実用化には程遠いレベルですが)。アプリ上でモデルの比較ができたので、結構サクサクと作業が進みました。
また、混合行列を見てみると、RightForwardに近い運動ほど誤分類も多くなる(右手の前方運動と後方運動は識別が難しい、右手の前方運動と左手の後方運動は識別が容易)というのは、一つ面白い結果だったなと思います。
最後に、これは手持ちのデータではどうしようもないですが、運動イメージ中の脳波を使って学習もできれば、より精度が良くなるかもしれません。
おわりに
今後、この手持ちのデータを使って、自分のできる範囲で分類の精度をあげていくには
・データ前処理のブラッシュアップ
・特徴量エンジニアリング
・最適なモデルの策定
・ハイパーパラメータの最適化
などなど、色々とやれることがあると思います。
精度をあげていく処理については、また機会があれば試してみたいと思います。