【データコンペ】予測結果を四捨五入

四捨五入というシンプルな処理なのですが、
意外と効いたのと学びがありました。

1. 四捨五入した理由

テストデータを真数変換した時に、
データが以下のように丸められていることに気付きました。

そもそもマンションで端数の価格って見ないですよね。
ただ「データコンペだ!」と構えると意外と見落としてしまいます。

数値全体をプロットして眺めてみると、上三桁で四捨五入していました。
実際のマンションは価格は3,210万とか存在するので、
これはコンペデータ用にそういう加工がされてるということですね。多分。

そこで自分が提出している予測データを見てみると・・
当然ですがこのように小数点まで存在する数値になっていました。

↓予測結果(円)
152659.5578
200268.2026
481912.2877
525800.5064

そのため提出データの四捨五入が必要になりました。

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だったので、モデルの生成方法によっては変わるのかも。

でもこの視点はとても大事なはず!


この記事が気に入ったらサポートをしてみませんか?