俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

ProbSpaceのRe:不動産取引価格予測コンペの振り返り(3位入賞!)

データ分析プラットフォームProbspaceRe:不動産取引価格予測コンペに参加し、3位に入賞しました!

PublicLBでは、1位だっただけに、非常に悔しい結果でしたが、初めてチームを組ませていただいて、順位としてもこれまでの最高順位となることができ、とても学びの多い有意義なコンペでした。

f:id:kanriyou_h004:20200811104318p:plain

今回のコンペは、一時度開催された不動産取引価格予測コンペの評価指標を変更したコンペという一風変わったコンペでした。

前回は、思ったように成果が残せなかったので、爪痕は残せたかなと思っています。

では、振り返ってまいりたいと思います。 

1.全体構成(俺人パート)

今回は、arenzero(masay)さんとチームで参加させていただいたので、私が担当した部分を振り返ります。

全体像としては、以下のとおり2段のスタッキングのモデルでの予測が最高精度になりました。

最終的には、この出力を、arenzeroさんの最高精度の出力と平均して提出していただいたもので、3位に入賞することができました。

一番力を入れたのが、前処理で、trainデータと、政府公示資料の地名や、駅名の表現のゆらぎなどを、うまく繋げられるように、カテゴリ変数化に注力しました。

f:id:kanriyou_h004:20200811110629p:plain

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で最高精度がだせるモデルを作ることができました。

チームに参加していなければ、このモデルを試すこともなかったと思うので、チームを組んでくださって本当に感謝です。

4.チームでの参加について

今回、初めてチームで参加させていただいたのですが、最後の最後まで、とても有意義で、エキサイティングな経験をさせていただきました。

特に、締切間際の数分で、提出回数が復活して、提出した最後のSubmissionが、過去最高LBスコアを叩き出して、PublicLB1位をキープできたときは、しびれました。

残念ながら、PrivateLBでは3位となってしまいましたが、いろいろな意見が交換できたり、自分一人なら実施していなかったであろう取り組みができたり、本当によい経験でした。

5.謝辞

コンペを運営してくださいました、ProbSpaceの運営の皆様、コンペに参加してくださった皆様に心より感謝申し上げます。

チーム参加のお声がけをくださいました、arenzero(masay)さんのおかげで、単独で参加するコンペよりも何倍も素敵なコンペにすることができました。この場を借りて、厚く御礼を申し上げます。

またの機会がございましたら、もっと貢献できるよう更に腕を磨いていきたいと思います。

 

【過去記事】

これまでの道のりは以下の記事をご参照ください。

oregin-ai.hatenablog.com