わかめ’s diary

エンジニア見習いがちょっとずつITを学んでいきます

0から始める機械学習(モデルの構築編)

特殊能力を身につけた。

 

1時間弱もあるデータのラベル付してたら波形を見るだけでどんな音が鳴ってるかなんとなく分かるようになってきた。

 

ブザーの波形

ブザーの波形

こんな風に波形が長方形っぽくなってたらブザーの音だし、

 

ホイッスルの波形

ホイッスルの波形

こんな風に突然大きな音から尻すぼみになっていく形ならホイッスル鳴ってんな〜って雰囲気で分かる。

え?こんな能力要らなくないって? 確かに要らん。

しかも色んな音が同時に鳴ることがほとんどだから波形にバラつきあるしね。でもあと1時間分のデータにラベル付しないといけないからそれまでは役に立つ能力。

 

それはさておき、今回は用意したデータを使って機械学習のモデルを構築します。本来はSVMとかが有名だけど、ここでは決定木を勾配ブースティングを使って学習させるGBDT手法を3種類と、ビッグデータが集まる現代では欠かせないDNNを実装していくよ。

 

今回実装する一覧↓

  • XGBoost
  • LightGBM
  • CatBoost
  • DNN(かなり簡単でベーシックなやつ)

 

それぞれの手法の強み・弱みとかの特徴はあるけど、それらについては置いといて実装だけ。

前回、中級者向けに紹介したデータの準備方法を使った方のために、csvファイルからデータを読み込んで変数に保存するためのコードも始めに紹介します。

 

コードは以下の通り。

前回作成したcsvファイルの読み込みしか出来ません。他の作り方で作成されたcsvファイルを読み込むためには中身を変更する必要があります。

csvファイル読み込みプログラム

csvファイル読み込みプログラム

上のプログラムは学習データ作成用。テストデータの作成にはプログラム内のtrainという文字をtestに書き換えればok。

 

XGBoost

 

XGBoostを使うためにはその名の通りxgboostライブラリのインストールが必要。Anaconda-Navigatorからはインストール出来ないから、ターミナルとかからコマンドを打ってインストールする。

JupyterLabでは、左上の File → New → Terinalと選択してターミナルを開いて、

 

JupyterLabでのターミナルの開き方

JupyterLabでのターミナルの開き方

ターミナルに conda install -c conda-forge xgboost と入力するだけ。本当に実行しますか?みたいなの聞かれるからyを入力すればインストールしてくれる。

 

sklearn(scikit-learn)とかmatplotlibがインストールされてない人は conda install scikit-learn だったり conda install matplotlib をターミナルに入力すればok。

"インストールしたいライブラリ名 conda" って検索するとどのライブラリについてもインストール方法が載ってる。

ちなみにプログラムについてはGithubに後でアップしておこうと思う。記事の中にコード埋め込む方法分かんない。

 

XGBoostのコードはコレ↓

ライブラリのインポート

ライブラリのインポート

XGBoostのプログラム

XGBoostのプログラム

プログラムの説明は省くよ。

実行結果はこんな感じ。

 

プログラムの実行結果

プログラムの実行結果

Accuracyってとこに今回のモデルがどのくらいの精度で分類できるかが表示されるよ。

irisデータを学習データとテストデータに分ける時にシャッフルしてるから実行する度に結果は多少変動するけど、ほとんどの場合90%以上の精度が出てきます。

精度の下に表示されてる学習曲線は、基本的に時間(rounds)が経つにつれて下に降りていくような見た目なら問題なし。ただし青線は綺麗なカーブ描いてるのにオレンジの線がジグザグだったり途中から上に曲がってたりすると、過学習が起きてる可能性アリ。これについては次回詳しく。
 

LightGBM

LightGBMのコードはコレ↓

既にインポート済みのライブラリは書かなくてもok。

XGBoost同様、ターミナルに conda install -c conda-forge lightgbm と入力するだけ。本当に実行しますか?みたいなの聞かれるからyを入力すればインストールしてくれる。

ライブラリのインポート

ライブラリのインポート

LightGBMのプログラム

LightGBMのプログラム

プログラムの説明は省くよ。

実行結果はこんな感じ。

 

プログラムの実行結果

プログラムの実行結果

色々なサイトを調べてみたけど学習曲線の表示法が分からんかった...。XGBoostと比べて結果の表示が多いかもしれない。あと結果の収束にも時間がかかってる。

Accuracy_scoreってとこに今回のモデルがどのくらいの精度で分類できるかが表示されてる。今回は91.7%の精度だね。

 

CatBoost

CatBoostのコードはコレ↓

ターミナルには conda install -c conda-forge catboost と入力しよう。

ライブラリのインポート

ライブラリのインポート

ライブラリは新しく必要なのだけ書いてる。

CatBoostのプログラム

CatBoostのプログラム

 

プログラムの説明は省くよ。

実行結果はこんな感じ。

 

プログラムの実行結果

プログラムの実行結果

結果はAccuracyに。93.3%の精度。

 

DNN

DNNのコードはコレ↓

今回はDNNの実装にtensorflowを使ったから、ターミナルに conda install -c conda-forge tensorflow と入力する。

ライブラリのインポート

ライブラリのインポート

DNNのプログラム その1

DNNのプログラム その1

DNNのプログラム その2

DNNのプログラム その2

 

(長くなって切れてしまった。)
プログラムの説明は省くよ。

実行結果はこんな感じ。

 

プログラムの実行結果

プログラムの実行結果

結果は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の記事を参考に勉強していくつもり。

 

それではまた次回!!