『Customized Regression Model for Airbnb Dynamic Pricing』を読んでまとめた 【KDD2018】
はじめに
2018年8月19日から23日にかけてロンドンで行われたKDD2018(データマイニングの世界的なカンファレンス)に採択されていた『Customized Regression Model for Airbnb Dynamic Pricing』なる論文を読みました。
Airbnbで実装されている価格推薦モデルについての論文で、
- ビジネス・ユーザー視点を取り入れており、
- 「価格を下げれば予約されていた」と、「もっと価格を上げていてもよかった」というニーズ
- それをうまくモデル化していて、
- 上記を損失関数として定量化
- さらにシンプルな構造で理解しやすい
- ①予約確率の予測→②最適価格の提案→③パーソナライズと、マクロ→ミクロに落ちていく構造
という点において優れたデータサイエンスの応用例であると感じたため、主要な論点を要約しつつ解説に取り組んでみようかと思います。
論文の要旨
最適価格の提案をしたい
まず、Airbnbではホスト側が宿泊料金を自由に設定することができます。
自由は自由でいいのですが、Airbnbに代表されるCtoCのプラットフォームにおいて、需要と供給のよりよいマッチングのために『価格設定』は重要な要素になっていることを考えると、サービス側から最適な価格を提案を出来ると望ましいです。
具体的には、Airbnbの『Smart Pricing』という機能でモデルが算出した最適価格をユーザーが見れるようになっています。ユーザーはモデルが提案している価格を採用してもいいし、参考にして微調整してもいいし、全く利用しないことも出来るようになっていることはポイントになります。
3段階のモデル
①予約確率の予測(分類)
まず、競合の状況や部屋の特長などを鑑みて、とある日付で予約が発生するか否かの確率を計算しています。予約ありを1、予約なしを0にした二値分類タスクになります。 気になるのが使用しているモデルと特徴量ですが、モデルには勾配ブースティング(GBM)、特徴量は以下のような変数を利用しているようです。
- Listing Features
- listing price per night
- room type
- person
- capacity
- the number of bedrooms/bathrooms
- amenities,
- locations
- reviews
- historical occupancy rate
- instant booking enabled
- Temporal Features
- seasonality (the day of the year, day of the week, etc)
- the calendar availability (e.g. the gap between check in and check out)
- distance between today and ds_night
- Supply and demand dynamics
- number of available listings in the neighborhood
- listing views
- searches/contacts rates,
個人的に盲点だなと思ったのが、Temporal Featuresのdistance between ds and ds_nightで、これは計算日から、確率を推定したい日付(当日)までの残り日数のこと。残り日数に余裕があるほど予約確率は高まりますよね。
あと、Supply and demand dynamicsのnumber of available listings in the neighborhood(近隣の宿泊可能な施設数)という変数もなるほどという感じです。個々のアイテムの特徴だけに注目しがちですが、競合の状況も説明変数に入れるとよさげですね。
更なる工夫として、
- マーケットごとにモデルを作り分ける
- ex. Tokyo, California, ...
- 適応的サンプリング(adaptive sampling)
- 宿泊施設激戦区のサンプル数を相対的に増やす
の2つの手法を使うことでパフォーマンスを上げている模様です。(指標はAUC)
たしかにマーケットごとに上記の特徴量の影響が変わったり、 激戦区とそうでない部分では振る舞いに違いが出そうなので、このような差異を上記の手法でうまく処理できていそうですねー。
②最適価格の提案
①のモデルで算出された予約の発生確率を織り込みながら最適な価格を計算していくのですが、 ここで「最適とは何か?」というものを考えておく必要があります。
なぜなら、教科書的な機械学習のモデリングと異なり、今回のタスクでは必ずしも正解ラベルというのが存在しません。 つまり「この価格が最適だった」を示せるような教師データが存在しないということです。 (価格Pで売れたデータがあったとしても、それが最適だったとは言えないですよね?🤔)
そこで彼らは少なくとも最適とはいえない価格とは何か?ということを考えて、 非最適な価格に対して損失関数をあてがうことにします。具体的には以下の2つのパターンです:
実際に設定された価格とモデルが提案した価格について、
- < だったが、予約が発生した
- モデルの算出した結果が実際に予約された価格よりも低いため、低く見積もりすぎ
- > で、予約が発生しなかった
- 価格でも予約されなかったのに、それより高い価格を提案していることになるため、高く見積もりすぎ
というわけで、上記の条件を使って、損失関数を以下のように定義します。
予約がある場合()と予約がない場合()のそれぞれで、「悪くない」価格提案の領域を設定し、そこから離れれば離れるほど「誤差」=「最適ではない」として損失関数で勘定していきます。ヒンジ関数ないしはε-insensitiveのような損失関数の形に似ていますね🤔
次に、以下のように最適価格を推定するモデルを定義します。
肩にいろいろ乗っかってるのでパッと見てやや複雑ですが、ホストが設定した代表価格 *1に対して、以下の2つのスコアを使って補正をかけるイメージです。
- 予約確率
- モデル①で算出
- 需要スコア
- マーケット以下のクラスタごとに計算される需要スコア
- Gaussian Scaleに標準化されている
「なるほど」と思うのが、どうやら需給の上下に対してどのようにマーケットが応対するかは非対称であるようで、 需要スコアが基準値より低い場合とそうでない場合でグラフを「曲げる」パラメータを分けていることです。*2 イメージとしては以下のようになります。
また、最適化をする際にざっくり以下の5つの工夫をしているようです。
- 学習データは
- リスティングごと
- Airbnbでは同じエリア、同じタイプの部屋の中でも価格の分散が大きいため、ひとつひとつを学習データにする
- 直近数週間のデータが中心
- 短期的なトレンドを反映するため
- リスティングごと
- パラメータに制限をかけている
- 大小変化の激しい提案や、差異の小さすぎる提案価格が出ないようにする
- 確率的勾配降下法(Stochastic Gradient Descent)で最適化
- 予約済みの既知データを使ってハイパーパラメータを調整
- 将来時点の宿泊で予約済みのデータを、モデルにマスクした状態で渡す
- → 望ましい試算になるかどうかを検証する
③パーソナライズ
論文では詳しく説明されていなかった(見逃しているかも)ですが、 Airbnbの機能でホスティングの目標(ex. 宿泊頻度を上げたい)や、宿泊価格の最大・最少値を設定できる*3ようになっているので、ユーザーの設定に合わせてモデルの結果をadjustしている模様です。 「これが最適な価格やぞ」とは提案しつつも押し付けはしないわけですね。
モデルの妥当性のチェック
オフライン
定量的には、需要関数が単に価格の関数になるというナイーブな*4モデルをベンチマークに、結果を比較して新しいモデルの効果を示しています。
また、定性的にも、
- 週末に価格が高騰する
- 3月末~4月初旬の桜シーズンに東京の価格が高騰
などといい感じにマーケット毎のシーズナリティを捉えられているようです。 (学習の結果がしっかり定性的な感覚と一致しているのってわりと気持ちよくて、カタルシスがありますよね…)
オンライン
このモデルは既に1年以上Airbnbで実装されていて、モデルのサジェストを適用したホストについて予約数・予約価格共に大きな伸びを見せたそうです(!) 実運用されていて、実績のあるモデルということで精度はお墨付きな感じがあります。
所感
英語力不足と機械学習力不足によって読み下すのに丸1日かかってしまったのですが、データサイエンスのテクニックがかなり凝縮されているように感じました。 当記事では省略した部分や計算式(評価指標など)もいくつかありますので、データサイエンティスト各位はぜひ元論文を読んでみてください|д゚)
KDD 2018 | Customized Regression Model for Airbnb Dynamic Pricing