1. HOME
  2. ブログ
  3. IT技術
  4. 【機械学習】「スタッキング技術」を実装して予測精度を上げる

【機械学習】「スタッキング技術」を実装して予測精度を上げる

機械学習におけるスタッキング技術とは?

上位入賞者の公開コードに必ずと言っていいほど顔を出すのが「スタッキングされた学習モデル」です。

本記事では、スタッキング技術の内容から実際のコード実装までご紹介していきますが、

まず始めに、機械学習における「スタッキング技術」とは何かを見ていきたいと思います。

スタッキング(stacking)とは「積み重ねる」を意味し、複数の学習器を組み合わせて作った学習モデルのことを「スタッキングされた学習モデル」と呼びます。

なぜこんな複雑なことをするのかと言うと、各学習器の不得意な部分をフォローし合うことで隙のない学習モデルを作るためです。

人間がお互いの長所を活かし合って最大限の力を発揮するように、機械学習もお互いに助け合うことで予測精度を高めることができるのです。

スタッキングモデルの一例

では、スタッキングモデルの一例を見てみましょう。

下の図は、Kaggle と並んで世界的に人気のある大会 「KDD CUP」 において、2015年に優勝を果たした Jeong Yoon Lee 氏の学習モデルです。

スタッキング技術を用いて優勝したことにより、スタッキング技術に注目が集まるキッカケになりました。

出典:https://speakerdeck.com/smly/techniques-tricks-for-data-mining-competitions?slide=47

上記のモデルでは、3つのステージに分けてスタッキングを行い、64の個別モデルを組み合わせています。

決定係数の精度向上分はたったの「0.0015」かと思うかもしれませんが、大会ではこの差の中に10チーム以上が入ってくるほど「大きな差」となります。

この程度の精度向上であれば、スタッキング技術は不要と思う人もいるかもしれません。

しかし、精度向上分が小さいのは決定係数が既に高いのが原因であるため、決定係数が低い部分においては精度向上分も大きくなってしまいます。

言い換えれば、超プロ級の腕前でない場合は、スタッキング技術を使うことで精度向上が見込めるということです。

よって、単独モデルで行き詰った際には「スタッキング」を試すことを強くオススメします。

こちらの記事もオススメ!

スタッキング技術のメリット・デメリット

メリット:予測精度が向上する

機械学習にとっては、「予測精度」こそが全てです。

単独モデルに及ばないこともありますが、基本的には精度が向上します。

デメリット①:結果の解釈・分析が難しくなる

学習モデルを複数回通すことで、リバースエンジニアリング(結果の解釈)が非常に難しくなります。

機械学習における大会等では予測精度のみが問われるため問題ありませんが、結果の解釈とセットで用いたいエンジニアにとっては注意が必要です。

対応策としては、データの考察等は単独モデルで行い、精度向上をスタッキングに求めるのが良いでしょう。

デメリット②:計算コストの増加

学習モデルが難解になる分、どうしても計算時間が長くなります。

ただし、数万行レベルであれば通常の PC でも実装が可能です。

対応策としては、下記が挙げられます。

  1. 計算コストの小さい学習モデルを採用する
  2. 各モデルの計算時間を短縮する(ハイパーパラメーターの調整)
  3. 学習環境の見直し(PC のスペック向上やサーバーのレンタルなど)

実際にスタッキングを実装してみよう!

使用するデータ

今回の検討では、コンクリートの強度に関するデータ「 Concrete Compressive Strength Data Set 」を使用します。

I-Cheng Yeh, “Modeling of strength of high performance concrete using artificial neural networks,” Cement and Concrete Research, Vol. 28, No. 12, pp. 1797-1808 (1998).

スタッキングモデル

今回は、2つのステージに分けてスタッキングを行います。

下の図を見ながら説明を読み進めてください。

1つ目のステージでは、「LightGBM」「RandomForest」の条件違いを、3つ + 重回帰 の計7つのモデルを作成します。

これ以外には、「ニューラルネット」や「k 近傍法」を組み込むケースを良く見かけます。

性質の異なる学習器を複数織り交ぜることにより、色んな長所を取り入れることができるためです。

自身に馴染みのある学習器を、たくさん入れてみることをオススメします!

その後、1つ目のステージにて予測された値が、2つ目のステージの入力値となります。

つ目のステージでは、1つ目のステージにて出てきた7つの予測値を束ねます。

最後に束ねる際の学習器は、「Lasso」「Ridge」「ロジスティック」「重回帰」などが良く用いられます。

ただ今回は、説明変数の重みが完全に「0」にならないという点から「Ridge」を採用しました。

人間らしく言うと、「全ての人の意見を取り入れる」イメージです。

言葉での説明は少し難しいと思います。

でも、実際にコードを実装すると理解できてくると思いますので、安心してください!

必要なパッケージの読み込み

それでは、必要なパッケージを読み込んでいきたいと思います!

LightGBM のパッケージをインストール

LightGBM のパッケージをインストールしていない方は、下記コードにてインストールを行ってください。

データを読み込みます。

xxxの部分を各自変更して下さい。

目的変数のヒストグラムを確認する

目的変数のヒストグラムを確認します。

あまりに歪な分布をしていると、決定木系の精度は上がりません。

本記事ではデータ把握に関する部分を省いていますが、データの傾向把握は必ず実行してください。

精度が低い場合に要因を探すのは大変なので、当たり前のことを当たり前に順番に確認するクセを付けることが大事です。

スタック1段目

ランダムフォレストの予測値を作成

スタック1段目のランダムフォレストの予測値を作成します。

下記コードにより、5種類の木の深さ(2・4・6・8・10)における予測結果が格納されます。

木の深さにより学習の深さを変えることで、多様性を持たせています。

あくまで一例ですので、他のハイパーパラメーターを変えても構いません。

予測値が格納されていることを確認します。

LightGBMの予測値を作成

スタック1段目の LightGBM の予測値を作成します。

下記コードにより、3種類の学習反復回数(10・100・1000)における予測結果が格納されます。

学習反復回数を変えることで、多様性を持たせています。

こちらもあくまで一例ですので、他のハイパーパラメーターを変えても良いです。

予測値が格納されていることを確認します。

重回帰の予測値を作成

スタック1段目の重回帰の予測値を作成します。

下記コードにより、重回帰の予測結果が格納されます。

予測値が格納されていることを確認します。

以上で、1段目の予測値作成は終わりです。

スタック2段目

では、2段目の組み合わせモデルを実装します。

今回は、「Ridge」を採用しています。

 

非常に高い予測精度を実現することができました!

予測結果をどの程度使ったのかを確認する

次に、どの予測結果をどの程度使ったのか、確認してみます。

1つめのステージの予測値をバランスよく採用できています。

「 LigheGBM (勾配ブースティング)」の偏回帰係数( Partial regression coefficient )が高いのは、予測精度が最も高いためです。

一番頼れるモデルを頼りながらも、他のモデルも少し頼るというバランスの良いモデルができています。

また、全てのモデルを採用することで「過学習を防ぐ」といった重要な一面があります。

ただし、スタッキングでは「どの説明変数」が「どの程度寄与したか」の判断ができなくなる点には、注意が必要です。

一番信頼した「 LightGBM_num=1000」のモデルを確認することで予想は付きますが、定量性はどうしても欠けてしまいます。

scikit-learn

今回は、スタッキングの中身を正しく理解するため、スタッキング専用のパッケージを使いませんでした。

スタックに使用可能なパッケージは複数ありますが、皆さんに馴染みのある scikit-learn にもスタッキングのパッケージが追加されました。

※ Scikit-learn のバージョン0.22から追加されたパッケージとなりますので、アップグレードが必要です。

小回りは効きませんが、簡単にスタッキングを行うことができる便利なパッケージとなっています。

興味のある方は、ぜひ使ってみてください!

単独の学習モデルと予測精度を比較してみる

次に、単独モデルとの比較をします。

単独モデルの予測精度の方が高ければスタッキングは必要ありませんので、この確認は非常に重要です。

ランダムフォレスト単独の予測精度

ハイパーパラメータの最適化を行った後の決定係数は「0.915」となり、スタッキングの「0.941」には及びません。

余談ですが、非常にレベルの高い勝負となった要因は、質の良いデータを使っているためだと思います。

科学的な実験データは、ある程度、「説明しやすくなる傾向」にあります。

一方、人間が行動した結果のようなデータは、「説明しにくくなる傾向」にあります。

LightGBM 単独の予測精度

ハイパーパラメータの最適化を行った後の決定係数は「0.889」となり、スタッキングの「0.941」には及びません。

重回帰単独の予測精度

決定係数は「0.607」となり、スタッキングの「0.941」には及びません。

重回帰分析は結果の解釈が行いやすいという最大の長所がありますが、「精度が低い」のが短所となります。

単独モデルと比較した結果から言えること

「ランダムフォレスト」「 LighGBM」に関しては、ハイパーパラメーターの最適化を実行後に行った後の決定係数です。

にも関わらず、スタッキングとの差がでたということは、組み合わせによる良いとこ取りができたことを意味すると考察できます。

さいごに

今回は、スタッキングの背景理解から実装まで行いました。

スタッキングは複数の学習器を組み合わせてモデルを作るので、予測精度の向上が期待できます。

ただし、データによって精度が向上しない場合ももちろんあります。

そのため、注意して使うようにしてくださいね!

(株)ライトコードは、WEB・アプリ・ゲーム開発に強い、「好きを仕事にするエンジニア集団」です。
機械学習でのシステム開発依頼・お見積もりはこちらまでお願いします。
また、機械学習系エンジニアを積極採用中です!詳しくはこちらをご覧ください。

※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

こちらの記事もオススメ!

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

関連記事