0から始める機械学習(モデルの構築編)
特殊能力を身につけた。
1時間弱もあるデータのラベル付してたら波形を見るだけでどんな音が鳴ってるかなんとなく分かるようになってきた。
こんな風に波形が長方形っぽくなってたらブザーの音だし、
こんな風に突然大きな音から尻すぼみになっていく形ならホイッスル鳴ってんな〜って雰囲気で分かる。
え?こんな能力要らなくないって? 確かに要らん。
しかも色んな音が同時に鳴ることがほとんどだから波形にバラつきあるしね。でもあと1時間分のデータにラベル付しないといけないからそれまでは役に立つ能力。
それはさておき、今回は用意したデータを使って機械学習のモデルを構築します。本来はSVMとかが有名だけど、ここでは決定木を勾配ブースティングを使って学習させるGBDT手法を3種類と、ビッグデータが集まる現代では欠かせないDNNを実装していくよ。
今回実装する一覧↓
- XGBoost
- LightGBM
- CatBoost
- DNN(かなり簡単でベーシックなやつ)
それぞれの手法の強み・弱みとかの特徴はあるけど、それらについては置いといて実装だけ。
前回、中級者向けに紹介したデータの準備方法を使った方のために、csvファイルからデータを読み込んで変数に保存するためのコードも始めに紹介します。
コードは以下の通り。
※前回作成したcsvファイルの読み込みしか出来ません。他の作り方で作成されたcsvファイルを読み込むためには中身を変更する必要があります。
上のプログラムは学習データ作成用。テストデータの作成にはプログラム内のtrainという文字をtestに書き換えればok。
XGBoost
XGBoostを使うためにはその名の通りxgboostライブラリのインストールが必要。Anaconda-Navigatorからはインストール出来ないから、ターミナルとかからコマンドを打ってインストールする。
JupyterLabでは、左上の File → New → Terinalと選択してターミナルを開いて、
ターミナルに conda install -c conda-forge xgboost と入力するだけ。本当に実行しますか?みたいなの聞かれるからyを入力すればインストールしてくれる。
sklearn(scikit-learn)とかmatplotlibがインストールされてない人は conda install scikit-learn だったり conda install matplotlib をターミナルに入力すればok。
"インストールしたいライブラリ名 conda" って検索するとどのライブラリについてもインストール方法が載ってる。
ちなみにプログラムについてはGithubに後でアップしておこうと思う。記事の中にコード埋め込む方法分かんない。
XGBoostのコードはコレ↓
プログラムの説明は省くよ。
実行結果はこんな感じ。
Accuracyってとこに今回のモデルがどのくらいの精度で分類できるかが表示されるよ。
irisデータを学習データとテストデータに分ける時にシャッフルしてるから実行する度に結果は多少変動するけど、ほとんどの場合90%以上の精度が出てきます。
精度の下に表示されてる学習曲線は、基本的に時間(rounds)が経つにつれて下に降りていくような見た目なら問題なし。ただし青線は綺麗なカーブ描いてるのにオレンジの線がジグザグだったり途中から上に曲がってたりすると、過学習が起きてる可能性アリ。これについては次回詳しく。
LightGBM
LightGBMのコードはコレ↓
既にインポート済みのライブラリは書かなくてもok。
XGBoost同様、ターミナルに conda install -c conda-forge lightgbm と入力するだけ。本当に実行しますか?みたいなの聞かれるからyを入力すればインストールしてくれる。
プログラムの説明は省くよ。
実行結果はこんな感じ。
色々なサイトを調べてみたけど学習曲線の表示法が分からんかった...。XGBoostと比べて結果の表示が多いかもしれない。あと結果の収束にも時間がかかってる。
Accuracy_scoreってとこに今回のモデルがどのくらいの精度で分類できるかが表示されてる。今回は91.7%の精度だね。
CatBoost
CatBoostのコードはコレ↓
ターミナルには conda install -c conda-forge catboost と入力しよう。
ライブラリは新しく必要なのだけ書いてる。
プログラムの説明は省くよ。
実行結果はこんな感じ。
結果はAccuracyに。93.3%の精度。
DNN
DNNのコードはコレ↓
今回はDNNの実装にtensorflowを使ったから、ターミナルに conda install -c conda-forge tensorflow と入力する。
(長くなって切れてしまった。)
プログラムの説明は省くよ。
実行結果はこんな感じ。
結果は97.8%になりました。
irisデータセットを使った今回の結果では、DNNが97.8%という最高の精度が出たね。ただしirisデータを学習データとテストデータに分割するときにシャッフルしたり乱数シード(乱数を生成する種)に依存して結果は変わるので、今回の結果はどの手法が良いというわけではないよ。
プログラムの注意点として、XGBoostとかLightGBMのnum_classが4になってるけど、irisデータセットはラベルの種類が3種類だから多分正しくは3。DNNのnum_of_typeも同様に。
特徴量にMFCCを使う場合にはDNNのn_featuresも24にしないといけない。DNNは特に入力とか出力の形式を正しくしないと上手くいかないから気をつけよう。
またしても長くなったけどモデルの構築方法について紹介しました!
次回は機械学習の解説最後となる認識精度向上編。
と言っても自分も初心者だから説明は基礎的なものだけで。
機械学習についての記事が終わったら、webアプリ開発とか機械学習使った株価・仮想通貨の予測とかを書こうかな。
書籍だったりwebの記事を参考に勉強していくつもり。
それではまた次回!!