0から始める機械学習(モデルの評価・認識精度の向上編)
機械学習の記事は今回で一旦最終回。機械学習編最後にお送りするのは構築したモデルの評価と認識精度の向上について。
irisデータセットやMNISTデータセットとかは初期パラメータで学習させてもそこそこの精度を発揮できるけど、これは学習データとテストデータの特徴が似ているからであって高性能なモデルが構築出来たわけじゃない。
とはいえ実世界のデータを準備したり、学習データとテストデータに特徴が異なるデータを用意するのは難しいので、ここでは引き続きirisデータセットを使っていくよ。(自前のデータを用意出来ている方は是非そちらで!)
あと機械学習の手法については、GBDTの中で比較的に高精度かつ高性能と言われているCatBoostと、前回紹介したシンプルなDNNに対して精度の改善を目指します。
本日の内容はこちら↓
- モデルの評価方法について
- 学習データの整形
- モデルのパラメータチューニング
精度を改善するための方法として簡単に実装できるものを紹介するよ。学習データの増加(データ拡張)みたいな手間のかかるものはまたの機会に。というか自分でも取り組み切れてない。
モデルの評価方法について
まず紹介するのはモデルをどのように評価するかについて。
新しいコードはコレ↓
たったの4行だけ。これを実行すると、confusion matrix(混同行列)とclassification report(分類のレポート)が表示されるはず。
こんな感じで。
違う結果が表示されていたとしてもirisデータセットの読み込みをシャッフルしているせいだから気にしなくてok。
左上にある混同行列と下の詳細からモデルの評価を行っていくよ。
まず混同行列から。
行ごとのデータが正解データ、列ごとのデータが予測データを表してる。今回のテストデータはラベルごとの偏りが無いように割り振られているから、Setosa、Versicolour、Virginicaのいずれも15データずつあります。
表の見方としては、例えば表内左上(1行, 1列)の15という数字は ”Setosaが正解である時に、Setosaと予測されたデータの数” を表している。表内中央下部(3行, 2列)の1という数字なら ”Virginicaが正解である時に、Versicolourと予測されたデータの数” を表してます。
正解と予測の見方がごっちゃになりがちだけど、15データずつと分かっているから行ごとのデータ数、もしくは列ごとのデータ数を足してみれば分かるはず。行ごとのデータは15ずつに対して、列ごとでは15、16、 14になっているからおかしいね。
続いて分類のレポート。
precisionは予測されたデータ数のうち、正解であったデータ数の割合。
recallは正解となるデータ数のうち、実際に正しく予測されたデータ数の割合。
f1-scoreはprecisionとrecallの調和平均(噛み砕いて言うと、双方を同じ比率で考慮したもの)
となる。
例えば、Versicolour(ラベルは1)のprecisionであれば、Versicolourと予測されたデータ数は15 + 1 = 16個で、正解だったデータ数は15個だから15 ÷ 16 = 0.9375 ≒ 0.94 になるし、Virginica(ラベルは2)のrecallであれば、Virginicaが正解となるデータ数は15個で実際に予測されたのは14個だから14 ÷ 15 = 0.9333 ≒ 0.93 になったというわけ。
ちなみにsupportはそれぞれのデータの数で、accuracyは単純な認識精度。前回は各手法の評価にaccuracyを使ったけど、どの評価指標を使うかは用いるデータや重要視したい目的に沿って適宜使い分け。
コロナウイルスで例えるなら、間違えて陽性と診断される患者が多いよりも間違えて陰性と診断される患者が多い方が感染拡大につながるからrecallを重視する...的な。まあ間違えて陽性と診断される患者が多いのも問題だけど時代背景を例に説明するとこんな感じ。
評価指標についてはこちらの記事により分かりやすく書かれています。
学習データの整形
想像以上にモデルの評価の記事が長くて飽きてきたと思うから、ここからは巻きで。
数多ある学習データの整形方法から選ばれたのは、正規化と標準化。基礎中の基礎と言ったとこだね。
コードは以下↓
正規化と標準化はどちらか一方を適用して学習データとして用います。一応GBDT手法では正規化も標準化も結果に影響を与えないので、実際に動かしてみたい場合にはDNNに入力しよう。詳しくはググってみてね。
モデルのパラメータチューニング
パラメータチューニングも色々な項目があるけれど、今回はlearning rate(学習率)についてだけ。
CatBoostでは学習率はparamsの中にlearning rateを設定するだけ。
DNNではrateの値を変更するだけ。
学習率は0 ~ 1の範囲で設定可能で、基本的には値が大きいほど学習時間が短くて精度は低くなるし、値が小さいほど学習時間が長くて精度が高くなる傾向にある。
はしょりすぎたけど許して。
これにて機械学習編はひとまず完結。webアプリ開発のためにPythonとDjangoの参考書買ったから、勉強進めつつブログもぼちぼち進めていきま〜す。
それでは!ノシ