終了済み: 不動産取引価格予測

不動産価格はいくらになる?

賞金: 100,000 参加チーム数: 349 30日前に終了

不動産価格予測 2nd Solution

はじめに

private LB 2位の解法について書いていこうと思います。頭の整理を兼ねたもので長々としていますのでご注意ください。

 はじめに、今回のコンペの概要と個人的な要点を書いておきます。

 今回の不動産価格予測コンペは、東京都の「中古マンション・宅地(土地のみ)・宅地(土地と建物)・林地・農地」における不動産価格を予測する、とういものでした。また、評価指標は大きな誤差に厳しいRMSE、private LBによる最終順位の決定でした。加えて、公示価格等の一部外部データの利用も可能でした。

 いくつかのトピックにあったとおり、public LB と private LB それぞれで評価されているデータには偏りがあり、public LB には、異常に価格が高い、外れ値ともとれるようなデータが存在せず、 そのようなデータは private LB で評価されるため、shake up が起こりやすのではないか、という点も議論されました。また train_data と test_data の分け方が、2018年という「時点」を境にした分割方法であったこともポイントの1つだと思います。(トピック「Train と Test の重なり」等参照)  

コンペ全体における仮定

 上記のポイントを踏まえて、今回のコンペ全体において、 private LBで結果をだすために、いくつかの仮説を立てました。

  1. private LB とpublicの評価データには明確な違いがある。

  2. 超高額な不動産価格をあてることが最重要である。

  3. train_data だけでは学習が十分できないデータが test_data に存在する。

  4. train_data と test_data の分布はほぼ完全に同一である。

1.、 2. に関しては、はじめに やトピックで議論されていたことの通りです。 3.は、train_data のある地区内にある高額ではない不動産情報だけでは、test_data の同地区内に高額物件があったときに予測がむずかしくなる(ある程度過小評価する)可能性があるかもしれないという仮説です。4.は、時点を境にtrain_data と test_data が分けられていますが、test_data の期間は比較的短いため、時間トレンドによる変化は多少あるものの全体としての分布の形はほぼ同一だと仮定しました。

特徴量作成におけるポイント

 前処理・特徴量作成における個人的なポイントを書いておきます。以下の点を踏まえたうえで、前処理・特徴量作成を行いました。  

  1. ほとんどの欠損には意味がある。
  2. 高額な宅地の価格を上手く予測することが重要。
  3. 不動産の時価=地価価格×面積 より、地価価格情報と面積情報が特に重要な特徴量である。
  4. ある程度のリークが存在する。

 今回のデータには train_data、test_data に共通して、ほぼどのデータにも欠損地が存在しました。その点から、欠損値は意味を持っていると仮定しました。実際、例えば「間口」は宅地のみ、「間取り」は中古マンションのみにデータが存在し、他は欠損であるというように、欠損値をみればある程度そのデータの「種類」(マンションか、宅地か、林地か等)がわかります。そのため欠損は欠損のまま扱うことにしています。

 2.に関して、高額不動産はそろいもそろってほぼほぼ宅地でした。そこで、宅地にまつわるデータの前処理、特徴量作成は丁寧に行いました。データをみると、打ち止めの値が存在する特徴量(面積、前面道路幅員、延床面積等)と、そうでない特徴量(間口、建ぺい率、容積率等)があったので、後者の特徴量を使い、前者の特徴量を算出しました。例えば、奥行=面積÷間口、面積’=間口×奥行、敷地面積=面積×容積率÷100、延床面積=容積率×敷地面積÷100 のように、ネットで得たドメイン知識等から宅地にまつわる特徴量を作成しました。

 主催者側提示の外部データの中から、公示価格、緯度経度情報を用いて特徴量を作成しました。公示価格、緯度経度どちらも地区名レベル(東京都青梅市駒木町2丁目20番1外 ⇒ 東京都青梅市駒木町)で平均(または最大値や中央値)をとったもので辞書を作り、その辞書を適用、辞書に当該住所がない場合は、地区名レベルから1つレベルを落としたもの(東京都青梅市駒木町 ⇒ 東京都青梅市)で同様に辞書をつくり、それに適用しました。また、港区赤坂からの距離を緯度経度情報から算出し、特徴量としました。

 リークに関しては、取引時点をのぞいた train_data, test_data 両方に全く同じ不動産がいくつかあったので、同一不動産には同じラベルを付与した特徴量を作成しました。

モデル

私たちのチームのモデルの全体図は以下のようになります。 ![c59e0c14-c9d1-49fe-af03-5485877c25fc.jpg](https://probspace-stg.s3-ap-northeast-1.amazonaws.com/uploads/user/e7fa157028d9d885ed958986bda73057/images/UserImage_74/c59e0c14-c9d1-49fe-af03-5485877c25fc.jpg =300x)

 ベースとなるモデルは2つで、その2つの予測値を加重平均+後処理を経て最終的なsubbmitにしています。  base model ① では、public LB で評価されるような低~5000程度までの高額不動産を主な予測対象としたモデル、base model ② は、5000以上の超高額の不動産を主な予測対象としたモデルになります。どちらも、目的変数は対数をとって分布を変えています。

 base model ① は、主に target encoding を用いることによって最大限 train_data そのものを学習させ、低~高程度の不動産価格物件の価格の予測精度向上を試みています。base model ② は、targer encoding は用いず、不動産の素のポテンシャル+公示価格をメインに学習させています。

 それぞれのモデルで後処理を行っています。これは train_data と test_data の分布がほぼ同一の仮定の下、test_data の分布を train_data の分布にできる限り寄せるため、テストデータの予測値の上位0.01%(train_data の 価格10000以上の割合)の値に、train_data のそれが最適になるくらいの係数をかけていています。  最終的に、base model ② の予測結果に対して、5000以上の値は base model ② に対して大きく重きを置いた加重平均、5000未満の値は base model ① にたいして大きく重きを置いた加重平均をとっています。最後に base model と同様の後処理をして、予測値を出しています。(ここでは、1位の chun1182 さんの解法にある「おみくじ」のような感じで適当に係数を決めています。)

おわりに

 今回のコンペでの1番のネックというか重要なことは、private LB 1位の chun1182 さんもおっしゃっている通り、評価指標がRMSEであったことだと個人的に思います。shake up が起きて面白かったですが、超高額な不動産価格をあてることができれば、他はなあなあでもよくなってしまいます。コンペを通してそこが一番難しいところだなと感じました。

 モデルに関しても、「種類」ごとにデータをわけたり、超高額物件とその他で分類問題として解いたのち、データをそれらに分類する two-part-model を用いたり、under-sampling や bagging を用いた不均衡データに対するアプローチをしてみたりしましたが、なかなか上手いこといかないものだと思いました。

 2か月間を通して取り組むことができ、色々と勉強になりました。運営さんありがとうございました。参加者の皆様お疲れさまでした。

コードは以下にのっけてあります。 https://github.com/mst8823/ProbSpace_real-estate

Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。