Real-Time Floor pricing

概要

はてなの2018年サマーインターン機械学習を使って広告収益をX%くらい上げてきた(Xの数値は諸事情で詳しくは言えないけど10いかないくらい)

ちゃんとはてなの人に記事の公開許可もらってます

 前提知識

  • Ad Exchange の広告枠の値段はセカンドプライス・オークションで決まる
    • 最高額で入札した人が2番目に高い金額の入札額を払う
  • フロアプライスという最低落札価格を設定できる
    •  2ndPrice \lt FloorPrice \lt 1stPriceならフロアプライスが採用される
    •  FloorPrice \lt 2ndPrice \lt 1stPriceならセカンドプライスが採用される
    •  2ndPrice \lt 1stPrice \lt FloorPriceなら不成立

つまり、フロアプライスを最適化すると収益があがる! 

→ じゃあ広告枠毎にフロアプライスを最適化しよう!(RTF)

 

用語定義

  •  e1stPrice   :  ファーストプライスの推定値
  •  e2ndPrice   :  セカンドプライスの推定値
  •  eFloorPrice   :  最適なフロアプライスの推定値

 

処理の流れ

  1. 複数の特徴量から e1stPrice を計算
  2.  e1stPrice から e2ndPrice を計算
  3.  e2ndPrice から eFloorPrice を計算

学習をPythonでやってから推論処理をTypeScriptに移植

 

各処理の詳細

1. 諸特徴量から e1stPrice を計算

諸特徴量→多項式基底*1→線形回帰*2 e1stPriceという処理の流れをPipeline*3でくっつけて計算した

絶対偏差は以下のような感じ

平均偏差 ¥30
25% ¥4
50% ¥10
75% ¥23
100% ¥8153
標準偏差 ¥124

 

 

2.  e1stPrice から e2ndPrice を計算

 グラフを見てみると \frac{ 1stPrice }{ 2ndPrice }の比率が多項式近似できそうだったので、多項式近似した(オレンジ色の線が近似)

横軸が 1stPriceでグラフの右の方が分散大きく見えるが、大体は0円から500円くらいに分布していてそれより上は実質使われないので最終的な収益には大きな影響を与えなかったと考えられる

f:id:Tomoyaf:20180907174956p:plain

 \frac{ 1stPrice }{ 2ndPrice }の比率が計算できたのでこの値に e2ndPriceを掛けて e1stPriceを算出した 

本当は e1stPriceを諸特徴量から直接計算したい所だがデータが取れなかった

 

3.  e2ndPrice から eFloorPrice を計算

  eFloorPrice= \alpha_{i j} \cdot e1stPrice + \beta_{i j}

とし、 \alpha_{i j} \beta_{i j}は実際に運用しながら山登り法っぽい感じで最適化していった

式に落とし込むと以下のような感じ、ただし収益関数を R(i, j)とし、 iは一定の期間同じ数値が使われて次の一定期間では+1した値になる

 \alpha_{i j}=\alpha_i + w_j

 \beta_{i j}=\beta_i + v_j

 

 w_j \in W

 v_j \in V

 

 j^*_i = \underset{j}{\operatorname{argmax}} R(i, j)

 \alpha_{i+1}=\alpha_i+w_{j^*_i} 

 \beta_{i+1}=\beta_i+v_{j^*_i}

本当は e2ndPriceが決まったときの 1stPrice確率密度関数をノンパラメトリックに推定してどうのこうのっていうのを考えていたが 2ndPrice \lt 1stPrice \lt FloorPriceのときの期待値の計算が難しそうだしそもそも確率密度関数の推定も収益が上がるくらいの精度でるか心配だったので今回の手法を選択した

 

 

結果

収益が増加した!!!

 

展望

  •  \alpha \betaを諸特徴量の関数と仮定する
  •  \alpha \betaを使った一次関数ではなく \gammaを追加して二次関数にしてみる
  •  \alpha \betaの学習に使うデータを増やす
  • パラメータの更新を自動化