キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
DataRobot コミュニティ

予測モデル構築時のプチテクニックを紹介してください。

k.sakamoto
リニアアクチュエータ

予測モデル構築時のプチテクニックを紹介してください。

こんにちは。sakamotoです。

今回是非皆さんから情報いただきたいなーと思うのは「モデル構築時のプチテクニック」です。
何か分析・モデル構築時に「あー、これどうしたらいいんだろ?」って時に、こうやってクリアしたよ、っていうテクニックがあれば是非。
もちろん、レベル感は人それぞれだと思うので、ブレスト形式で行かせてほしいです。(予防線)

ということで、最近私が「なるほどな」と思った事例を早速1つ。

先日、とある時系列予測をしている時に、一定特徴量エンジニアリングをやったところで精度向上施策が見当たらなくなりました。
そこで、実績データをベースに移動平均等の説明変数をとにかく増やしまくってモデルを作ってみました。
「時系列予測では移動平均等をデータを増やすと精度が上がる」という情報があったからです。

しかし、結果はそこまで精度が上がりませんでした。

精度が上がらない仮説として「増やした説明変数に似た値が多いので、モデルに上手く反映できてないんじゃないか」と考えました。
がそれをどうやって証明しようか?と考えたときに、とある方から「モデル構築時のランダムシードを変えればいいんですよ」とアドバイスいただきました。
機械学習に詳しい方なら自明の話なのだと思いますが、ランダムシードによって、特に木系であれば、選抜する説明変数が変わってくる、とのこと。

つまり、精度に変化がないのに、ランダムシードを入れ替えて何度かモデル構築して、特徴量のインパクトが毎回コロコロ入れ替わるのであれば、説明変数が重複しているに近い状態のはず、という話でした。

なるほどなーと思いました。
きちんとモデルの成り立ちを理解した上でのやり方で、面白かったです。

今後、逆に、追加した説明変数が本当に効いているのか?という証明でも使えそうですので、1つ勉強になりました。

6件の返信6
IJICHI_DR
データサイエンティスト
データサイエンティスト

@k.sakamoto さん、こんにちは!

楽しいトピックを立てていただきありがとうございます。

「精度に変化がないのに、ランダムシードを入れ替えて何度かモデル構築して、特徴量のインパクトが毎回コロコロ入れ替わるのであれば、説明変数が重複しているに近い状態のはず」

データレコード数に比較して説明変数の数が大きい場合、これはデータレコード数が数百行〜数千行の「スモールデータ」では一般的な問題になりますが、実際に同じスモールデータに対してランダムシードを変えて何度かオートパイロットを回してみると、

  • 最も精度の良いモデルとその精度
  • 「特徴量のインパクト」上位の説明変数

が全て変わります。詳しくはDataRobotブログ「統計解析と機械学習:要因分析からの考察 Part 2」を参照ください。

このような「パーティショニング条件の変動による解析結果の変動・不安定性」は、説明変数同士に強い関係性がある時(多重共線性、マルチコ)だけでなく、互いに独立な説明変数が組み込まれたモデルでも木系かどうかに関わらず起こります。

しかし、予測精度だけが重要な場合、これらをあまり気にしなくても良いかもしれません。マルチコがあろうがパーティショニング条件の変更によって多少精度が変わろうが、検証データ&ホールドアウトでビジネスを回すのに必要な精度が担保されていれば問題にはならないはずです。

一方、どの説明変数がアウトカムとの関係性が強いのか、を知ることがDataRobot使用目的である場合、つまり要因分析で機械学習を使用したい場合、には、解析結果の変動・不安定性を折り込みながら、それでも常に重要な説明変数を見つけるために工夫が必要です。

プチテクニック、のニュアンスとはかなりギャップがあるかもしれないですが、上記ブログの後半では以下のようなアプローチを紹介しています。スモールデータでの要因分析ユースケースを数多くご支援しているDataRobot Japanヘルスケアチームのメンバーからのお勧め(笑)はこちらになります。素性の異なる多様なモデルをあえて組み合わせたアンサンブルモデルを作るところがポイントです。

  • ランダムシードをX回変更して、オートパイロットをX回実施させる
  • 各回とも、ホールドアウトZ%でデータをY分割して交差検定実施
  • 各回で、勾配ブースティング、ランダムフォレスト、Elastic Netなどの正則化回帰、ニューラルネットワーク、などアルゴリズムの素性が異なる機械学習モデルを組み合わせた数種類のアンサンブルモデルを生成(組み合わせ方も様々な方法を試す)
  • 上記モデルの中で最も交差検定の精度が良かったものの「特徴量のインパクト」を計算
  • 「特徴量のインパクト」の絶対値を説明変数(特徴量)ごとにまとめて、中央値また最小値の大きいものから順に図示

ちなみにX,Y,Zなどの変数を指定して上記を自動実行させるPythonスクリプト例をDataRobot Japanヘルスケアチームで作ったのですが、まだ分類/回帰だけでして、時系列予測モデルには対応していません。。。

Miogawa
データサイエンティスト
データサイエンティスト

@k.sakamoto さん、テクニックというか私の困ったときアプローチを紹介させていただきます。

昔、弊社のトップデータサイエンティストのセルゲイに特徴量エンジニアリングでどんなアプローチしているのかとフワッとした質問をしたときに、当時のDataRobot内でも大きく二つの流派がいて、思いつく限りのパターン(複数特徴量の組み合わせも含む)を作った後に減らしていく方式と、限りなく少ない特徴量から初めてだんだんと増やしていくという話をしてくれました。ちなみに前者はザビエという元Kaggle世界ランク1位で後者はセルゲイ自身の手法なので、どっちが優れているというものでもないと笑いながら話してくれました。

私自身はセルゲイから学ぶ時間が長かったこともあり、かつゲーム理論のバックグラウンドとも考えが一致するため、なるべく少ない特徴量から始める派です。なので、迷ったときやよくわからないモデルの状態になった場合には、絶対に自身のある特徴量だけを入れたモデルを作って、それだけで当てられる場所と外す場所(時系列の精度(検定期間だけでなく学習期間も)と特徴量の作用(部分依存、実測と予測の解離)のTop5〜10の特徴量)をしっかりと見て、まぐれで当てれている場所を除きながら、どこを外しているのかをしっかりと把握するようにしています。

特に時系列の需要予測では、3年分のデータであってもデイリーでは1000行程度しかないため、スモールデータ分析に含まれると思います。スモールデータでは簡単にモデルが過学習するからこそ、挙げていただいたランダムシード変えてみる作戦も有効ですし、基本に振り返って確実に捉えられる傾向から見直してみるというのも個人的にはお勧めな手だったりします。

k.sakamoto
リニアアクチュエータ

伊地知さん

ありがとうございます!

ご紹介いただいたブログは後ほど拝見させていただきます!(すみません、今時間が無くて。。。)

また、スモールデータの場合のモデル構築プロセス、ありがとうございます!
これはさっそく社内にも展開して、検討を進めます!
なるほどな、って思いました。
ただ、3点目ってDataRobotで意図的にできましたっけ。。。?
>各回で、勾配ブースティング、ランダムフォレスト、Elastic Netなどの正則化回帰、ニューラルネットワーク、などアルゴリズムの素性が異なる機械学習モデルを組み合わせた数種類のアンサンブルモデルを生成(組み合わせ方も様々な方法を試す)


また、以下コメントについてですが

>予測精度だけが重要な場合、これらをあまり気にしなくても良いかもしれません。マルチコがあろうがパーティショニング条件の変更によって多少精度が変わろうが、検証データ&ホールドアウトでビジネスを回すのに必要な精度が担保されていれば問題にはならない
とのことですが、何というか、予測モデルを使う側の視点に立つと「特徴量インパクトがリモデルする毎に変わると、モデルが安定していないんじゃないか?」と不安にならないでしょうか?
つまり、PoCで得た結果に信頼性がない、とでもいうのでしょうか。。。

上記のような話はスモールデータの場合のみ、という限定理解で捉えて良いでしょうか?
(今回投げさせていただいた話は、そこまでスモールではないので、坂本の捉え方が合っている、と理解したかったですw)

実際に、活用部門と予測モデル構築PoCをする際、やはりDataRobotのインサイトの中でも"特徴量インパクト"は最も重要なファクターであるため、
モデル構築毎に変わってしまうと、なかなか説明が難しくなってしまうんですよね。。。

k.sakamoto
リニアアクチュエータ

@Miogawa さん ありがとうございます!

なるほど確かに、私の周りのデータサイエンティストもその2タイプに分かれるかもしれません。
私なりの理解でいうと、以下の分類に言い換えられるかな、と。いかがでしょう?
 ・機械学習のパワーを信じて、とにかく説明変数を突っ込み、機械学習からインサイトを得ていく
 ・ドメイン知識を活用して、仮説を検証していくタイプ

>迷ったときやよくわからないモデルの状態になった場合には、絶対に自信のある特徴量だけを入れたモデルを作って、それだけで当てられる場所と外す場所(時系列の精度(検定期間だけでなく学習期間も)と特徴量の作用(部分依存、実測と予測の解離)のTop5〜10の特徴量)をしっかりと見て、まぐれで当てれている場所を除きながら、どこを外しているのかをしっかりと把握するようにしています。


この考えは素晴らしいですね。データ予測での基本とでもいうか、こうアプローチしたほうがいいと考えてる派です。
機械学習的には、上記2つ、どちらのアプローチも間違っていないとは思うのですが、「自分が分析した結果を、分析依頼者に説明しなければいけない」という作業を考えると、分析依頼者が分析に明るくない場合は、「人は土台から段階的に思考を組み立てていく方が理解しやすい」と思うのでこの方がいいですよね。

非常に参考になりました!
ありがとうございます!

Miogawa
データサイエンティスト
データサイエンティスト

@k.sakamoto さん、

はい、宗派に近くてどっちも正解で好みの問題だと思います!

元々のプチテクニックに少し戻すとカテゴリで明確にセグメントが別れる特徴量があるケース(地域、商品カテゴリ、チャネル、性別、年齢、etc)だとその特定のセグメントだけでモデルをシンプルに作ってみたりします。なので、列として特徴量もシンプルにしますが、行としてもシンプルなデータセットでちゃんと学べるのかをみたりします。

もちろん、先にあげた特徴量しか効かないケースもあるので、シンプルにした結果全然モデルの精度があがらないというユースケースもありますけど、逆にその場合にはいまのデータのアプローチまたは、問題設定のアプローチには問題があるのかという気付きにもあるので、方向転換を早めに決定したりしています。

IJICHI_DR
データサイエンティスト
データサイエンティスト

坂本さん、

>各回で、勾配ブースティング、ランダムフォレスト、Elastic Netなどの正則化回帰、
>ニューラルネットワーク、などアルゴリズムの素性が異なる機械学習モデルを
>組み合わせた数種類のアンサンブルモデルを生成(組み合わせ方も様々な方法を試す)

↑の方法は、DataRobotが自動ではやってくれません。PythonスクリプトでAPIを利用してDataRobotにそのような操作をやらせるイメージです。(余談ですがこのアプローチは昨年弊社セルゲイと日本チームで検討して到達した結論でした)

もし是非使ってみたい、ということであれば、御社担当のCFDSにご相談ください。
スクリプトを連携いたします。

>予測モデルを使う側の視点に立つと「特徴量インパクトがリモデルする毎に変わると、
>モデルが安定していないんじゃないか?」と不安にならないでしょうか?

有限数のデータでモデルを作る限り、曖昧さは必ず発生します。
同じ母集団からサンプリングされたデータでも、リサンプリングすればモデルの形が
変わるのはむしろ当然です。
しかし、例えばターゲティングのテーマで、予測スコアが0.31から0.33とか0.29に
変わっても、閾値が0.2に設定されているならばビジネスの意思決定上は全く問題
ないわけです。

なので、特徴量のインパクトがリモデルする毎に変わったとしても、Out-of-sampleデータの精度
(DataRobotのリーダーボード上では、検定-交差検定-ホールドアウトそれぞれの精度指標値)に
大きな差異がなければよしとしよう、と考えることで問題はないです。

>上記のような話はスモールデータの場合のみ、という限定理解で捉えて良いでしょうか?

必ずしもスモールデータのみとは言い切れません。
スモールデータでなくても、元データに何らかのバイアスや外れ値がある場合、サンプリングの仕方に
よって、モデルの形が変わることは容易にご想像いただけるかと。

>実際に、活用部門と予測モデル構築PoCをする際、やはりDataRobotのインサイトの中でも
>"特徴量インパクト"は最も重要なファクターであるため、モデル構築毎に変わってしまうと、
>なかなか説明が難しくなってしまうんですよね。。。

モデルの精度、とモデルの安定性/ロバスト性が必ずしも両立しないところが機械学習の奥深い
ところです。しかし、冗長な特徴量や目的変数との関係性が小さい"雑魚"特徴量を丁寧に排除して
適切に特徴選択を行った場合、精度バフォーマンスと安定性/ロバスト性が両立する場合もあります。
(特徴選択を行ってモデルをより単純にした結果、安定性/ロバスト性はある程度達成できたものの
精度は若干落ちる場合もあります)
ユーザーさんが要因分析目的でDataRobotを使用される場合には、精度は多少落ちても安定した解析
結果をもたらすように先にご紹介した方法で特徴選択をするアプローチをお勧めしています。

誰かに説明する時には、インパクト上位の特徴量の序列が絶対的なものではないとの理解のもと、
「特徴量A,B,C,Dの4つは常にインパクトが上位にあります」のような説明がフェアだと思います。