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

時間認識モデルでスパイクの大きな値を当てるテクニック

Toshiki Ooba
イメージセンサー

時間認識モデルでスパイクの大きな値を当てるテクニック

過去の売上データ(日次の実績)と売上情報・顧客属性・外部データなど計200個の説明変数を使って、月の売上予測をしています。
データは1年分です。

過去実績の売上データを時間経過グラフで見てみると、毎月1日に極めて大きなスパイクが立っています。
そこでまず、毎月1日はシステム・業務的な処理日と解釈し「1日フラグ」という特徴量を追加しました。
そのうえで、一部データセットをいじってみたりパーティションの数やアンサンブルなど色々試しながらモデルをいくつか作成していると、チャンピオンモデルのすべてのバックテストにおけるMAPEが10~15%となりました。
モデルはいずれも大まかな波形を掴んでいるものの全体的に予測値が下振れしており、スパイクは追い切れていません。
特徴量のインパクトを見ると、過去の金額実績データと曜日、祝日等のカレンダーデータのみが寄与しているものの、他の200変数はまったく当たっていない状況です。

さらに予測精度を上げるにはどのようなアプローチが考えられるでしょうか。
数%で数億円単位で変わってくるため、可能な限り精度をあげていきたいです。

目的変数の移動平均を取る、あるいはスパイクの部分だけ切り出してモデルを2つに分けるなどを考えて試しておりますが、お知恵をお貸しください。

0 件の賞賛
5件の返信5
Kei
データサイエンティスト
データサイエンティスト

業務知見やデータにあった問題設定が何より重要になるため、criticalな回答になっていないかと思いますが、まずは一般的に下記の項目をご検討いただくのはいかがでしょうか?(すでにご検討いただいているものは多いかと思いますが...)

 

複数カテゴリの場合は、似ているカテゴリなどでグルーピングしていただく

似ているカテゴリは、似ているカテゴリで学習すると、効果的に予測を行うことができます

粒度の設定 (階層モデリング)

商品ごとの予測値を必要とするケースでも、商品カテゴリなど大きなカテゴリの売上を予測してから、細かく商品毎に予測値を割り振るという方法もあります

特徴量の追加

マーケティングなど、既知の特徴量がないか実際の業務担当の方と話をするのが効果的です。

現場の方が使っている感はできるだけ取り入れるといいと思います。

特徴量の削減

データ量が多い場合、派生特徴量の生成のプロセスでサンプリングが起こるため、特徴量を絞ると若干精度が改善する可能性があります

派生特徴量を作成しない特徴量の設定

派生特徴量を計算し、学習しても無駄な特徴量を明示的に特定した方が精度が上がるケースがあります

既知の特徴量の工夫

例えば、1日で売上のピークが経って、その前後で先食いなどが起こっている場合、0,0,1,0,0とフラグだけを入れるのではなく、0,-1,1,-1,0としていただくと精度が改善することがあります

予測windowを分ける

最初の2週間と後半の2週間で分けるなどすると、満遍なくあっているという状況を避けることができる可能性があります

ウェイトを設定する

最新のデータに重みをつけるなど、重みをつけて学習するという方法もございます

派生特徴量の長さを変更する

これは既に検討されているかと思いますが、いくつか検討し、最も精度が良い長さを検討していただくプロセスを踏んでいただければと思います

 

そのほか、下振れが許されない問題であればRMSLEを最適化指標に使うなどいくつかございますが、わかりやすく試せるところは上記になるかと思います。

いかがでしょうか?

Toshiki Ooba
イメージセンサー

迅速かつご丁寧に教えて頂きましてありがとうございます。
当方で考えていた、目的変数の移動平均を取ることでMAPEが8%で安定しはじめたので、さらなる精度向上のために一つひとつ試させていただきます。


>・複数カテゴリの場合は、似ているカテゴリなどでグルーピングしていただく
>・粒度の設定 (階層モデリング)
すぐに思いつくのは店舗毎、商品毎、顧客毎などですが、今回は管理会計上の予測がビジネス課題であり、かつ業務の性質状、残念ながらあまり細かくグルーピングはできなさそうです。

>・特徴量の追加
業務担当の方で実施している現行の予測方法をお伺いし、効いてきそうな因子は特徴量として取り入れようとしています。
マーケテイング観点ですと、キャンペーン情報などはすぐにデータが準備できないようなので、今後のフェーズで検討していきたいと思います。

>・特徴量の削減
>・派生特徴量を作成しない特徴量の設定
こちらは盲点でした。派生特徴量を作っている途中で処理がタイムアウトしてしまうといった意味でしょうか。
取り合えずたくさんの説明変数を入れておけばDataRobotが総当たりで試してくれる(精度は上がるか変わらないか)と思っていたので、精度が下がるなどの悪影響の可能性は考慮しておりませんでした。

ちなみに特定の派生特徴量を作成しない設定はどのように行ったら宜しいでしょうか。

>・既知の特徴量の工夫
>・予測windowを分ける
>・ウェイトを設定する
新しい観点でした。検討してみます。

ウェイトについては、どの程度重みづけを行うかなど例はございますでしょうか。
あるいは、少しずつ重みを増しながら精度を確認していくといったアプローチでしょうか。

>・派生特徴量の長さを変更する
特徴量の派生ウインドウで設定できる過去の日付区間のことでしょうか。
こちらもとりあえず30日に設定していればDataRobotが総当たりで試してくれると思っていたので、値を変えながら最適なものを探してみます。

>そのほか、下振れが許されない問題であればRMSLEを最適化指標にする
業務要件を確認してみたいと思います。

0 件の賞賛
Toshiki Ooba
イメージセンサー

連投申し訳ございません。
ウェイトに関する質問なのですが、ターゲット変数以外の特徴量に重みづけができるようなのですが、特定のレコード(毎月1日など)に重みをつけることはできるのでしょうか。

0 件の賞賛
Kei
データサイエンティスト
データサイエンティスト

特徴量の削減

処理がタイムアウトするというより、多くの計算を行おうとするとデータをいくつか内部的にサンプリングする仕様になっているという意味合いになります。

また、サンプリングの仕様に限らず、学習する上で効く特徴量だけで学習した方が、効果的に学習できるので特徴量削減で精度が上がる可能性はございます。

 

派生特徴量を作成しない特徴量の設定

「高度なオプション」または、特徴量を選択して「メニュー」から設定いただくことができます

Kei_0-1619010556227.png

Kei_1-1619010588993.png

ウェイト

ウェイトについては、例えば直近の1ヶ月を3、2ヶ月前までを2、それより前を1とするといった方法などがあります。こちらは、レコード(行)に対してweightをつけるといった仕様になります。

また、ウェイトをつける方法を紹介しましたが、ウェイトのパターンを多く試すというより、少し試してみて効くかどうかをご確認いただくレベルでいいかと思います。

 

派生特徴量の長さ

はい、その通りです。そのwindowの中でいくつか派生特徴量を探してくれますが、それ以上は探してくれません。なので、35日間(約1ヶ月), 63日間(約2ヶ月), 91日間(約3ヶ月)で試してみるのがよく行う方法です。

今回は1年間しかデータがないとのことなので、14日間, 21日間, 28日間, 35日間で試すのはいかがでしょうか? (極端な例で14日間と35日間でまず試してみるといいと思います)

(直近30日より、例えば1週間周期の7の倍数にしてみるのもおすすめです)



 

0 件の賞賛
Toshiki Ooba
イメージセンサー

詳しく教えていただきましてありがとうございました。
一つひとつ実践してまいりたいと思います。

0 件の賞賛