不動産価格はいくらになる?
masato8823
こんにちは!
validation score と public scoreについて参加者の皆様に質問があります。 私たちのチームでは、cv:190.497, LB:71.284となり、 このように2つのスコアに大きな差があります。
これはほかの参加者の方々も同様でしょうか。 また、このような結果になる理由としてはどのようなことがあげられるでしょか。
・train data と test dataの分布が異なる(取引時点が2018を境に分かれている) ・public と privateの分け方に偏りがある
などの理由が考えられますが、ほかの参加者の方々はどう考えておられるのか知りたいです。 また、皆様のcvスコアや外れ値の処理方法などあれば参考にさせて頂きたいです。なお、私たちのチームでは現時点で外れ値処理はしていません。
僕も同じような問題に頭を悩ませています。僕の場合は CV: 150.371, Public: 72.258 です。外れ値処理はしていないです。
パッと考えただけで根拠はないですが、乖離が起こる原因としては前者ではなく後者なのではないかと考えています。時系列が異なるけど2018年を境に不動産価格に急激な変化が起こったと考えにくいかなと思っています。むしろ Public には 学習データにあるような外れ値(異常に高い価格)のデータが少ないかもしれないと考えています。
私もその線で考えています。 そうなるとpublicのLBのスコアはあまり参考にならないかもですね
RMSE1標準偏差ととらえられるので、外れ値の影響をモロに受けます。 平均65に対してRMSEが100付近なので外れ値がかなり効いてますね。
値段の分布を確認すると
print((pd.cut(train_df['y'], [-1, 1, 10, 100, 1000, 10000, 100000])).value_counts())
(10, 100] 298760
(100, 1000] 28059
(1, 10] 27126
(1000, 10000] 1700
(-1, 1] 652
(10000, 100000] 47
これからある程度同じような分布の配列と、10%低く外れた予測値を用意します。 あと50000がない状態の配列、予測値も用意します。
mogi = np.array([5]600 + [50]6500+[500]600+[5000]40+[50000])
pred = mogi*0.9
mogi2 = np.array([5]600 + [50]6500+[500]600+[5000]40)
pred2 = mogi2*0.9
これをもとに今回の指標:RMSE、別の価格コンペで使われた指標(RMLSE、MAPE)とで見比べると
MSE = ((mogi-pred)**2).sum()/len(mogi)
print('RMSE', MSE**0.5) #RMSE 68.81
LMSE =((np.log1p(mogi)-np.log1p(pred))**2).sum()/len(mogi)
print('RMLSE', LMSE**0.5) #RMLSE 0.1022
print('MAPE', (np.abs(mogi-pred)/mogi).sum()*100/len(mogi)) #MAPE 10.00
MSE = ((mogi2-pred2)**2).sum()/len(pred2)
print('RMSE-50000', MSE**0.5) #RMSE-50000 38.81
LMSE =((np.log1p(mogi2)-np.log1p(pred2))**2).sum()/len(mogi2)
print('RMLSE-50000', LMSE**0.5) #RMLSE-50000 0.1022
print('MAPE-50000', (np.abs(mogi2-pred2)/mogi2).sum()*100/len(mogi2)) #MAPE-50000 10.00
となってRMSEは全体の0.1%しかない高い値に大きく左右されています。
高い値はpublicには含まれてなさそうなので、privateにどれくらい異常に高い値が含まれるか、それを当てられるか勝負かもです。 コメント欄の使い方慣れてなく見にくくて申し訳ないです。
計算ありがとうございます! RMSEだと高額物件の予測誤差に敏感なので、やはり外れ値とも取れそうな高額物件の予測がカギになりそうですね、