見出し画像

Sonyの予測システム

Sonyが予測システムを無料で公開したので試してみた.

PM2.5の予測を入れてみた.計算時間は10分程度でニューラルネットとAda Boostを色々試した後に「あと1分です」という表示のところで止まってしまった.

そこで小さい住宅価格の例題を入れてみた.ここにあるrent.csvだ.

今度は無事に計算できた.特徴ベクトルの寄与度に興味があったので,それを表示させてみたのが,冒頭の図だ.住宅価格の予測に最も寄与しているのは,緯度と経度のようだ.scikit-learnのfeature importanceだとバスルームの数が最も寄与していると出てくるので,ちゃんと計算されているようだ.

おそらく各列を落としてから,再計算して寄与度を計算していると思われる.この方法は寄与度の計算としては正しいのだが,再計算の手間がかかる.4万行のPM2.5程度の規模の問題でも,この部分に(予想外の)計算時間がかかるので,「あと1分」のところで止まっているのだろう.

近似だがpermutation importanceを使うことが上記サイトでは推奨されている.大規模問題の場合には,こちらに切り替えるなどの工夫が必要だろう.

「あと1分」と出てから30分くらい粘ったら結果が出てきた.RMSEは0.82でfast.aiで計算した0.67よりだいぶ悪いようだ.

learn = tabular_learner(data, layers=[200,100], metrics=root_mean_squared_error)
learn.fit_one_cycle(5, 1e-2, wd=.2)

>>>poch	train_loss	valid_loss	root_mean_squared_error	time
0	0.508957	0.745530	0.826910	00:05
1	0.460187	0.705507	0.790207	00:05
2	0.395512	0.676495	0.784459	00:05
3	0.322783	0.638453	0.756133	00:05
4	0.262419	0.483152	0.676921	00:05

ニューラルネットはカテゴリーデータを数値化しているようだが,one-hot encodingなのだろう.fast.aiは埋め込み層を用いている.もちろん,Sonyのアーキテクチャはブラックボックス分からないが,計算時間からみて2-3層のニューラルネットなのだろう.比較したfast.aiではEmbed層のあとに200個,100個を配置して,間にはバッチ正規化(自動的に)が入っている.最適化は最新の1サイクル法を用いている.アーキテクチャはこんな感じだ.

 model=TabularModel(
 (embeds): ModuleList(
   (0): Embedding(6, 4)
   (1): Embedding(13, 7)
   (2): Embedding(32, 11)
   (3): Embedding(25, 10)
   (4): Embedding(70, 17)
   (5): Embedding(5, 4)
   (6): Embedding(29, 11)
   (7): Embedding(38, 12)
 )
 (emb_drop): Dropout(p=0.0)
 (bn_cont): BatchNorm1d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
 (layers): Sequential(
   (0): Linear(in_features=79, out_features=200, bias=True)
   (1): ReLU(inplace)
   (2): BatchNorm1d(200, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (3): Linear(in_features=200, out_features=100, bias=True)
   (4): ReLU(inplace)
   (5): BatchNorm1d(100, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (6): Linear(in_features=100, out_features=1, bias=True)
 )
), opt_func=functools.partial(<class 'torch.optim.adam.Adam'>, betas=(0.9, 0.99))

Random Forestでも0.7程度は出るようだ.適当に作ったものだが,Sonyのものに内蔵されているAda Boostも大規模問題を想定していないのだろうか?

from sklearn.ensemble import RandomForestRegressor #ランダム森
forest = RandomForestRegressor(n_estimators=100,min_samples_leaf=5,oob_score=True)
forest.fit(X_train, y_train)    # 学習
yhat = forest.predict(X_test)   # 予測

from sklearn.metrics import mean_squared_error
np.sqrt( mean_squared_error(y_test,yhat) )

>>>
0.703396488638857

自分では何もできない人が小規模な問題例で予測するには良いかもしれないが,もう少し勉強してから公開して欲しい気もする.



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