機械学習手法「ランダムフォレスト」でクラス分類にチャレンジしよう

フクロウ
書いた人 フクロウ

Deep Learningのようなパワフルな機械学習モデルもいいですが、もっと手軽なモデルがたくさんあります

Pythonとscikit-learnで手軽に機械学習を体験しちゃいましょう!

この記事で紹介する機械学習モデルは「ランダムフォレスト」です。

この記事でわかること

  • ランダムフォレストとは
  • ランダムフォレストの使い方
  • ハイパーパラメータのチューニング方法

機械学習アルゴリズムの一つに「決定木」というものがありますが、これを使ったアンサンブル学習の一つとして有名な「ランダムフォレスト」については広く使われる有名なモデルです。

「ランダムフォレスト」を使いこなして一歩進んだデータ解析を行いましょう。

この記事のコードはPython 3.6.7、scikit-learn 0.19.2で動作確認しました。

ランダムフォレストとは

ランダムフォレストは機械学習モデルの一つです。

クラス分類、回帰、クラスタリングなどに利用する事ができます。

複数の決定木を使って各決定木の予測結果の多数決で結果を求める方法です。

このように複数のモデルを使って性能を上げる学習方法をアンサンブル学習といい、ランダムフォレスト以外にも広く使われています。

もっと詳しく知りたい方は、参考書や侍エンジニア塾のマンツーマンレッスンを試してみてください。

ランダムフォレストの使い方

目的

scikit-learnを使って簡単にランダムフォレストを試しましょう。

ここではscikit-learnのdigitsデータセットを使ってクラス分類を行います。

ライブラリのimport

まずはライブラリを読み込みましょう。

4行目のimportがここで使うランダムフォレストのクラスです。

scikit-learn(以下sklearn)には

  • RandomForestClassifier
    • クラス分類用(今回はこっち)
  • RandomForestRegressor 
    • 回帰分析用

の二種類のランダムフォレストクラスがあるので、目的にあったものを使いましょう。

データの読み込み

データを読み込みます。

読み込みはdatasets.load_foo()関数で行います。

その次の行は読み込んだデータを

  1. 教師データ
  2. テストデータ
  3. 教師ラベル
  4. テストラベル

に分割するコードです。

ここで、train_test_split関数のtest_sizeに与えた値がテストデータの割合になるので注意してください。

ここで読み込んだデータは8×8のピクセルがある手書き文字でした。

実際に表示してみてみましょう。

ここでは25個のデータを可視化してみました。

この画像を、ラベルの数字をクラスとしてクラス分類を行うのが目的です。

ランダムフォレストモデルの学習

sklearnでのランダムフォレストの使用は非常に簡単です。

  1. sklearnの機械学習モデル(ランダムフォレスト)のインスタンスを作成する
  2. 教師データと教師ラベルを使い、fitメソッドでモデルを学習
[出力結果] この設定だと、ランダムフォレストのハイパーパラメータ(インスタンスを作る際の引数)は最低限で、ほぼデフォルトのままで行っています。

fitメソッドをキックした段階で学習が始まるので、普通ならば一瞬で学習が終わります。

学習済みモデルの評価

実際に学習したモデルの評価を行いましょう。

まずはaccuracy(正答率)を見てみましょう。

正答率は

で計算できます。

sklearnではscoreというメソッドで簡単に計算しましょう。

チューニングを行っていないランダムフォレストでも94%の正答率になることがわかります。

また、予測ラベルだけが欲しい場合はpredictメソッドを使います。

これでpredicted_labelsにはtest_labelsと同じサイズの配列が保存されました。

実際に可視化して結果を詳しく見てみます。

この図はテストデータと予測ラベル、そしてテストラベルを示しています。

赤色になっているものは誤答です。

これでも十分良い成果だと思いますが、もう少し性能を上げる方法を考えてみましょう。

ハイパーパラメータをチューニング

グリッドサーチとは

先程の方法では、ランダムフォレストのハイパーパラメータを全くチューニングしませんでした

ここではハイパーパラメータのチューニングをグリッドサーチと呼ばれる方法で行います。

ランダムフォレストなどの機械学習モデルは、ハイパーパラメータの設定を変えると性能が大きく変わることがあります。

ですがどのような設定にすればいいのかは、経験則で決めることが多いです。

これを自動で探索してしまう方法がいくつかありますが、その中でも一番愚直な方法がグリッドサーチです。

パラメータの組み合わせをすべて試して、一番汎化性能が高かったものを最も良いパラメータの組み合わせとして教えてくれます。

パラメータを探索

まずは探索するパラメータ空間を決めます。

これには辞書型を用います。

この辞書型のkeyはランダムフォレストクラスの引数の名前で、値にその引数で試したいものをリストにして渡します。

keyはクラスの引数を見ながら決めてください。

例えばランダムフォレストについての知識があるならば、もう少し賢いパラメータ探索空間があるかもしれませんね。

これをGridSearchCVクラスに渡して探索します。

[出力結果]

gsインスタンスを学習(探索)させるには、他のsklearnのクラスと同様にfitメソッドを使います。

学習済みのgsインスタンスのbest_estimator_属性最も性能が良かったランダムフォレストのインスタンスが入っています

先ほどと同様にして評価すると、accは98.88%でした。

かなり良くなっていますね。

予測ラベルを可視化してみると、先程よりも誤答が減っている(表示している範囲では誤答ゼロ)ことがわかります。

まとめ

この記事では簡単なランダムフォレストの説明と、その使い方を紹介しました。

発展的な内容として紹介したパラメタサーチは非常に有用な方法で、実際のデータ解析では広く使われています。

もっと詳しくランダムフォレストについて知りたい、ランダムフォレストを自分で実装したい、という方はマンツーマンレッスンでお待ちしています

実用的な機械学習モデルの一つであるランダムフォレスト、使いこなして機械学習を身近なものにしちゃいましょう!

おすすめのコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

「何の言語から勉強すればいいかわからない・・・」そんなあなたに質問に答えていくだけで、何の言語を学べば良いのか診断いたします!未経験から6ヶ月でプログラミング習得に向けた学習プランが1分で分かる!

最短でプログラミングを習得したい方へ

元々ITリテラシーのある方やプログラムの学び方がわかっている方は独学で習得することも可能でしょう。

ただし、実際の学習期間中はつまづいている時間がほとんどです。

「もう挫折したくない」
「本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい。」
「自分だけのカリキュラムで効率的に勉強したい」

そんな方はお気軽に侍エンジニア塾までご相談ください。

弊社では、

  • プログラミング基礎学習
  • オリジナルアプリ開発
  • 仕事獲得

までをひと通り学習できます。

まずは無料体験レッスンで、弊社のコンサルタントと一緒にあなた専用の学習方法やカリキュラムを考えてみませんか?

挫折しない学び方や、通常1000時間以上かかる学習時間を1/3にする方法などより具体的なアドバイスもさせていただいています。

詳しくは下の画像をクリックして弊社サービス内容をご確認ください。

cta1

非常識な結果を出す卒業生多数!

エンジニアキャリア戦略

人気記事セレクション

3000名以上来場の人気セミナーが開催決定

18歳で時給6000円だった侍エンジニア塾代表の木内より、『プログラミングで人生を変える』ための学習方法をお教えます。

0からプログラミングを習得し、フリーランスエンジニアになる方法プログラミング学習の効率を劇的に上げる学習メソッドを解説しますので、奮ってご参加ください。

  • 日付:3/30(日)
  • 時間:14:00〜17:00終了予定
  • 場所:当社 道玄坂オフィス
  • 住所:〒150-0043 東京都渋谷区道玄坂2丁目11-1 Gスクエア渋谷道玄坂 4F *Googleマップでは「東京都渋谷区道玄坂2丁目11-1」で検索してください。近隣にスクエア渋谷という別のビルがあるためご留意ください。
  • 参加費:無料
  • URL:https://seminar.sejuku.net/
詳しくは下の画像をクリックして弊社セミナー内容をご確認ください。

LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

フクロウ

フクロウ

第一言語はPythonです。
皆さんRustやりましょう。