初めに
本記事は、SIGNATEで初めてメダルが取れたのを機に書いた簡単な備忘録です。
この手のサイトで初めての投稿なので拙い点があると思いますが温かい目で見ていただけると嬉しいです。
チャレンジについて
今回参加したチャレンジは国土交通省が主催した地理空間情報チャレンジです。
国土交通省が整備する国土数値情報と、民間企業のデータを活用して不動産の売買価格を予測するチャレンジです。
詳細については以下ページをご参照ください
環境
エディタ
- vscode
言語
python 3.11.9
主要ライブラリ
- pandas
- catboost
- geopandas
- scipy (cKDTree)
- scikit-learn(KFold , mean_absolute_percentage_error)
データセット概要
Train: (363924, 149)
Test: (112437, 149)
Target: money_room(販売価格(掲載価格))
国土数値情報
本チャレンジでは国土数値情報の利用が義務化されていました。
今回は地価公示(L02-19~23)からいくつかを選択し、最近傍で紐づけしました。
モデル開発
- pandasを用いてデータ読み込みした際にいくつかの特徴量が自動で型変換されてしまったため、使いやすい形に変換しました。
- 今回trainデータをまとめて学習すると最低と最高地点の差が激しいのでは?と考え、単純に目的変数である
money_roomをaddr1_1で分割して明らかに高い数値が多かった13番を分離して別々で学習させました。 -
floor_plan_codeが二つの特徴量を結合しているものだったので分離しました。 -
statusesなどのスラッシュ区切りの特徴量は、切り出してターゲットエンコーディングを行いました。その際データリーク防止策として、OOF方式で行いました。 - 地価公示データから特徴量を追加しました。
-
house_areaを一定値でクリッピングし、閾値を上回る値を予測するモデルを作成して補正しました。 - 他いくつかの異常値や欠損値の処理を行いました。
上記他の過程を経て、catboost 5-Foldのクロスバリデーションで学習を行いました。
13番モデルは20000回、13番以外のモデルは50000回で学習を行いました。
最終的には、暫定スコア = 14.2791~ 最終スコア = 14.3225~となりました。
反省点
- 今回のチャレンジではGISデータを活用するのが初めてだったために、とりあえず価格推定に一番関与しそうな地価公示を利用しました。しかし、活用できる情報が現在の価格や面積などしかなく、商店・学校・主要駅の有無や種類など私たちが実際に物件を選ぶときに見る情報が無かったり中途半端だったりして、なぜ土地が高いのかなどの情報がかなり制限されてしまいました。
- また、今回は欠損値が多すぎるものなど以外は雑に利用する形をとってしまったため、無駄に学習に時間がかかることになってしまいました。予測対象を考えたときに大きく関与しなさそうなデータは削除すべきでした。
- 本チャレンジにおけるイテレーションはモデル開発の最後の方に記述した通りですが、スコアの上がり方などを見ているともう少し上げられそうでした。機械学習において、パラメータよりも特徴量の方が重要とはいえ、学習が足りていないとスコアは下がってしまいます。パラメータ調整はざっくりとしたものでやっていましたが、もう少し時間かけるべきだったと思います。
モデルそのものに関しても単一じゃなくてランダムシードや他モデルでスタッキングなどして汎化性能を上げられるようにすべきでした。
最後に
以上の過程を経て、本チャレンジで96位とぎりぎり銅メダルを獲得することができました。
しかし、振り返るともっといろいろできたなぁと思います。自分はデータを見て、最初にできる処理を考えて実行し、その後はその時々で追加の処理を考えていくスタイルが割と多いのですが、それではまだできることを多く見逃してしまう、必要ない処理をして無駄な時間を使うなどで、スコアが伸び悩んでしまうというのが多かったです。
今回改めて自分の過程を振り返ってみて、これでは上位にはいつまでも行けないと感じました。ある程度進捗ができたらどのような処理をしていくべきかや、そもそも良いアプローチができているのかなどを考える時間をとっていきたいなぁ...と思います。
文量の割にごちゃごちゃしていたかと思いますが、今後改善していけたらと思います。
ご精読ありがとうございました。