それぞれ以下の意味を持ちます。番目の特徴量は、それぞれ以下のように定義することとします。クラスA1の0回目の観測信号のZ軸角速度の最小値となります。これらの特徴量のうち、pythonで用意されていないものもたくさんあるので、まずはそれを求める関数を定義しておきます。En個別の特徴量を算出する関数ができました。続いて、7チャンネル慣性センサデータを全ての特徴量に変換する関数を定義します。]構成の出力を行います。A2について、それぞれ50観測分のデータを特徴量に変換します。sf)これで、7チャンネルのデータを16種の特徴量に変換しました。112$個の特徴量に変換されました。これは、1回の観測を112次元のベクトルに変換したことと等価です。1回の観測を112個の特徴で表現しました、ということです。A2を分類するモデルが出来上がります。特徴量の規格化¶ここらでクラスを分類するモデルを作りたいところですが、その前にもう一つやることがあります。それは、特徴量の規格化です。この必要性を認識するために、X軸加速度の平均値(クラスN、0回目の観測データ)X軸加速度の分散(クラスN、0回目の観測データ)X軸加速度のエネルギー(クラスN、0回目の観測データ)をそれぞれ表示してみます。7957436.0見るとわかるように、値のスケールがかなり違います。これではちょっとよくないことが起こります。以下の2次元の平面を考えてください。分散値この空間上で、「上に1進む」と「右に1進む」という二つの意味を考えると、それが有する物理的意味がまるで異なります。信号のバイアスを上昇させる。信号のばらつきをほんの僅かに上昇させる。このように、同じ「距離が1」でも、上方向か、右方向かにより、移動前と移動後の信号の違いがかなり違います。決定木、k近傍法、サポートベクターマシンのような多くの教師あり学習は、空間上の距離を重要な要素とみなしますし、ニューラルネットワークはそもそも値のスケールが大きすぎるとうまく学習を行うことができます。このことから、特徴量は規格化して使用します。規格化には2つの方法があります。normalization特徴量をすべて最小0、最大1とする規格化です。\}}$は該当する特徴量の最小/最大値とすると、定義は以下のようになります。normalization特徴量をすべて、平均0、標準偏差1とする規格化です。\}}$は該当する特徴量の平均/標準偏差とすると、定義は以下のようになります。A2すべてまとめて算出してください。いうのは、目的はクラスを分類することであり、実際に何らかのシステムを運用するときは、データを入力する前にはどのクラスか明らかではありません。std}$を求めても、入力データがどのクラスかわからないので、どれを使っていいのかわからなくなってしまいます。normalizationを試してみます。このため、はじめに、各特徴量の平均と標準偏差を求めます。標準偏差とすることにします。Zscore.append(temp2)規格化を行うためのパラメータ(平均と標準偏差)を求めることができました。それでは、ここで得られた値を用いて規格化を行います。Zscore[j][k][1]これで規格化が行われました。どのような値になったか、X軸加速度の分散値を3例ずつみてみます。-0.8716000近くあったX軸加速度の分散のスケールがおとなしくなりました。続いてエネルギーを見てみます。-0.9エネルギーは億を超えた値が出ていました。こちらもいい感じに規格化できています。最後に、特徴量ベクトルへと加工します。kを分離するような変数の管理をしていました。これは人間にとってはわかりやすい構造ですが、教師あり学習のモデルを構築する上で、コンピュータ側にとって、このようなわかりやすさは不要です。pythonで教師あり学習のモデルを構築する際は、1回の観測に対する特徴量を、1次元の長いベクトルに変化させる必要があります。ここではその加工を行います。今回、7チャンネル、16種の特徴量を扱っているので、合計112次元の特徴量ベクトルが生み出されます。エネルギーこれで特徴量ベクトルに加工できました。FV_N_MLには、50行112列のの数字が集まっています。どんな値が得られているのか、imshow関数と呼ばれるヒートマップを作成する関数で可視化してみます。縦軸が50回分の観測、横軸が112個の特徴量となります。これを見るだけで、正常なモータ、グリスを塗らない場合、ネジをゆるめた場合で、特徴量にどのような違いが出るか、かなりたくさんの考察ができそうです。機械学習において重要な特徴量は、以下2つを満たすものです。これは、上の3枚のグラフのある1枚に着目して、縦軸0〜50回の観測において、いずれも似たような色を持つ特徴量が有効である、という意味です。いうと、同じクラス(正常1、正常2、正常3、...)を観測しているのに、毎回違う値が出る特徴量だと、不安定となるためです。これは、当然と言えば当然です。特徴量の値に応じてクラスを分類するわけですから、異なるクラス間で同じ値を取っている特徴量は、分類に使用することができません。36と53(同クラス内でバラついておらず、異クラス間で似ていない特徴量)実際にこれを、散布図で確認してみます。0x11a4d2240>ダメな特徴量では、クラスをうまく分類することができません。よい特徴量を採用した場合は、いい感じにクラスを分類できそうなことがわかります。このような散布図を、2次元の特徴量空間と呼びます。よい特徴量をきちんと採用できた場合、かなり高精度で正常と異常を切り分けられそうです。...という感じで、かなりたくさんの考察ができそうです。研究や開発する場合は、上の3枚のマップや、散布図による特徴量空間をきちんと確認して色々と考察した方がいいと思いますが、ここではプログラムについて説明するので、先に進みます。機械学習の分野では、次元の呪いと呼ばれる問題があります。これは、採用する特徴量が多すぎると、莫大なデータセットがなくてはうまく人工知能が学習してくれず、精度がかなり低くなってしまう、という問題です。そのため、クラス分類において意味のない特徴量を積極的に削減しようとする手続きを行います。クラス分類問題を解く機械学習はたくさん種類がありますが、その多くは、特徴選択を実施してくれるアルゴリズムが導入されていません。ニューラルネットワークやサポートベクターマシンは、与えた特徴量を削減したりせず、すべて使用してクラス分類問題をときます。次元の呪いを回避して性能の良いモデルを構築したい場合、分析者が特徴選択を行う必要があります。決定木と呼ばれるクラス分類問題の解法は、特徴選択もアルゴリズムに組み込まれているので、多くの場合、分析者が特徴選択を行う必要がありません。Set、ReliefF、統計的仮説検定などがありますが、機械学習にあまり慣れてないうちは、勉強することが増えてしまうので、全ての特徴量をとりあえず使う、で良いと思います。機械学習である判定モデルを作るためには、入力に対する答えを用意してあげなくては、知能が形成されません。これまで入力を必死に求めていきました。次はそれに対する答えを用意していきます。してまとめてみましょう。(150問、ラベルが解答)という構造のデータセットができました。機械学習では、与えられた問題を正しく正答しようとすると知識が得られます。そのため、学習させれば全問正解してしまうこともほとんどです。それでは、未知のデータに正しく正解できるかわかりません。このことから、学習に使うデータと精度を評価するデータを分割させることが普通です。これで得られるデータセットを教師データ、テストデータと言います。機械学習で知能を形成させるためのデータ。学習にはこちらを使用する。このデータの誤差を訓練誤差と呼ぶ。学習により得られた知能の精度を評価するためのデータ。こちらは学習には使用しない。このデータの誤差を汎化誤差と呼ぶ。機械学習で何らかの自動判定を実現しようとする際、目的となるのは汎化誤差の最小化です。訓練誤差の最小化はあんまり意味がないので注意してください。精度評価指標とモデル選択の基礎を参照してください。以下に、教師データとテストデータを分割するコードを示します。train_test_split関数を使用します。test_sizeはテストデータの割合、random_stateは乱数のシード(変更すると結果が変わる、同じ値を使用すると毎回同じ結果が出る)です。A2を判定するモデルを構築してみます。決定木を参照してください。以下は決定木を構築するコードです。複雑な木構造が欲しい場合には、min_samples_leafに小さい整数を、単純な木構造が欲しい場合には大きい整数を与えてください。これは、木の一番下のサンプル数をその値以上にする、という制約をかけるパラメータです。学習開始どのような木構造が得られたのか、可視化してみます。可視化は以下のコードで実現できます。ImageImage(graph.create_png())Out[22]:木構造を見ると、X17とX47があることがわかります。これは、17番目の特徴量と47番目の特徴量が使用されていることを意味します。Nのクラスの観測数です。ソートされてしまうのでこういう順番になります。木構造から解釈すると、以下の傾向が見て取れます。クラスNの特徴Y軸加速度の分散が小さい。クラスA1の特徴Y軸加速度の分散が大きく、かつ、Z軸加速度のエネルギーが大きい。クラスA2の特徴Y軸加速度の分散が大きく、かつ、Z軸加速度のエネルギーが小さい。本当にこの構造なのか散布図で確認してみます。0x11d0eb4e0>今回は教師データだけでなく、テストデータも含めて可視化している点に注意してください。この結果を見ると、先ほど整理した分岐条件と一致していることがわかります。微妙な特徴量が採用されています。クラスNとクラスA2の距離が近いためです。綺麗に分離はできますが、未知のデータを入力したとき、クラスA2がクラスNの領域に入ってしまったり、あるいはその逆のことが容易に起きそうです。このようなことを避けたい場合は、異なるクラス間の距離が近い特徴量を除去した上で、決定木の学習をかける、などの対応が必要です。ところで、112個もの特徴量を与えたのに、実際に使用した特徴量はたった二つになってしまいました。決定木は、「必要最小限の情報のみできれいにクラスを分割すること」を目標としたアルゴリズムが導入されているためです。そのため、今回の分類問題においては、この2つで十分きれいに分割できる、という判断がされたわけです。問題が単純なことが原因で、決定木が簡単な問題しか解けないわけではありません。勝手に特徴量を捨てるな!と思う場合には、ニューラルネットワークやサポートベクターマシンの適用を検討しましょう。その場合は、人間に対するわかりやすさは消失するので、注意してください。先ほどの例では、リーフノード(一番下の四角)にクラスが混ざっていることはありませんでした。したがって、訓練誤差は0、教師データをすべて正しく分類できた、となります。それでは次に、学習に使用しなかったテストデータを活用して汎化能力(未知のデータに対する対応能力)を測定してみます。テストデータに対する推定結果を得るには、以下のように記述します。'A2']続いて、推定されたクラス(Y_test_est)と実際のクラス(Y_test)の結果を照合してみます。False]最後の1つだけ間違えていることがわかります。どの問題をどう間違えたのか、確認してみます。A2リストで-1を指定すると、最後の要素を取り出すことができます。今回は、A1をA2だと誤答したことがわかりました。ところで、もうちょっと詳しく精度を調べたい場合もあります。このとき、混合行列と呼ばれる結果を算出します。N)混合行列はこのような並びで作られます。対角成分に数字が大きい場合、推定クラスをそれだけ正しく判定できたことを意味します。各セルの値を見ることで、どのクラスをどのクラスと間違えたのか、構築したモデルの正誤に対する個性を詳細に知ることができます。14]]1例を除き、対角成分に集まっていることを確認できました。これらはすべて正答です。対角成分以外にある1は、上から1つ目なので実測がクラスA1、左から2つ目なので推定がクラスA2、つまりクラスA1をクラスA2と誤答したという意味があります。F値と呼ばれる精度評価方法もあります。適合率はそのクラスを正しく正答できた割合、再現率はそのクラスを取り漏らさなかった割合、F値は適合率と再現率の相乗平均として定義されます。これは、以下のコードで算出できます。