【データコンペ】予測結果を四捨五入
四捨五入というシンプルな処理なのですが、
意外と効いたのと学びがありました。
1. 四捨五入した理由
テストデータを真数変換した時に、
データが以下のように丸められていることに気付きました。
そもそもマンションで端数の価格って見ないですよね。
ただ「データコンペだ!」と構えると意外と見落としてしまいます。
数値全体をプロットして眺めてみると、上三桁で四捨五入していました。
実際のマンションは価格は3,210万とか存在するので、
これはコンペデータ用にそういう加工がされてるということですね。多分。
そこで自分が提出している予測データを見てみると・・
当然ですがこのように小数点まで存在する数値になっていました。
そのため提出データの四捨五入が必要になりました。
2. 四捨五入の実行方法
以下のように、データをintとfloatで分割して、
intの方を上三桁で四捨五入するようにしています。
def round_money(yen_data):
yen_data_int, yen_data_float = str(yen_data).split('.')
if len(yen_data_int) >= 3:
yen_data = round(yen_data,-1)
if len(yen_data_int) >= 4:
yen_data = round(yen_data,-2)
if len(yen_data_int) >= 5:
yen_data = round(yen_data,-3)
if len(yen_data_int) >= 6:
yen_data = round(yen_data,-4)
if len(yen_data_int) >= 7:
yen_data = round(yen_data,-5)
if len(yen_data_int) >= 8:
yen_data = round(yen_data,-6)
if len(yen_data_int) >= 9:
yen_data = round(yen_data,-7)
return yen_data
特に説明不要ですね・・?
この処理を加えることで、正解データに合わせた
データ単位でのテストデータ提出が可能になりました。
3. 学びとして
このコンペではそうした方が良いという話ではなく、
実務でも使うには、予測データを相手が必要なデータに合わせて加工する、
という考え自体が重要だと考えています。
3100万か3000万聞かれているタスクで、
3048.9958万では永遠にあたらない訳ですね。
ただこれはかなりビジネス的な発想かもしれない、という疑いもあります。
評価指標がRSEだったので、モデルの生成方法によっては変わるのかも。
でもこの視点はとても大事なはず!