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

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%でした。

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

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

まとめ

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

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

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

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

自分にプログラミングなんて・・・と思っていませんか?

今後10年間で今ある職業の『77%』はなくなると言われています。

人工知能や機械学習を筆頭にVR、AR、ドローンなどの最先端技術の発達はこれからのあなたの働き方に間違いなく影響を与えるでしょう。

将来を見据えてプログラミングができるようになってエンジニアになりたい、自分だけにしかできないクリエイティブな仕事がしたい、、、とお考えの方も少なくないでしょう。

と、同時に「難しそう、、自分にはできないだろう、、、」と諦めている方も多いのではないでしょうか。

弊社マンツーマンレッスンは、お一人お一人に専属のインストラクターがつくので、通常のスクールでは難しい、オリジナルアプリ開発や、フリーランスとしての仕事獲得まで支援しています。

まずは『無料体験レッスン』で弊社コンサルタントと一緒にあなた専用の学習カリキュラムを考えてみてはいかがでしょうか?

詳しくは下の画像をクリックしてください。

cta_mtm2

LINEで送る
Pocket

書いた人

フクロウ

フクロウ

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

おすすめコンテンツ

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

プログラミング学習の効率を劇的に上げる学習メソッドを解説