はじめに
今回は、以前開催された不動産取引価格予測コンペの評価指標を変更して新たなコンペとして開催されるという、面白い企画でした。
前回優勝のコードでも、上位のスコアには到達できないということで、評価指標によってこんなに結果が変わるものかと、驚きました。
運営の皆様、とても楽しく参加させていただきましたありがとうございました。
また、今回はarenzero(masay)さんにお声がけいただき、初めてチームで参加させていただきました。
最後の最後までとてもエキサイティングな経験をさせていただきました。ありがとうございました。
では、私が担当した部分について、共有させていただきます。
1.全体構成(俺人パート)
全体像としては、以下のとおり2段のスタッキングのモデルでの予測が最高精度になりました。
最終的には、この出力を、arenzeroさんの最高精度の出力と平均して提出していただいたもので、3位に入賞することができました。
一番力を入れたのが、前処理で、trainデータと、政府公示資料の地名や、駅名の表現のゆらぎなどを、うまく繋げられるように、カテゴリ変数化に注力しました。
2.前処理
前処理については、前回のコンペ時に使った前処理をベース(ベースの構成)にして、更に精査しました。
具体的には、以下のようにTrainデータと、政府公示資料を見比べて、どのようにつなぎ合わせるかを検討しました。(特にカテゴリ変数)
データ間で、用語が異なっていて苦労しましたが、実際の現場では、よくある話なので、良い経験になりました。
【カテゴリ変数】
trainのカラム |
変換内容 |
「種類」、「用途」 |
組み合わせることで、政府公示資料の「利用の現状」と繋げられるようにしました。(政府公示資料の「用途」はTrainデータの「用途」とは別物でした) |
「地域」 |
政府公示資料の「用途」に紐付けられるように変換しました。 |
「市区町村コード」 |
政府公示資料の「所在地コード」に紐づけました。 |
「市区町村名」、「最寄り駅:名称」 |
政府公示資料の「市区町村名」、「駅名」と紐付けられるようにコード化しました。このとき、名前にゆらぎがあったので、駅名等が異なっても同じ駅であれば、同じコードになるように工夫しました。 |
「間取り」 |
前回のコンペでの変換ツールを流用して、各部屋種別のOne-hotベクトルと、部屋数に変換しました。 |
「土地の形状」 |
政府公示資料の「形状区分」と紐付けられるように「ほぼ」などの曖昧な表現をなくして、コード化しました。 |
「建物の構造」 |
政府公示資料の「建物構造」に紐付けられるようにコード変換を実施しました。 |
「前面道路:種類」、「前面道路:方位」 |
それぞれ、政府公示資料の「前面道路の方位区分」、「前面道路区分」と紐付けられるようにコード変換しました。 |
「都市計画」 |
政府公示資料の「用途区分」と紐付けられるようにコード変換しました。 |
残りのカテゴリ変数 |
政府公示資料と紐付けずに、Trainデータ内でTarget encodingを実施しました。 |
【数値変数】
trainのカラム |
変換内容 |
「建築年」 |
全部西暦に直して、nanは−1に。 |
「取引時点」 |
年を数値にするとともに、四半期分を「0」「0.25」「0.5」「0.75」に変換。 |
「最寄り駅:距離(分)」 |
文字列で時間の表記になっている箇所を全て分に変換(例:「1H30?2H」→「105」)。また、政府公示資料では、時間ではなく「駅距離」だったので、徒歩の速度80m/分で割って、「距離(分)」を計算。 |
「間口」 |
"以上"、"未満"などの文字列の処理を実施。あわせて、政府公示資料では、「間口」自体の記載はなく、間口と奥行きの比率で記載されていたため、「面積」と「間口(比率)」、「奥行き(比率)」から、算出。 |
「面積」、「延べ床面積」、「建ぺい率」、「容積率」 |
"以上"、"未満"などの文字列の処理を実施。 |
【追加した変数】
- 政府公示資料と紐づけを実施した変数について、政府公示資料での各変数毎にグルーピングして平均した価格を追加。
- 「最寄り駅:名称」、「市区町村コード」、「市区町村名」毎にグルーピングして平均した価格と「面積」を掛けた値を追加。
- 同じく「最寄り駅:名称」、「市区町村コード」、「市区町村名」毎にグルーピングして平均した価格と(「面積」+「延べ床面積」)を掛けた値を追加。
- 「取引時点」から「建築年」を引いた「築年数」を追加。
3.モデル構築
今回は、モデル構築には、それほど時間がかけられず、1段目は、LightGBMとXGboostのハイパーパラメータをOptunaで探索して、CVがよくなるモデルを採用しました。
KFoldでFold数を11のモデルとしています。
また、チーム参加後、気合をいれてスタッキングにも挑戦しました、しかも、2段目は、NNを採用しました。
計算に時間がかかるので、あまりパターンが試せませんでしたが、なんとか7層のNNで最高精度がだせるモデルを作ることができました。
チームに参加していなければ、このモデルを試すこともなかったと思うので、チームを組んでくださって本当に感謝です。
ご参考