Re:不動産取引価格予測 おさらい
この記事 is 何?
Re:不動産取引価格予測コンペ全体の情報を1ページにまとめた記事
なんで書いたのか
不動産の価格推定は今後、趣味のみならず実務等でも扱われそうな分野なので情報をまとめておきたい
補足) Signateの学生コンペ2019でも出題されたので、今後もコンペとして扱われやすいお題だと思う
コンペ概要
前回コンペ不動産取引価格予測の評価関数がRMSEであり、外れ値への最適化が勝敗を分ける結果になってしまったという反省点から、評価関数RMSLEに変更しての再開催 東京都の不動産についての取引金額を予測する
table:概要
賞金 期間 参加者数
10,0000円 2020/6/26/ - 2020/8/11 255
データの種類とタスク
テーブルデータを用いた回帰タスク
データサイズは小さいので高スペックマシンを用意しなくても分析はできると思います
train/testの差分として取引時点で分けられていることがわかります
https://gyazo.com/a2e655d7cd393cc22a47129a63e2b797
trainは2005年から2017年まで、testは2018年から2019までの取引価格を扱っていること
EDA結果
arenazeroさんのEDA結果になります
targetはだいぶ歪んでいる
生histogram
https://gyazo.com/72b2f708cf474224cac6849b9be4945b
np.log1pかけたもの
https://gyazo.com/6e9808ead6acd3e60a156a56486040da
boxplotで描画したもの
https://gyazo.com/0fcf51a85a1691717d7e66dc1615e428
table:ファイル概要
ファイル名 データサイズ レコード数 カラム数
train_data.csv 73MB 356,344 28
test_data.csv 7MB 34,844 27
published_land_price.csv 2MB 2,602 116
評価方法
評価指標はRMSLE
コンペ全体の感想
CVとLBの差もほとんど見られない良いコンペ
一般的なテーブルコンペかつ外部データ利用なしだったので、良い特徴量を生成できたかどうかが順位の分け目
Angus_Changさんが締め切り5日前に参加してPrivate1位をもぎとったところを見ると特にそう思います 公示価格(published_land_price.csv)と予測対象の不動産(test_data.csv)はIDで結びついてほしかった
勉強になる Kernel と Discussion
前処理、文字列から数値変換誤字の修正等がまとまっていたのでやこれをbaselineとして使った方が多かったのでは
またtrain_data.csv/test_data.csvとpublished_land_price.csvを紐づけして公示地価を利用するコードがあった
背景を説明しておくとpublished_land_price.csvは取引された不動産の住所が記載されていました
しかしtrain_data.csv/test_data.csvには市区町村や最寄り駅までしか各レコードに記載されていないため、published_land_price.csvと結合するには市区町村や最寄り駅等をキーにする必要がありました
上位解法概要
目的関数をrmseではなくHuber lossにしている点、Fair lossも試したよう
これについてはSignateの飯田産業 土地の販売価格の推定でも似た事例あり、ただしこちらは評価関数がmape
published dataの活用:単に同じカテゴリでのH31価格のmean,median,count,stdをマージしたものがMerge1だった。しかし途中で取引年を考慮したmergeを実行し、それがMerge2。このmerge2はよく効いた。当たり前かもしれないが、取引時点によっては平均価格帯などが変わる。
merge_data_2の処理がそれに該当するみたい
train/testに市区町村コードや最寄り駅名でグルーピングした公示地価を代入する際に取引時点の年数が同じであるものにという条件を組んだよう
あとはスタッキングが効いたようだ
https://cdn-ak.f.st-hatena.com/images/fotolife/k/kanriyou_h004/20200811/20200811110629.png
baseline作成後に効いたのは、市区町村名、地区名それぞれでgroupbyして、建ぺい率、容積率、面積の集計特徴量でした
えっそんな特徴量が効くの!?というのが感想
train、testが時系列で別れていたのと、取引時期において不動産の取引価格は変動するというドメインからGroupKFoldも試しました。
KFoldでもCVとLBはちゃんと相関していたので問題なかったと思いますがGroupKFoldにするとLBのスコアはあまり変わらないけれどCVは悪化していたので、KFoldのほうがもしかしたらCVを過大評価しているのかもしれないと考えました。
ただ、LBのスコアはKFoldのほうがよかったので最終的にはどちらも使って(特徴量作成、モデリングともに)、最終的にアンサンブルする方針にしました。
自分の場合、取引時点のことは知っていましたが結局CVとLBが相関していたのでFoldの分け方はKFoldのままでした
特徴量 : よく出てくる日本語はフラグにして使用 (e.g. 'usage'), 欠損自体に意味がある気がしたので'is_nan' as a feature, など(スコア改善しなかったのでpublished_land_price.csvは使ってないです)
自分の場合、市区町村名や最寄り駅名毎の公示地価が効いたので使われていないことは印象的でした
具体的には、前回の不動産取引価格予測の chun1182さんの 1st solution のコメントにある
「id:価格でいうと{1306:30000, 1961:13000, 8070:28000}くらい」
結構効いたのかな?