F@N Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・nex8のエンジニア・技術ブログ

共変量シフトへ対応したCTR予測

 インターンに参加させて頂いた濱武です.「データ分析」コースに5日間参加し,「共変量シフトへ対応したCTR予測モデルの評価」を課題として取り組みました.

共変量シフトとは

 機械学習は訓練データ,テストデータが等しい確率分布にしたがっていることを前提としています.しかしながら,実際に等しい確率分布に従っていることはほとんどありません.このように訓練データとテストデータの確率分布が異なる状況で,入出力関数は等しいという状態を「共変量シフト」と呼びます.

対策案

 共変量シフトへの対策案の1つとして,訓練データとテストデータそれぞれの確率分布の比によって定義される「重要度」という指標を利用し損失関数を重み付けする手法*1があります.簡単な直線モデルを最小二乗法によって適合させる場合は以下の数式のようになります.

{ f(x) = \theta_1 + \theta_2x}

{ \min \sum_{i=1}^{n} (f(x_i) - y_i)^{2} }

そこで,二乗誤差に対して重要度 { w(x)} を利用して重み付けした重要度重み付き最小二乗法で適合することで,テストデータに対する予測精度が向上します(より詳しい内容は脚注の論文に書かれてあります).

{ \min  \sum_{i=1}^{n} w(x_i)(f(x_i) - y_i)^{2} }

しかし,データの確率密度を求めることは困難であり,重要度をデータから推定する必要があります.この手法も様々あるのですが,今回はこちらのパッケージを利用しました.

分析の流れ

 モデルとしてロジスティック回帰を使用し,重要度を利用していないモデルと比較することで,重要度適応モデルの評価を行うという方針で進めました.分析の流れは以下のような感じです.

  1. データ取得
  2. 重要度推定
  3. One-Hotベクトル化
  4. 学習
  5. 評価

なお,重みの適応は,ロジスティック回帰のsample_weightに推定した重要度を利用しました.

結果

 インターン最終日,上述したパッケージは大規模データでの利用を想定しておらず,大量のデータを食わせるとMemoryErrorが発生することが分かりました.そのため大幅に削減したデータでの学習を余儀なくされてしまい,また,本筋とは離れた細かいトラブルへの対処に時間をかけてしまったせいで,評価をする前にタイムアップを迎えてしまう,というとても不甲斐ない結果となってしまいました.提案手法結果のカリブレーションカーブ*2(簡単な説明は他のインターンの方が書かれています)は以下のようになりましたが,散々な結果であり,テータ削減の影響や重要度の平滑度合いを調整するべきだったとか,様々に原因が考えられます.

f:id:k_hamatake:20190823182023p:plain
カリブレーションカーブ

学べたこと・反省点

 私は独学でプログラミングや機械学習,データ分析を学んでいますが,やはり実データを利用できる機会はほとんどありません.今回インターンに参加し,データベースの扱いや大規模実データのハンドリングを学ぶことができ,5日間とても貴重な経験を積まさせていただきました.

 だた反省点として,メイン手法とは別に代替妥協案みたいなものを用意して,インターン期間にきちんと課題を終了できるようなプランニングをするべきだったと感じています.重要度推定にこだわり過ぎず,例えば日付が新しいほど重みが増加するような関数を使用する方針にある段階で切り替えておけばもっと良い結果になったかなあ,と思っています.インターンで得られた知見や反省点を活かして精進していきたいです.

 

*1:杉山将 他. (2014). 非定常環境での学習:共変量シフト適応,クラスバランス変化適応,変化検知. 日本統計学会誌 第44巻 第1号 pp.113~136.

*2:https://scikit-learn.org/stable/auto_examples/calibration/plot_calibration_curve.html#sphx-glr-auto-examples-calibration-plot-calibration-curve-py