sklearn:機械学習モデルを評価 混同行列・交差検証・ROC・AUC

model_evalation

今日は機械学習モデルの評価について考えてみます。

機械学習モデルの評価

訓練したモデルに対して、新しいデータが入ってきたときに、データのカテゴリをどれだけ正確に当てられたかが、その訓練済みモデルの性能になりますよね。

カテゴリの分類精として、下記4つの確率的な指標があります。

  1. 度適合率 Precision = tp / (tp + fp) :予測するクラスをなるべく間違えないようにする指標
  2. 再現率 Recall = tp / (tp +fn )
  3. F値  F-Value = 2/((1/適合率)+(1/再現率)) :適合率と再現率の調和平均
  4. 正解率 (tp+tn)/(tp+fp+fn+tn) :予測と実績が一致したデータの割合

で、これを一つの行列にまとめたのが、
混同行列 Confusion matrix

というものです。

各変数になっていのは

  • tp : True-Positive 正例Positiveと予測して、正解Trueだった
  • fp : False-Positive 正例Positiveと予測して、不正解Falseだった
  • fn : True-Negative 負例Negativeと予測して、正解Trueだった
  • tn : False-Negative 負例Negativeと予測して、不正解Falseだった

という結果の数が入ります。

統計用語が入っていますが、

  • 正例:興味のある事柄のクラスに属するデータ
  • 負例:興味のない事柄のクラスに属するデータ

ということです。

アイリスデータをSVMで分類する

混同行列を見ていきたいので、まずはサンプルデータとしてアイリスデータをSVM分類し、予測結果まで実行してみます。

混同行列を算出する

基本的には適合率が高いものが優秀と考えています。

再現率も考慮して 適合率と再現率の間を取るのがF1という値です。

こんな形のマトリクスで出力されます。

層化k分割交差検証

もともとのデータをk個の塊に等分して、訓練用データと検証用データの組み合わせをkパターン用意して、kパターンすべてについて一気に交差検証をする方法です。

ROCとAUC

予測確率の正確さを見ていく方法です。

  •  ROC曲線:Receiver Operating Characteristic
  •  AUC : Area Under the Curve

確率の高い順にデータを並べる
確率以上のデータはすべて正例と予測する

実際に正例だったデータの割合(真陽性率)
実際は負例にも関わらず正例と予測されたデータの割合(偽陽性率)

正例と予測する確率のしきい値を変えていったときに真陽性率を横軸、
偽陽性率を縦軸にとったものがROC曲線

次に AUC曲線 Area Under the Curveですが、要するにROC曲線の面積のことです。1に近いほど正例、0.5に近づくほど正例と負例が混在していて分類できなくなるという意味があります。

ROC曲線と AUCを素早く求めて見ましょう

参考

機械学習の評価指標 – ROC曲線とAUC

 

 

sklearn:主成分分析をやってみる

principal_component_analysis

主成分分析です。

高次元データに対して、ばらつきが大きくなる方向を見極め、次元を落とす方法です。

まずはサンプルデータを作ってプロットしてみます

で、これを主成分分析すると

となり、軸PC1方向にデータは散らばっているが軸PC2にはあまり散らばっていないことがわかるわけです。って、可視化すると当たり前ですよね・・・。

いずれ必要になったときに、次元削減関係は深堀りしていきますので、今日はただのメモ書きになりました。

sklern:ボストンデータを重回帰分析 

今日は ボストンの不動産データを使って重回帰分析をしてみましょう。

一気にいきます。

データ読み込み 訓練検証データに分割 機械学習モデル定義 訓練 予測

相関グラフ

横軸に予測結果 縦軸に実際のデータをプロットしています。右肩上がりのまあまあな相関が取れていますが、外れ値を除いても0.5~1.5倍のばらつきがあるようです。

以上

sklern:ランダムフォレストでアイリスデータを分類してみる

random_forest

前回は決定木一本でアイリスデータを分類してみましたが、決定木のハイパーパラメータ次第では性能が異なってきます。

このハイパーパラメータ自体の決定も自動化する方法がランダムフォレストです。

データセット読み込みからデータ分割まで

ここはいつもどおりです。

 

ランダムフォレストで決定木を100本作成して訓練する

さあ予測して性能を確認しましょう。

 

変数resultは

になりました。97%あってますね。

ということで、100本分の決定木を一気に評価できたわけです。

Python : graphvizのインストール方法

意外と面倒なgraphvizのインストール方法をメモっておきます。

graphvizのインストール

最初に行っておきますけど。

$ pip install graphviz じゃだめでしたよ!!

警告

InvocationException: GraphViz’s executable “C:\Program Files (x86)\graphviz-2.38\release\bin\dot.exe” is not a file or doesn’t exist

 

どうやらdot.exe にパスを通しなさいと警告がでるのですが、そもそもpip install された 先がわかりませんでした。作戦変更です。

graphviz 公式サイトからのインストール

graphvizの公式webサイト

https://graphviz.gitlab.io/_pages/Download/Download_windows.html

からgraphvizのインストール graphviz-2.38.zip をダウンロードして展開するとreleaseというフォルダが作成されます。

C:\\Program Files (x86)\\ の下に 新規でgraphviz-2.38フォルダを作成して、そのさらに下にreleaseフォルダを移動します。

結果、dot.exeが

C:\\Program Files (x86)\\graphviz-2.38\\release\\bin\\dot.exe

の位置になります。(インストーラーがなさそうなので、フォルダ移動だけです。)

システム環境変数の追加

ではパスを通しましょう。

windowsボタンをおして検索に「システム環境変数」と入れます。システムのプロパティが開くので、環境変数ボタンを押して、システム環境変数のpathを編集します。

新規ボタンを押して、さっきのdot.exeのパスである

C:\\Program Files (x86)\\graphviz-2.38\\release\\bin\\dot.exe

をコピペします。

 

これでgraphvizが使えるようになったと思います。

以上、これで幸せになりました。

sklern:決定木でアイリスデータを分類してみる

decision_tree decision_tree.ipynb

決定木を使ってアイリスデータを分類してみます。

基本手順

基本手順はsklearnや他の機械学習モジュールであるtensor flowなども全く一緒です。

  1. データの読み込み
  2. 訓練用データと検証用データに分割
  3. 機械学習モデルの定義とハイパーパラメータの設定
  4. 訓練
  5. 予測
  6. 性能評価

必要なモジュール

インストールしておきましょう。

$ pip install pydotplus

graphvizもインストールしておきましょう。

graphviz もインストールしておきます。別ページにしておきますので、予めやっておく必要があります。当ページの最後の方にも同じ内容を記載しておきます。

スクリプト

データの読み込み~訓練 までです。

予測して、性能を評価します。

では、決定木を可視化してみましょう。

graph.write_png(‘tree.png’) で決定木のグラフはホームディレクトリに出力されていますので、眺めてみましょう。

 

graphvizのインストール

さて、これでうまく行かない人もいるのでしょうか。

上記スクリプトの中にも注意書きを書いていたのですが、graphvizを予めインストールしておく必要があります。

しかし、pip install graphvizしても

&pip install graphviz だけでは graph.write_png(‘tree.png’) の部分が実行されません。

どうやらdot.exe にパスを通しなさいと警告がでるのですが、そもそもpip install された 先がわかりませんでした。作戦変更です。

graphviz 公式サイトからのインストール

graphvizの公式webサイト

https://graphviz.gitlab.io/_pages/Download/Download_windows.html

からgraphvizのインストール graphviz-2.38.zip をダウンロードして展開するとreleaseというフォルダが作成されます。

C:\\Program Files (x86)\\ の下に 新規でgraphviz-2.38フォルダを作成して、そのさらに下にreleaseフォルダを移動します。

結果、dot.exeが

C:\\Program Files (x86)\\graphviz-2.38\\release\\bin\\dot.exe

の位置になります。(インストーラーがなさそうなので、フォルダ移動だけです。)

システム環境変数の追加

ではパスを通しましょう。

windowsボタンをおして検索に「システム環境変数」と入れます。システムのプロパティが開くので、環境変数ボタンを押して、システム環境変数のpathを編集します。

新規ボタンを押して、さっきのdot.exeのパスである

C:\\Program Files (x86)\\graphviz-2.38\\release\\bin\\dot.exe

をコピペします。

 

これでgraphvizが使えるようになったと思います。

補足:graphviz  のpipインストール ではだめです

なにやら graphviz-0.12 というバージョンがおかしなことになっているものが入ってきました・・・。

ということで、前述した公式サイトからダウンロードしてファイルを移動してパスを通して・・・という方法が良いのです。以上

 

VR:はじめてのOculus quest 開発

こんにちは Keita_Nakamori(´・ω・`)です。

ついに始まりましたOculus quest 開発。やっていきましょう。

開発者モードにする

  1. まずは、Mirage Solo でもやったように、開発者モードに切り替えます。
  2. Oculus の初期セットアップのときにスマホへOculusアプリをインストールしているはずですので、起動しましょう。
  3. スマホ右上の設定ボタンをおして、近くにあるOculus Quest xxxxxxxxxxx がアクティブになっているのでタップすると接続済みになります。
  4. 近くにあるOculus Quest xxxxxxxxxxx>その他の設定>開発者モード をタップしましょう。
  5. スマートフォンにインストールされたOculus アプリからOculus Questの開発者モードを許可します。
  6. このとき、組織名を登録しなくてはなりません。NDAがどうたらとか確認ボタンを押してください。組織名はカッコいい名前をつけてください。管理者とか開発者の名前も登録できるようですが、よくわからないので無視しました。OKボタンとか確認ボタンもないので普通にスルーです。
  7. その後PCとOculus Questを接続すると、Oculus Quest側にUSB接続を許可しますか、というメニューが出るので、OKしましょう。
  8. これでPCからOculus Questのライブラリフォルダにアクセスができるようになりますのでアプリのインストールファイルであるapkファイルをこのルートで設置することができます。が私はやりません!!

Buid and Run してみる

  1. Mirage Solo 用のUnity Project があったので、Oculus Quest用に改造します。
  2. Unityを起動してAssetsStoreからOculus Integrationをダウンロードしインポートします。終わったらなぜかUnity がRestartしました・・・。
  3. Project内にあるAssets/Oculus/VR/Prefabsの中にあるOVRCameraRigをHierarchyに追加し、Main Cameraを削除しておきます。
  4. OVRCameraRigにアタッチされたOVR ManagerのTargetDevicesをQuestに変更します。
  5. ProjectSettingsのPlayerの設定でMinimum API LevelをAndroid4.4(API level 19)に設定します。
  6. ビルドはFaceBookではなくてAndriodのままでOKです
  7. ではBuid and runしてみましょう。

さあ、Oculus Questを覗いてみてください。ひとまず見るだけはできる状態になっているはずです。

 

VR:Mirage Solo で視界共有(画像出力)

えー、Keita_Nakamori(´・ω・)です。

Mirage Solo の画像をみんなで共有するために外部のディスプレイやプロジェクタへ出力する方法を調べてみました。

Chrome Castを使えば出来る

Chromecast 3 または Chome Cast Ultra という、スマホの画面をテレビに無線でミラーリングするデバイスがありまして、これをテレビのHDMI入力に挿して、スマホからWifiで映像を送るというものだそうです。

Amazonで2000円前後のものがありますが、それは最新のものではありませんので注意です。

Mirage Soloも中身がほぼスマホですから使えるというわけであります。

Mirage Solo ディスります

しかし、現在ではスタンドアロンで6DOFといえば、Mirage Soloの独壇場ではありません。Oculous questがすでに発売されており、コントローラーやSDK、ソフトウェアタイトルなど、Mirage Soloは過去の産物となりつつあります。

Mirage Soloもそれに対抗するために開発者向けのキットとして、新しいコントローラーを出していますが、一般に手に入るのはいつになるかわかりませんので絶望しかありません。

よって、今後はVR開発をOculous questでやっていくことにしました。

Oculous quest の画像出力

Oculous quest の画像出力に関しては、scrcpyを使う方法があります。

https://qiita.com/Tomoyuki_Mikami/items/183be9b0698ee00f7fac

https://github.com/Genymobile/scrcpy

または、こちらもChrome Castが使えますので、お好みでどうぞ。

今後のOculous quest VR開発 で参考にしたいサイト

では、今後Oculous Questで VR開発を継続していきます。

Oculus Quest向けアプリの個人開発は可能か? 実機で確かめてみた

 

アリーヴェ デルチ。(´・ω・)

VR:シーンをAppボタンでリセットする

モジュールUnityEngine.SceneManagementを使ってシーンをリセットしてみます。

ごみオブジェクトが溜まりすぎたときは一気に消去できて便利です。

DayDreamコントローラーのAppボタンが押されたとき、シーンがロードされます。

GvrControllerInput.AppButtonDownとSceneManager.LoadScene(0)を使っています。

スクリプト(Reset.cs)

これを、ヒエラルキーのどこでもいいのでCreate Empty してAdd Component>Reset.cs を指定すれば、当該スクリプトが発動します。

以上でございます。(´・ω・`)

VR:オブジェクトの重力落下、衝突、再実体化、破壊

こんにちは、Keita_Nakamori(´・ω・`)です。

今日は、オブジェクトの重力落下、衝突、最実体化、破壊までをやってみましたのでメモっておきます。

モデルの作成

まずはモデルの作成ですが、滑り台とシュートを作っていきました。

それぞれ、Create Emptyし、その中に部品を配置し一つの塊にしました。

その際、今回のモデルは斜面なので、なるべく簡単に調整できるよう、一旦、水平に作成したものをプレハブ化してPrefabsフォルダに保存し、ヒエラルキーへ呼び出したあとに、Rotationで斜面にするというやり方を採用しました。

さらに、後ほど再実体化(Instantiate)するときの出現位置を設定するために、予めプレハブ構成の中に、出現位置としてオブジェクトをひとつ配置しておくことで、指定が簡単になるメリットがありました。(結構重要)

 

重力落下と衝突面の定義

重力の定義は、オブジェクトに対してAdd Component>rigid body でUse GravityをONにすれば重力1Gが定義されます。

  • 質量Mass=0.01kg
  • 進行方向抵抗Drag=0
  • 回転抵抗Angler Drag=0

としました。

衝突面の定義は、オブジェクトに対してAdd Component>Mesh Collider で定義できます。注意ですがここでIs Triggerにチャックを入れてはダメです。これは接触を検知したら別のスクリプトを走らせるためのものなので、逆に接触しなくなります。(非常にわかりにくい。)

MeterialへはPysicalMaterialとして予め作成したPM010を定義しました。

再実体化(Instatiate)

オブジェクトを再出現させるところをやっていきます。

Crate EmptyでGameControllerという名前にして、そこにAdd Componentで再出現スクリプト(Summon.cs)をアタッチする作戦で行きます。

スクリプト(Summon.cs)

DayDreamコントローラーのメインボタンを押すと発動するように作成しました。

GameControllerのインスペクター

スクリプトのおかげで、Summon ObjectとSummon Positionをインスペクターから定義できるようになっているはずです。

Summon Objectには出現位置として使用し、InstatiateするオブジェクトをAssetsのPrefabからドラッグします。ヒエラルキーから持ってくるとうまく再実体化できませんでした。

Summon Psition にはプレハブモデルの中にひとつだけ搬送ワークを設置していますので、それをヒエラルキーからアタッチして座標を取得します。

やってみましょう

ここで問題発生です。オブジェクトが増えるとFPSが極端に下がってしまいます。

オブジェクトの破壊

出現から一定時間後に自動的に破壊されるようにスクリプトを追加します。

スクリプト(TimeLimitObj.cs)

 

オブジェクト自身にインスペクターからAdd Component>TimeLimitObj をアタッチして、Life_timeに例として60(秒)などと入力します。

結果、60秒後には全てのオブジェクトが消滅します。

次回の課題

VR(Mirage Solo)の視界を他者も共有できるようにしたい。

まともな人間のアセットを配置したい・・・