KDD2018 : Customized Regression Model for Airbnb Dynamic Pricing を読んだ
論文はこちら:KDD 2018 | Customized Regression Model for Airbnb Dynamic Pricing
Airbnb の Applied Data Science Track Paper。読んでみてAirbnb特有の問題でもあるのかと思いきや、価格付けをサービス事業者側から提案するアプローチは、C to Cサービス等を提供する企業などで導入できる考えがあり、勉強になりました。
概要
商品の最適な値段付け(ユーザがぎりぎり買うまで高く値段付けしたい or 買わなかった商品を買ってくれるぎりぎりまで低く値段づけしたい)は難しいが、独自のメトリクスを定義して、値段付けが悪くならない方向に最適化を行う方法を提案。結果はAirbnbのデータで良好な結果を得ており、すでに1年以上デプロイしてるモデル。
Introduction
ホスト(部屋を貸す人たち)は自由に各日の宿泊費を設定できるが、Airbnbから適正な費用提案(Price Suggestion)をしたい。市場動向を考慮しながら日々動的に適正な価格付けをする方法を提案する。
動的な価格付けをするための困難なところが、需要の見積もり変化(時間変化とリスティング変化)と部分的な価格適用(ホストの値段設定の考えもいれるところ)。
リスティングってのは部屋という意味でいいのかな。リスティング変化とは、ホテルは部屋が同じ作りであるものが多いが、一般に家の部屋の作りはすべて異なるため、部屋の評価レビューを考慮しながら部屋ごとに値段設定する難しさがある。高すぎると予約されなくなることも考えながら。
価格と時刻とリスティングにより、需要曲線が決まる。
適切な価格付けを行うPricing Modelsは3段階の構成にわかれている。
1つ目に、今から部屋が予約される夜までの間に部屋が予約される確率を分類モデルを構築する。
2つ目に、予約確率を特徴に入れ、値段付けモデルを構築する。
3つ目に、値段付けモデルは、ホストの値段設定の考えを適用して、最適化する。
これらの結果、研究としては、価格付けの効果を評価するメトリクスと悪い価格提案が起こらないようなモデルを導入できたことが貢献。
Pricing System Overview
Booking Probability Modelはある部屋の未来のある日が予約されるかどうかを予測する。一般的な2値分類モデル。学習に使う特徴として、部屋に関わる特徴・時系列特徴・需要と供給の特徴(近隣の予約できる部屋の数など)を使う。
Gradient Boosting Model(GBM)を使う。学習は、市場の大きさで3段階に分けるなど、エリアごとに学習モデルを作ったほうがGlobal AUCの精度があがったみたい。ここで、場所ごとにサンプリングレートを変えるなどのテクニックもある。
推定されたモデルの予約確率(y軸)と値段(x軸)を見てみると、真のデータよりも、端にいくほど外れている事がわかる。
この問題の難しいところとして、データのスパースネス(基準となる値段から離れたところをあてるのは難しい=price extrapolation)、ユニークネス(部屋は一つ一つがユニークなものが多く、一般化するのは難しい)、値段に依存した特徴(値段が高すぎると、利用率の特徴量が小さくなるなどがあり、値段との相関が悪さをする)などが考えられる。
そこで、収益最大化のアプローチもやったと書いてるが、最適な値段というデータがない(データにあるのが最適な値段といえないので)ので、うまくいかなかった。最終的に、最適な値段付けのための正しい評価メトリクスを作ったほうがいいねとなった(そう考えるのか!)
Evaluation Price Suggestion
一般的な回帰の教師あり学習と違って、最適な値段というデータがないので、私達の値段付けの性質を使った評価メトリクスを導入する。
アイデアとしては、正しい値段を考えるのではなくて、何が悪い値段づけなのかという方向から考える。
実際の部屋の値段を、提示する部屋の値段を、最適な値段(存在すれば)をとする。
悪い値段付けとは、「値段で予約された部屋を < で値段付けしてしまうこと」ゆえに、この場合は。逆もしかりで、「値段で予約されなかった部屋をで値段付けしてしまうこと」なので、この場合は < 。
また、提案した値段付けが良いか悪いか判断がつかないものとして、値段で予約された部屋をで値段付けすること。値段をこれ以上上げても予約はされたかどうかが判断がつかない。もちろん、逆も同じ。
ということで、以下の表ができあがる。
上記の考えから、5つのメトリックを定義する。実際には、以下の2つの指標を特に重要だと述べている。
と である。
は、予約されなかった部屋のうち、値段付けが実際の値段より低くできたもの。大きいほうが悪くはない。
は、予約された部屋のうち、値段付けが実際の値段より低くしてしまった部屋の場合、損失率を計算し、それ以外は0。それらの中央値を返す。小さいほうが悪くはない。
この2つはトレードオフの関係にあるので、を改善しながら、なるべくを大きくしないような最適化を考える(なるほど)
Strategy Model
この章で、本質となるモデルがでてくる。まずは損失関数を定義する。
特徴(もともとの値段やGBMが算出した予約確率など)を含む対象とそれの予約の有無を表すからデータを用意する。
サンプルに対して、モデルが付けた値段をとする。一旦パラメータのことは置いておく。
損失関数は、Support Vector Regressionで使われるε-許容誤差の考えを参考に、以下の損失関数を定義する。
ここで、 と である。
これを理解するのは、以下の図を見るのが早い。
つまり予約されたサンプル()はもともとの値段よりも少し大きいくらいなら損失は0にする。
逆も同様の解釈でいける。この幅をもたせてるのが、ε-許容誤差と似てるが、LとU次第にかかるパラメータc次第で幅は大きく変化する。
続いて、最適化するパラメータを含むについて。
モデルが付ける値段を定式化していくわけだが仮定として、「(1) 予約確率と相関はあるように付ける (2) もともとの値段の周りに付ける (3) なんらかの需要がでたときに容易に追加できるように」という3つのアイデアを入れて定式化する。
それが、 で、Vは以下。
はもともとホストがつけた値段、はGBMが付けた予約確率、が需要スコアといって、各マーケットごとに決めるダイナミックに変わる需要量。
は制御パラメータ、は微調整パラメータと読める。
需要スコアはガウス分布で正規化する。高いほど、需要が大きい。それを制御するパラメータ1 < < < 2 で設定する。2つあるのが、UpとLowで別々の比率がほしいので、これが非対称(下図)
あとは、との勾配を求めて、収束したら、が求まる。
学習時のテクニックとして、GBMを学習するときはマーケット別に学習したが、このStrategy Modelはすべてのデータを使う。これは、同じマーケットで同じ部屋でも、ホストがつける値段がバラバラすぎるので、全部のデータで学習したほうがホストの依存が少なくなることを期待しているみたい。
あと、との範囲に制約を入れるなどで、非現実的な値段にならないように調整する。学習には、Sparkを用いて確率的勾配降下法 (SGD)で最適化する。また制約をいれても、Proximal Algorithm(近接法)で容易に求まる(らしい)
Experiments
ある期間のデータを使ってオフライン評価を行う。
がStrategy Modelが値段付けした日、 が予約の有無のラベル集めた日、その間に1つ以上の予約があれば、その対象は正例となる。
3つのデータセットを使って、とを評価する。需要曲線に基づいて予想される収益を最大化する費用を提示するナイーブなモデルと比較する。
結果は、そのナイーブなモデルと比べて、良好な結果(下表)。
評価指標に基づいて悪い提案を避けるモデルに設計した効果がでている。
すでにこのモデルを1年以上デプロイしているが、着実にこのメトリクスでみると、改善が行われているとオンライン評価で述べている。
また、実際にモデルが付けた値段の推移を可視化している。東京の例があり、4月の桜のシーズンにモデルは需要を読み取って値段をあげている(下図)
追記
書き終わって、ふと検索して気づいたのですが、すでにわかりやすい日本語で解説記事が上がってました…orz。やはりAirbnbの論文は注目度が高いですね。しかし、自分の理解が深まったので良しとしよう。