【Python】IMUデータ分類ミス多発の解析<SVM決定境界線の表示方法>

IMUの機械学習プログラムをいろいろいじってますが、SVMの判定ミスが多発していて、分類アルゴリズム SVM linearが良いのか判断がつかない状態にハマってます。入力データが悪いのか、アルゴリズムの設定が悪いのかいろいろあるので、一歩一歩確認できるようにしていく以外にないです。
環境の整備からライブラリのインストールまで、1週間がかりで、いろいろいじってました。教科書も入手しました。Pythonで始める機械学習
まず、入力状態を視覚化するために、IMUを振ったあとに散布図とみれるようにしました。モデルとなる生データをしっかり確認できます。更に、テスト中の生データも確認できて、それなりに、分類できる振り方をしているのですが、なぜか、SVMが分類を正確にしてくれません。機械学習の正常動作が確認できない状態が続いてます。
そこで、モデルを作成した結果として、散布図に境界線を表示できるグラフを追加するために、WEB検索しまくりました。
●seaborn-analyzerを発見

QIITAにありました。作者はKENTA NAKAMURA様という方で、感謝です。
https://qiita.com/c60evaporator/items/43866a42e09daebb5cc0

見つけたの良かったのですが、これを走らせる方法がわからないので、
未だIMUでの決定境界線をプロットできてないので、来週も悪銭苦闘しそうです。

以下備忘録しておきます。
●学習環境は2種類用意

①jupyter notebook  と anaconda
python学習の環境は、2種類用意します。解説記事が、jupyter notebookを使って説明しているもの(コードの頭にIN[]と行番号がついている)が多いのでその場合は、anacondaをインストールして、必要なライブラリーを全部インストールされますので、それからコマンドプロンプトで > jupyter notebook とキーインするとブラウザが(ChromeかEdge)立ち上がりますので、Jupyter Noteをnew してpython3で セルラインずつ1ステップずつ実行することで学習をしていきます。jupyter notebookは、実用的なプログラムを走らせる環境でなく学習の
1ステップ実行する特別な環境です。

②元祖pythonとpycharm (私のよく使う環境)
 pythonのオリジナルをインストールしてから、https://www.python.org/
IDEであるpycharmをインストールして、pycharm community を使います。
https://www.jetbrains.com/ja-jp/pycharm/download/?section=windows
このダウンロードページの下のほうに無料のcommunity版がありますので、そちらをダウンロードします。
プロジェクトを作って、コードを作りrunとdebugをして作成します。
ほとんどの操作をマウスでできるので、コマンドプロンプトで命令をキーインするのが嫌な方には良いです。

●pycharmへの外部ライブラリーインストール
参考にさせていただいたサイト https://zero-cheese.com/2956/

 

①プロジェクトのFILE ->  Settingを開く

②パッケージを選択する画面をだす
Setting窓のProject:現在のプロジェクト名 をクリックして、Python Interpreterをクリックすると
available package という窓が現れます。

 

③今回のライブラリーをインストールしてみます。
available package窓の検索ボックスへ seaborn-analyzer と入力して下のinstall ボタンを押すと始まります。

インストールは、ライブラリの大きさで時間がうんとかかる場合もあります。
下記画面になればインストール成功です。

●seaborn-analyzer サンプルコード実行 (iris datasetを使ってます)
QIITAのページにあるサンプルコードをコピーしながら実行確認します。
https://qiita.com/c60evaporator/items/43866a42e09daebb5cc0
注意;サンプルコードには、動かすために必要なコードが無い場合が多い
  コピペしてもエラーがでるとか、グラフが表示されないことが多い。
そのため、一歩前に戻って、確実に動作するコードを走らせてみてから

 サンプルコードがとの違いを確認する作業が必要です。
今回の場合は、

import seaborn as sns

iris = sns.load_dataset(“iris”)
sns.scatterplot(x=‘petal_width’, y=‘petal_length’, data=iris, hue=‘species’, palette=[‘green’, ‘red’, ‘blue’])

これではグラフ出ないので 赤文字のコードを2行追加します。seabornの場合は、matplotlib上で動作するので、赤文字がないとグラフが現れません。

import matplotlib.pyplot as plt
import seaborn as sns
iris = sns.load_dataset("iris")
sns.scatterplot(x='petal_width', y='petal_length', data=iris, hue='species', palette=['green', 'red', 'blue'])
plt.show()

これで、グラフがでます。plt.show()でグラフがでるとそこで、プログラム止まってますので
グラフを閉じれば次のコードが走ります。

このグラフのデータをSVMで分類してモデルを作ります。
サンプルコードを上のコードの下にコピーペーストします。

# %% サポートベクターマシン分類して性能評価指標算出
from sklearn.svm
import SVC from sklearn.metrics import accuracy_score, f1_score
X = iris[[‘petal_width’, ‘petal_length’]].values # 説明変数
y = iris[‘species’].values # 目的変数(3種類のアヤメ種類)
clf = SVC() # SVM分類用インスタンス
clf.fit(X, y) # 学習
y_pred = clf.predict(X)# 推論
print(f‘Accuracy={accuracy_score(y, y_pred)}) # 正解率を表示

print(f‘F1={f1_score(y, y_pred, average=“macro”)}) # F1-Macroを表示

上記コードの結果
Accuracy=0.9533333333333334
F1=0.9532912954992826

これで、学習結果の精度がでてきますが、数値だけではデータとの関係が見えないので、次に境界線をだします。
サンプルコードにplt.show()を追加しないとグラフは現れません。

from seaborn_analyzer import classplot

clf= SVC()

classplot.class_separator_plot(clf, [‘petal_width’, ‘petal_length’], ‘species’, iris)

plt.show()

これの結果

境界線が、赤と青でだぶっている部分があるのでその辺のデータだと分類ミスが発生することが判ります。

●以後
IMUを振った場合のSVMのミスった時の境界線がどうなっているのかをグラフにしながら、機械学習の
勉強をしていきます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です