if (!require(keras3))
{
  install.packages("keras3")
  library(keras3)
  #install_keras() # r-kerasという仮想環境にKerasがインストールされる。
  # install_keras(tensorflow = "gpu") # GPU演算用(NVIDIA GPUとcuDNNが必要)
}
##  要求されたパッケージ keras3 をロード中です
if (!require(plotly)) install.packages("plotly")
##  要求されたパッケージ plotly をロード中です
##  要求されたパッケージ ggplot2 をロード中です
## 
##  次のパッケージを付け加えます: 'plotly'
##  以下のオブジェクトは 'package:ggplot2' からマスクされています:
## 
##     last_plot
##  以下のオブジェクトは 'package:stats' からマスクされています:
## 
##     filter
##  以下のオブジェクトは 'package:graphics' からマスクされています:
## 
##     layout
set.seed(5) # 乱数シード

n <- 24*7*2 # 時間数(全14日)
x <- 1:n    # 時刻
x2 <- x^2
x3 <- 100*sin(2*pi*x/24)

f <- function(x) 100 + 0.1*x + 0.02*x2 + x3

y <- f(x) + rnorm(n, sd = 5)

d <- data.frame(y, x, x2, x3)

d
##               y   x     x2            x3
## 1    121.797627   1      1  2.588190e+01
## 2    157.201797   2      4  5.000000e+01
## 3    164.913219   3      9  7.071068e+01
## 4    187.673254   4     16  8.660254e+01
## 5    206.149787   5     25  9.659258e+01
## 6    198.305460   6     36  1.000000e+02
## 7    195.911751   7     49  9.659258e+01
## 8    185.505684   8     64  8.660254e+01
## 9    171.801810   9     81  7.071068e+01
## 10   153.690541  10    100  5.000000e+01
## 11   135.540056  11    121  2.588190e+01
## 12   100.071103  12    144  1.224606e-14
## 13    73.396132  13    169 -2.588190e+01
## 14    54.532328  14    196 -5.000000e+01
## 15    29.930522  15    225 -7.071068e+01
## 16    19.422529  16    256 -8.660254e+01
## 17     7.900852  17    289 -9.659258e+01
## 18    -2.639834  18    324 -1.000000e+02
## 19    13.731504  19    361 -9.659258e+01
## 20    22.100683  20    400 -8.660254e+01
## 21    44.711882  21    441 -7.071068e+01
## 22    66.589347  22    484 -5.000000e+01
## 23    94.337905  23    529 -2.588190e+01
## 24   117.453805  24    576 -2.449213e-14
## 25   144.976949  25    625  2.588190e+01
## 26   164.652591  26    676  5.000000e+01
## 27   195.083623  27    729  7.071068e+01
## 28   212.576410  28    784  8.660254e+01
## 29   213.027172  29    841  9.659258e+01
## 30   216.736023  30    900  1.000000e+02
## 31   220.492158  31    961  9.659258e+01
## 32   215.831011  32   1024  8.660254e+01
## 33   206.867981  33   1089  7.071068e+01
## 34   182.605518  34   1156  5.000000e+01
## 35   161.278013  35   1225  2.588190e+01
## 36   134.277869  36   1296  3.673819e-14
## 37   100.150432  37   1369 -2.588190e+01
## 38    72.677636  38   1444 -5.000000e+01
## 39    54.798393  39   1521 -7.071068e+01
## 40    48.684419  40   1600 -8.660254e+01
## 41    48.877719  41   1681 -9.659258e+01
## 42    35.467884  42   1764 -1.000000e+02
## 43    44.314523  43   1849 -9.659258e+01
## 44    65.995799  44   1936 -8.660254e+01
## 45    72.006477  45   2025 -7.071068e+01
## 46    99.731117  46   2116 -5.000000e+01
## 47   118.563053  47   2209 -2.588190e+01
## 48   148.578777  48   2304 -4.898425e-14
## 49   175.180262  49   2401  2.588190e+01
## 50   204.653944  50   2500  5.000000e+01
## 51   235.146921  51   2601  7.071068e+01
## 52   246.821171  52   2704  8.660254e+01
## 53   263.182697  53   2809  9.659258e+01
## 54   260.760826  54   2916  1.000000e+02
## 55   262.031579  55   3025  9.659258e+01
## 56   250.297775  56   3136  8.660254e+01
## 57   245.157202  57   3249  7.071068e+01
## 58   222.516955  58   3364  5.000000e+01
## 59   201.081450  59   3481  2.588190e+01
## 60   179.166376  60   3600  2.388660e-13
## 61   148.955181  61   3721 -2.588190e+01
## 62   137.354152  62   3844 -5.000000e+01
## 63   112.077470  63   3969 -7.071068e+01
## 64   104.199267  64   4096 -8.660254e+01
## 65    90.607128  65   4225 -9.659258e+01
## 66    92.013069  66   4356 -1.000000e+02
## 67    89.375772  67   4489 -9.659258e+01
## 68   111.168948  68   4624 -8.660254e+01
## 69   125.047405  69   4761 -7.071068e+01
## 70   153.601669  70   4900 -5.000000e+01
## 71   181.017609  71   5041 -2.588190e+01
## 72   209.751929  72   5184 -7.347638e-14
## 73   241.497047  73   5329  2.588190e+01
## 74   267.081839  74   5476  5.000000e+01
## 75   292.778335  75   5625  7.071068e+01
## 76   308.945798  76   5776  8.660254e+01
## 77   327.740010  77   5929  9.659258e+01
## 78   330.085451  78   6084  1.000000e+02
## 79   330.258451  79   6241  9.659258e+01
## 80   319.788115  80   6400  8.660254e+01
## 81   312.522759  81   6561  7.071068e+01
## 82   283.968488  82   6724  5.000000e+01
## 83   276.839550  83   6889  2.588190e+01
## 84   249.399586  84   7056  8.572244e-14
## 85   230.496518  85   7225 -2.588190e+01
## 86   202.968452  86   7396 -5.000000e+01
## 87   201.305485  87   7569 -7.071068e+01
## 88   174.710300  88   7744 -8.660254e+01
## 89   170.348555  89   7921 -9.659258e+01
## 90   168.390800  90   8100 -1.000000e+02
## 91   182.757653  91   8281 -9.659258e+01
## 92   186.565404  92   8464 -8.660254e+01
## 93   214.354491  93   8649 -7.071068e+01
## 94   240.623653  94   8836 -5.000000e+01
## 95   269.067824  95   9025 -2.588190e+01
## 96   295.838040  96   9216 -9.796851e-14
## 97   322.028985  97   9409  2.588190e+01
## 98   349.179054  98   9604  5.000000e+01
## 99   375.717900  99   9801  7.071068e+01
## 100  396.306042 100  10000  8.660254e+01
## 101  400.735648 101  10201  9.659258e+01
## 102  423.956556 102  10404  1.000000e+02
## 103  422.451555 103  10609  9.659258e+01
## 104  414.364957 104  10816  8.660254e+01
## 105  401.421450 105  11025  7.071068e+01
## 106  389.789057 106  11236  5.000000e+01
## 107  364.417578 107  11449  2.588190e+01
## 108  334.251737 108  11664  1.102146e-13
## 109  318.870543 109  11881 -2.588190e+01
## 110  309.400758 110  12100 -5.000000e+01
## 111  282.044797 111  12321 -7.071068e+01
## 112  283.589357 112  12544 -8.660254e+01
## 113  283.088127 113  12769 -9.659258e+01
## 114  272.018243 114  12996 -1.000000e+02
## 115  272.653819 115  13225 -9.659258e+01
## 116  298.112115 116  13456 -8.660254e+01
## 117  306.994343 117  13689 -7.071068e+01
## 118  342.598600 118  13924 -5.000000e+01
## 119  369.500243 119  14161 -2.588190e+01
## 120  398.989841 120  14400 -4.777320e-13
## 121  436.656187 121  14641  2.588190e+01
## 122  464.304224 122  14884  5.000000e+01
## 123  479.001235 123  15129  7.071068e+01
## 124  498.306286 124  15376  8.660254e+01
## 125  526.888835 125  15625  9.659258e+01
## 126  531.570418 126  15876  1.000000e+02
## 127  529.872415 127  16129  9.659258e+01
## 128  533.298019 128  16384  8.660254e+01
## 129  509.598626 129  16641  7.071068e+01
## 130  493.792933 130  16900  5.000000e+01
## 131  488.944650 131  17161  2.588190e+01
## 132  451.787358 132  17424 -2.205647e-13
## 133  434.993343 133  17689 -2.588190e+01
## 134  421.999804 134  17956 -5.000000e+01
## 135  410.954187 135  18225 -7.071068e+01
## 136  399.195858 136  18496 -8.660254e+01
## 137  393.927815 137  18769 -9.659258e+01
## 138  389.311545 138  19044 -1.000000e+02
## 139  406.971130 139  19321 -9.659258e+01
## 140  420.893271 140  19600 -8.660254e+01
## 141  437.029347 141  19881 -7.071068e+01
## 142  467.333233 142  20164 -5.000000e+01
## 143  508.299274 143  20449 -2.588190e+01
## 144  533.907092 144  20736 -1.469528e-13
## 145  559.356661 145  21025  2.588190e+01
## 146  588.827983 146  21316  5.000000e+01
## 147  618.090448 147  21609  7.071068e+01
## 148  638.333492 148  21904  8.660254e+01
## 149  648.436508 149  22201  9.659258e+01
## 150  663.037006 150  22500  1.000000e+02
## 151  672.443025 151  22801  9.659258e+01
## 152  667.641395 152  23104  8.660254e+01
## 153  651.603794 153  23409  7.071068e+01
## 154  643.761680 154  23716  5.000000e+01
## 155  618.809228 155  24025  2.588190e+01
## 156  608.511295 156  24336  5.144702e-13
## 157  581.107620 157  24649 -2.588190e+01
## 158  571.061832 158  24964 -5.000000e+01
## 159  548.592730 159  25281 -7.071068e+01
## 160  542.328034 160  25600 -8.660254e+01
## 161  524.820693 161  25921 -9.659258e+01
## 162  552.311273 162  26244 -1.000000e+02
## 163  551.554576 163  26569 -9.659258e+01
## 164  575.853860 164  26896 -8.660254e+01
## 165  587.734734 165  27225 -7.071068e+01
## 166  614.423096 166  27556 -5.000000e+01
## 167  648.397145 167  27889 -2.588190e+01
## 168  680.686530 168  28224 -1.714449e-13
## 169  713.903620 169  28561  2.588190e+01
## 170  742.571608 170  28900  5.000000e+01
## 171  765.429940 171  29241  7.071068e+01
## 172  796.201385 172  29584  8.660254e+01
## 173  806.299649 173  29929  9.659258e+01
## 174  814.157494 174  30276  1.000000e+02
## 175  826.415101 175  30625  9.659258e+01
## 176  825.382715 176  30976  8.660254e+01
## 177  822.852119 177  31329  7.071068e+01
## 178  796.132647 178  31684  5.000000e+01
## 179  789.183337 179  32041  2.588190e+01
## 180  763.025036 180  32400 -1.715804e-13
## 181  758.346329 181  32761 -2.588190e+01
## 182  727.261134 182  33124 -5.000000e+01
## 183  721.119618 183  33489 -7.071068e+01
## 184  713.789373 184  33856 -8.660254e+01
## 185  700.085050 185  34225 -9.659258e+01
## 186  709.132893 186  34596 -1.000000e+02
## 187  720.540424 187  34969 -9.659258e+01
## 188  737.157335 188  35344 -8.660254e+01
## 189  766.312262 189  35721 -7.071068e+01
## 190  785.158308 190  36100 -5.000000e+01
## 191  826.175789 191  36481 -2.588190e+01
## 192  858.311185 192  36864 -1.959370e-13
## 193  887.587190 193  37249  2.588190e+01
## 194  924.372841 194  37636  5.000000e+01
## 195  949.772076 195  38025  7.071068e+01
## 196  981.217887 196  38416  8.660254e+01
## 197  996.553679 197  38809  9.659258e+01
## 198 1004.291009 198  39204  1.000000e+02
## 199 1005.258269 199  39601  9.659258e+01
## 200 1010.234585 200  40000  8.660254e+01
## 201  998.262287 201  40401  7.071068e+01
## 202  984.804496 202  40804  5.000000e+01
## 203  975.307747 203  41209  2.588190e+01
## 204  948.844341 204  41616  5.634544e-13
## 205  936.497587 205  42025 -2.588190e+01
## 206  921.373908 206  42436 -5.000000e+01
## 207  910.025238 207  42849 -7.071068e+01
## 208  904.160313 208  43264 -8.660254e+01
## 209  896.089709 209  43681 -9.659258e+01
## 210  906.701884 210  44100 -1.000000e+02
## 211  921.020083 211  44521 -9.659258e+01
## 212  936.623132 212  44944 -8.660254e+01
## 213  960.608053 213  45369 -7.071068e+01
## 214  984.958723 214  45796 -5.000000e+01
## 215 1024.236671 215  46225 -2.588190e+01
## 216 1052.581059 216  46656 -2.204291e-13
## 217 1088.648685 217  47089  2.588190e+01
## 218 1129.373915 218  47524  5.000000e+01
## 219 1154.266348 219  47961  7.071068e+01
## 220 1179.619748 220  48400  8.660254e+01
## 221 1196.566747 221  48841  9.659258e+01
## 222 1207.713504 222  49284  1.000000e+02
## 223 1223.598568 223  49729  9.659258e+01
## 224 1210.668607 224  50176  8.660254e+01
## 225 1197.819506 225  50625  7.071068e+01
## 226 1193.512140 226  51076  5.000000e+01
## 227 1170.178520 227  51529  2.588190e+01
## 228 1160.102042 228  51984  5.879466e-13
## 229 1141.417584 229  52441 -2.588190e+01
## 230 1113.509705 230  52900 -5.000000e+01
## 231 1117.699405 231  53361 -7.071068e+01
## 232 1117.965900 232  53824 -8.660254e+01
## 233 1109.697213 233  54289 -9.659258e+01
## 234 1115.387724 234  54756 -1.000000e+02
## 235 1128.755161 235  55225 -9.659258e+01
## 236 1160.405568 236  55696 -8.660254e+01
## 237 1183.347025 237  56169 -7.071068e+01
## 238 1202.949871 238  56644 -5.000000e+01
## 239 1238.910230 239  57121 -2.588190e+01
## 240 1281.848391 240  57600 -9.554640e-13
## 241 1313.123840 241  58081  2.588190e+01
## 242 1344.892509 242  58564  5.000000e+01
## 243 1375.690250 243  59049  7.071068e+01
## 244 1409.077235 244  59536  8.660254e+01
## 245 1414.201845 245  60025  9.659258e+01
## 246 1431.501935 246  60516  1.000000e+02
## 247 1443.775286 247  61009  9.659258e+01
## 248 1440.575031 248  61504  8.660254e+01
## 249 1429.836597 249  62001  7.071068e+01
## 250 1427.045095 250  62500  5.000000e+01
## 251 1409.710869 251  63001  2.588190e+01
## 252 1393.945503 252  63504 -9.810403e-14
## 253 1380.418875 253  64009 -2.588190e+01
## 254 1363.752705 254  64516 -5.000000e+01
## 255 1346.070636 255  65025 -7.071068e+01
## 256 1342.006018 256  65536 -8.660254e+01
## 257 1347.156216 257  66049 -9.659258e+01
## 258 1352.819305 258  66564 -1.000000e+02
## 259 1374.819040 259  67081 -9.659258e+01
## 260 1391.245874 260  67600 -8.660254e+01
## 261 1410.531034 261  68121 -7.071068e+01
## 262 1449.548925 262  68644 -5.000000e+01
## 263 1488.709842 263  69169 -2.588190e+01
## 264 1517.336449 264  69696  4.411293e-13
## 265 1557.255929 265  70225  2.588190e+01
## 266 1602.707147 266  70756  5.000000e+01
## 267 1627.165794 267  71289  7.071068e+01
## 268 1647.187829 268  71824  8.660254e+01
## 269 1662.706167 269  72361  9.659258e+01
## 270 1681.343132 270  72900  1.000000e+02
## 271 1690.733879 271  73441  9.659258e+01
## 272 1688.555469 272  73984  8.660254e+01
## 273 1684.934825 273  74529  7.071068e+01
## 274 1686.246620 274  75076  5.000000e+01
## 275 1675.174981 275  75625  2.588190e+01
## 276 1651.137485 276  76176  6.369308e-13
## 277 1629.679219 277  76729 -2.588190e+01
## 278 1624.236470 278  77284 -5.000000e+01
## 279 1615.459368 279  77841 -7.071068e+01
## 280 1608.785068 280  78400 -8.660254e+01
## 281 1611.353189 281  78961 -9.659258e+01
## 282 1614.817829 282  79524 -1.000000e+02
## 283 1628.422587 283  80089 -9.659258e+01
## 284 1659.752058 284  80656 -8.660254e+01
## 285 1680.172685 285  81225 -7.071068e+01
## 286 1710.362003 286  81796 -5.000000e+01
## 287 1757.197882 287  82369 -2.588190e+01
## 288 1787.765070 288  82944 -2.939055e-13
## 289 1834.439389 289  83521  2.588190e+01
## 290 1857.568303 290  84100  5.000000e+01
## 291 1892.337058 291  84681  7.071068e+01
## 292 1924.495505 292  85264  8.660254e+01
## 293 1945.493233 293  85849  9.659258e+01
## 294 1958.522750 294  86436  1.000000e+02
## 295 1966.861510 295  87025  9.659258e+01
## 296 1964.836245 296  87616  8.660254e+01
## 297 1969.422868 297  88209  7.071068e+01
## 298 1960.801534 298  88804  5.000000e+01
## 299 1944.738359 299  89401  2.588190e+01
## 300 1931.364929 300  90000 -4.911978e-14
## 301 1922.288826 301  90601 -2.588190e+01
## 302 1905.223286 302  91204 -5.000000e+01
## 303 1905.581815 303  91809 -7.071068e+01
## 304 1892.811019 304  92416 -8.660254e+01
## 305 1886.514281 305  93025 -9.659258e+01
## 306 1899.334894 306  93636 -1.000000e+02
## 307 1925.209187 307  94249 -9.659258e+01
## 308 1939.650792 308  94864 -8.660254e+01
## 309 1968.996370 309  95481 -7.071068e+01
## 310 2005.802396 310  96100 -5.000000e+01
## 311 2035.334467 311  96721 -2.588190e+01
## 312 2084.273172 312  97344 -1.028940e-12
## 313 2120.399083 313  97969  2.588190e+01
## 314 2147.882954 314  98596  5.000000e+01
## 315 2187.048197 315  99225  7.071068e+01
## 316 2223.348243 316  99856  8.660254e+01
## 317 2244.233730 317 100489  9.659258e+01
## 318 2252.384431 318 101124  1.000000e+02
## 319 2256.963250 319 101761  9.659258e+01
## 320 2268.427131 320 102400  8.660254e+01
## 321 2261.812703 321 103041  7.071068e+01
## 322 2262.753267 322 103684  5.000000e+01
## 323 2246.221383 323 104329  2.588190e+01
## 324 2235.472959 324 104976  6.859151e-13
## 325 2214.429291 325 105625 -2.588190e+01
## 326 2202.549684 326 106276 -5.000000e+01
## 327 2203.741182 327 106929 -7.071068e+01
## 328 2196.721495 328 107584 -8.660254e+01
## 329 2194.286446 329 108241 -9.659258e+01
## 330 2207.225463 330 108900 -1.000000e+02
## 331 2222.099434 331 109561 -9.659258e+01
## 332 2249.980663 332 110224 -8.660254e+01
## 333 2279.697782 333 110889 -7.071068e+01
## 334 2310.429897 334 111556 -5.000000e+01
## 335 2354.479766 335 112225 -2.588190e+01
## 336 2387.173719 336 112896 -3.428898e-13
ii <- 1:(24*11)  # 11日分のインデックス
d.tr <- d[ ii, ] # 訓練データを抽出(前11日)
d.te <- d[-ii, ] # 試験データを抽出(後3日)

vline <- list(type = "line",
              line = list(color = "blue", dash = "dash"),
              x0 = ii[length(ii)], x1 = ii[length(ii)],
              y0 = 0, y1 = max(d$y))

plot_ly(type = "scatter", mode = "markers") |>
  add_trace(x = d$x, y = d$y,  mode = 'markers', name = "観測値") |>
  add_trace(x = x,   y = f(x), mode = 'lines',   name = "真値") |>
  layout(title = "青破線の左側:訓練領域,右側:予測領域", shapes = list(vline))
# モデル候補
FML <- vector("list", 4)
FML[[1]] <- formula("y ~ x")
FML[[2]] <- formula("y ~ x + x2")
FML[[3]] <- formula("y ~ x + x2 + x3")
FML[[4]] <- formula("y ~ poly(x, 4)")

# 選択モデル番号
ID.MODEL <- 3

# 回帰モデルから計画行列を作成
x.tr <- model.matrix(FML[[ID.MODEL]], d.tr)
x.te <- model.matrix(FML[[ID.MODEL]], d.te)
nc <- ncol(x.tr) # カラム数

me.tr <- apply(x.tr, 2, mean) # 訓練データの説明変数ごとの平均
sd.tr <- apply(x.tr, 2, sd)   # 訓練データの説明変数ごとの標準偏差
x.tr <- scale(x.tr, center = me.tr, scale = sd.tr) # 標準化訓練データ
x.te <- scale(x.te, center = me.tr, scale = sd.tr) # 標準化試験データ
x.tr[, 1] <- 1 # 切片は標準化できない(NaNなる)ので1で置換
x.te[, 1] <- 1 # 切片は標準化できない(NaNなる)ので1で置換

# 深層学習モデル
model <- 
  keras_model_sequential(input_shape = c(nc))    |> # 入力層
  layer_dense(units = nc*2, activation = "relu") |> # 中間層(ReLU)
  layer_dense(units = nc*4, activation = "relu") |> # 中間層(ReLU)
  layer_dense(units = nc*2, activation = "relu") |> # 中間層(ReLU)
  layer_dense(units = 1,    activation = "linear")  # 出力層(線形)

# モデル概要
summary(model)
## Model: "sequential"
## ┌───────────────────────────────────┬──────────────────────────┬───────────────
## │ Layer (type)                      │ Output Shape             │       Param # 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense (Dense)                     │ (None, 8)                │            40 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_1 (Dense)                   │ (None, 16)               │           144 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_2 (Dense)                   │ (None, 8)                │           136 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_3 (Dense)                   │ (None, 1)                │             9 
## └───────────────────────────────────┴──────────────────────────┴───────────────
##  Total params: 329 (1.29 KB)
##  Trainable params: 329 (1.29 KB)
##  Non-trainable params: 0 (0.00 B)
# 高速演算のためのコンパイル(PCが素早く理解できる機械語に翻訳)
compile(model,
        loss      = "mse", # mean-squared-erros(2乗誤差平均)
        optimizer = optimizer_adam(learning_rate = 0.1), # 最適化アルゴリズム 
        metrics   = c("mean_absolute_error")) # 評価指標:絶対値誤差平均

# コールバック設定
callbacks <- list(
  # 早期停止(検証データでの損失値の改善が20エポック以上なかったら停止)
  callback_early_stopping(patience = 20, monitor = "val_loss"),
  
  # 検証データでの損失が改善されない限りモデルを上書きしない設定
  # (early_stoppingとセットで使用する)
  callback_model_checkpoint(filepath = "bestmodel.keras",
                            monitor = "val_loss", save_best_only = T),
  
  # 検証データでの損失が改善せず停滞した時(判定:5エポック)
  # に局所解を抜け出すため学習率を0.1倍に下げる設定。 
  callback_reduce_lr_on_plateau(monitor = "val_loss", 
                                factor = 0.1, patience = 5)
)

# フィッティング
fit.dp <- fit(model,                  # 深層学習モデル
              x.tr,                   # 計画行列 
              d.tr$y,                 # 目的変数
              verbose    = 0,         # 1:出力表示(低速),0:出力表示抑制
              batch_size = 2^6,       # バッチサイズ(要調整)
              epochs     = 100,       # エポック数(早期停止設定時設定不要) 
              validation_split = 0.2, # 検証用データ割合(訓練には不使用)
              callbacks  = callbacks) # コールバック設定

plot(fit.dp)

# 予測
yhat <- predict(model, x.te)
## 3/3 - 0s - 24ms/step
# 重回帰モデルとの比較
fit <- lm(FML[[ID.MODEL]], data = d.tr)
yhat.lm <- predict(fit, newdata = d.te)

# 予測結果のグラフ
plot_ly(type = "scatter", mode = "markers") |>
  add_trace(x = d$x,    y = d$y,     mode = "markers", name = "観測値") |>
  add_trace(x = d.te$x, y = yhat,    mode = "markers", name = "予測値(DNN)") |>
  add_trace(x = d.te$x, y = yhat.lm, mode = "lines",   name = "予測値(重回帰)") |>
  layout(shapes = list(vline))
# 精度評価関数
get.accuracy <- function(yhat, y)
{
  data.frame(MBE  = mean(yhat - y),
             MAE  = mean(abs(yhat - y)),
             MAPE = mean(abs((yhat - y) / y)) * 100,
             RMSE = sqrt(mean((yhat - y)^2))
  )
}

get.accuracy(yhat = yhat, y = d.te$y)
##         MBE      MAE     MAPE     RMSE
## 1 -237.0632 237.0632 11.94877 246.3099
# Kerasパッケージでの精度指標
evaluate(model, x.te, d.te$y)
## 3/3 - 0s - 11ms/step - loss: 60668.5547 - mean_absolute_error: 237.0632
## $loss
## [1] 60668.55
## 
## $mean_absolute_error
## [1] 237.0632
get.accuracy(yhat = yhat.lm, y = d.te$y)
##         MBE      MAE      MAPE     RMSE
## 1 -1.683005 3.942815 0.2068178 4.884525
d0 <- read.csv('https://stats.dip.jp/01_ds/data/real_estate_price.csv')
n <- nrow(d0)

# 要約統計量
summary(d0)
##        id              yr          yrs_old           m_sta        
##  Min.   :  1.0   Min.   :2012   Min.   : 0.000   Min.   :  23.38  
##  1st Qu.:104.2   1st Qu.:2012   1st Qu.: 9.025   1st Qu.: 289.32  
##  Median :207.5   Median :2013   Median :16.100   Median : 492.23  
##  Mean   :207.5   Mean   :2013   Mean   :17.713   Mean   :1083.89  
##  3rd Qu.:310.8   3rd Qu.:2013   3rd Qu.:28.150   3rd Qu.:1454.28  
##  Max.   :414.0   Max.   :2013   Max.   :43.800   Max.   :6488.02  
##     nstores            lat             lon            price       
##  Min.   : 0.000   Min.   :24.93   Min.   :121.5   Min.   :  7.60  
##  1st Qu.: 1.000   1st Qu.:24.96   1st Qu.:121.5   1st Qu.: 27.70  
##  Median : 4.000   Median :24.97   Median :121.5   Median : 38.45  
##  Mean   : 4.094   Mean   :24.97   Mean   :121.5   Mean   : 37.98  
##  3rd Qu.: 6.000   3rd Qu.:24.98   3rd Qu.:121.5   3rd Qu.: 46.60  
##  Max.   :10.000   Max.   :25.01   Max.   :121.6   Max.   :117.50
set.seed(7)
ii <- sample(1:n, size = floor(0.8*n))
d0.tr <- d0[ ii, -1] # 訓練データ(idを除く)
d0.te <- d0[-ii, -1] # テストデータ(idを除く)
d0.tr
##       yr yrs_old      m_sta nstores      lat      lon price
## 298 2012    34.9  567.03490       4 24.97003 121.5458  28.5
## 103 2013     1.1  193.58450       6 24.96571 121.5409  54.4
## 194 2013     9.7  421.47900       5 24.98246 121.5448  49.3
## 271 2013    10.8  252.58220       1 24.97460 121.5305 117.5
## 218 2012    28.0  372.62420       6 24.97838 121.5412  40.8
## 118 2013    13.6 4197.34900       0 24.93885 121.5038  13.0
## 392 2013     6.2 1939.74900       1 24.95155 121.5539  31.3
## 323 2013    12.9  187.48230       1 24.97388 121.5298  33.1
## 168 2013    28.2  330.08540       8 24.97408 121.5401  43.4
## 22  2013    10.5  279.17260       7 24.97528 121.5454  51.6
## 408 2013     5.2 2408.99300       0 24.95505 121.5596  22.3
## 59  2013    30.3 4510.35900       1 24.94925 121.4954  22.6
## 90  2013    23.0 3947.94500       0 24.94783 121.5024  25.3
## 268 2012    34.7  482.75810       5 24.97433 121.5386  41.1
## 296 2013    18.2 2179.59000       3 24.96299 121.5125  21.8
## 287 2012     5.9   90.45606       9 24.97433 121.5431  56.3
## 207 2013    22.2  379.55750      10 24.98343 121.5376  44.0
## 134 2012    18.0  373.39370       8 24.98660 121.5408  39.5
## 150 2012    34.9  179.45380       8 24.97349 121.5425  39.7
## 187 2013    20.9 2185.12800       3 24.96322 121.5124  25.7
## 21  2013     4.5 2275.87700       3 24.96314 121.5115  29.3
## 388 2013    16.2 2103.55500       3 24.96042 121.5146  25.6
## 358 2013     0.0  338.96790       9 24.96853 121.5441  44.9
## 282 2013     4.7  387.77210       9 24.98118 121.5379  44.8
## 215 2013    18.1 1783.18000       3 24.96731 121.5149  20.9
## 386 2013    18.3   82.88643      10 24.98300 121.5403  46.6
## 100 2013     6.4   90.45606       9 24.97433 121.5431  62.2
## 166 2012    13.7 1236.56400       1 24.97694 121.5539  30.6
## 248 2013    21.7 1055.06700       0 24.96211 121.5493  23.1
## 171 2013    24.0 4527.68700       0 24.94741 121.4963  14.4
## 124 2013     0.0  185.42960       0 24.97110 121.5317  45.5
## 379 2013    37.3  587.88770       8 24.97077 121.5463  37.4
## 292 2012     3.4   56.47425       7 24.95744 121.5371  54.4
## 249 2013    19.0 1009.23500       0 24.96357 121.5495  22.3
## 3   2013    13.3  561.98450       5 24.98746 121.5439  47.3
## 365 2013    35.3  614.13940       7 24.97913 121.5367  33.1
## 181 2012    26.9 4449.27000       0 24.94898 121.4962  15.5
## 88  2013    16.9 4066.58700       0 24.94297 121.5034  18.3
## 41  2013    13.6 4082.01500       0 24.94155 121.5038  15.9
## 378 2013     3.9   49.66105       8 24.95836 121.5376  56.8
## 278 2013    21.2 2185.12800       3 24.96322 121.5124  27.7
## 264 2013     3.9 2147.37600       3 24.96299 121.5128  31.7
## 376 2013    21.7 1157.98800       0 24.96165 121.5501  23.8
## 31  2013    25.9 4519.69000       0 24.94826 121.4959  22.1
## 290 2013    13.9  289.32480       5 24.98203 121.5435  44.5
## 288 2013    19.2  461.10160       5 24.95425 121.5399  32.9
## 328 2013     3.5  757.33770       3 24.97538 121.5497  36.7
## 186 2012    31.4 1447.28600       3 24.97285 121.5173  21.5
## 344 2013    33.5  563.28540       8 24.98223 121.5360  46.6
## 74  2013    13.8 4082.01500       0 24.94155 121.5038  20.0
## 174 2013    41.3  401.88070       4 24.98326 121.5446  35.1
## 315 2013     3.7  577.96150       6 24.97201 121.5472  41.6
## 240 2013    18.1  837.72330       0 24.96334 121.5477  29.7
## 114 2013    14.8  393.26060       6 24.96172 121.5381   7.6
## 343 2012     5.7   90.45606       9 24.97433 121.5431  53.5
## 32  2012    29.6  769.40340       7 24.98281 121.5341  25.0
## 195 2013    15.2 3771.89500       0 24.93363 121.5116  29.3
## 233 2012    27.1 4412.76500       1 24.95032 121.4959  17.4
## 318 2012    15.6  752.76690       2 24.97795 121.5345  37.5
## 55  2013    16.1  289.32480       5 24.98203 121.5435  51.7
## 72  2013    35.5  640.73910       3 24.97563 121.5371  40.8
## 284 2013    33.5 1978.67100       2 24.98674 121.5184  23.5
## 272 2012    17.7  451.64190       8 24.96945 121.5449  26.5
## 178 2013    33.0  181.07660       9 24.97697 121.5426  42.0
## 18  2012    17.7  350.85150       1 24.97544 121.5312  37.4
## 40  2013    16.2  289.32480       5 24.98203 121.5435  46.2
## 387 2012     0.0  185.42960       0 24.97110 121.5317  55.3
## 266 2012    15.7  815.93140       4 24.97886 121.5346  38.1
## 109 2013    31.4  592.50060       2 24.97260 121.5356  34.1
## 64  2013     2.6  533.47620       4 24.97445 121.5477  55.0
## 222 2013     9.0 1402.01600       0 24.98569 121.5276  38.5
## 389 2013    10.4 2251.93800       4 24.95957 121.5135  27.3
## 121 2013    13.3  492.23130       5 24.96515 121.5374  31.3
## 312 2013    21.3  537.79710       4 24.97425 121.5381  42.2
## 374 2013     0.0  274.01440       1 24.97480 121.5306  52.2
## 172 2013     3.6  383.86240       5 24.98085 121.5439  58.8
## 6   2012     7.1 2175.03000       3 24.96305 121.5125  32.1
## 196 2013    15.2  461.10160       5 24.95425 121.5399  34.6
## 362 2013    41.4  281.20500       8 24.97345 121.5409  63.3
## 43  2013    36.1  519.46170       5 24.96305 121.5376  34.7
## 333 2013    39.8  617.71340       2 24.97577 121.5348  39.6
## 247 2013    16.4  389.82190       6 24.96412 121.5427  40.6
## 384 2012    29.1  506.11440       4 24.97845 121.5389  40.3
## 274 2013    13.2  170.12890       1 24.97371 121.5298  29.3
## 225 2013    34.5  324.94190       6 24.97814 121.5417  46.0
## 17  2013     0.0  292.99780       6 24.97744 121.5446  70.1
## 289 2013    16.6  323.69120       6 24.97841 121.5428  51.0
## 300 2013    33.2  121.72620      10 24.98178 121.5406  46.1
## 369 2013    18.2  350.85150       1 24.97544 121.5312  43.1
## 48  2013    35.9  640.73910       3 24.97563 121.5371  61.5
## 162 2013    19.2  616.40040       3 24.97723 121.5377  39.6
## 357 2012    10.3  211.44730       1 24.97417 121.5300  45.3
## 58  2012     3.5   56.47425       7 24.95744 121.5371  53.5
## 113 2013     9.9 2102.42700       3 24.96044 121.5146  23.1
## 373 2013    33.9  157.60520       7 24.96628 121.5420  41.5
## 9   2013    31.7 5512.03800       1 24.95095 121.4846  18.8
## 335 2012    30.0 1013.34100       5 24.99006 121.5346  22.8
## 377 2013    14.7 1717.19300       2 24.96447 121.5165  30.5
## 28  2013    10.4  276.44900       5 24.95593 121.5391  33.6
## 54  2013    13.3  492.23130       5 24.96515 121.5374  38.9
## 216 2013    19.2  383.71290       8 24.97200 121.5448  48.1
## 350 2012     7.8  104.81010       5 24.96674 121.5407  47.0
## 227 2013    16.5 4082.01500       0 24.94155 121.5038  12.8
## 313 2013    35.4  318.52920       9 24.97071 121.5407  78.0
## 159 2013    11.6  390.56840       5 24.97937 121.5425  39.4
## 242 2013    13.7  250.63100       7 24.96606 121.5430  41.4
## 116 2013    20.6  737.91610       2 24.98092 121.5474  46.4
## 8   2013    20.3  287.60250       6 24.98042 121.5423  46.7
## 81  2013    11.8  533.47620       4 24.97445 121.5477  40.3
## 149 2013    16.4 3780.59000       0 24.93293 121.5120  45.1
## 112 2013    33.3  196.61720       7 24.97701 121.5422  39.4
## 252 2012    31.7 1159.45400       0 24.94960 121.5302  13.8
## 79  2012    38.2  552.43710       2 24.97598 121.5338  29.8
## 214 2013     6.2   90.45606       9 24.97433 121.5431  58.0
## 299 2013    16.7 4082.01500       0 24.94155 121.5038  16.7
## 200 2013    18.2  451.64190       8 24.96945 121.5449  31.6
## 75  2012     6.8  379.55750      10 24.98343 121.5376  54.4
## 173 2013     6.6   90.45606       9 24.97433 121.5431  58.1
## 223 2013    30.6  431.11140      10 24.98123 121.5374  48.5
## 256 2013    31.5 5512.03800       1 24.95095 121.4846  17.4
## 180 2013    14.0  438.85130       1 24.97493 121.5273  42.6
## 129 2013    41.3  124.99120       6 24.96674 121.5404  60.7
## 246 2013     7.5  639.61980       5 24.97258 121.5481  40.8
## 393 2013    42.7  443.80200       6 24.97927 121.5387  35.3
## 138 2013    13.6  319.07080       6 24.96495 121.5428  47.4
## 141 2013    16.2  289.32480       5 24.98203 121.5435  51.4
## 220 2012    29.3  529.77710       8 24.98102 121.5366  40.2
## 122 2013    13.6  492.23130       5 24.96515 121.5374  48.0
## 211 2013     5.2  390.56840       5 24.97937 121.5425  52.2
## 68  2013     8.5  104.81010       5 24.96674 121.5407  56.8
## 348 2013    17.4 6488.02100       1 24.95719 121.4735  11.2
## 339 2012    31.5  258.18600       9 24.96867 121.5433  36.3
## 142 2013     5.1 1559.82700       3 24.97213 121.5163  28.9
## 367 2012    14.2 1801.54400       1 24.95153 121.5525  24.8
## 281 2013     2.3  184.33020       6 24.96581 121.5409  45.4
## 193 2013    43.8   57.58945       7 24.96750 121.5407  42.7
## 356 2013     3.8  383.86240       5 24.98085 121.5439  60.7
## 347 2013    13.2 1712.63200       2 24.96412 121.5167  30.8
## 314 2013     8.3  104.81010       5 24.96674 121.5407  42.8
## 96  2012     8.0  104.81010       5 24.96674 121.5407  51.8
## 398 2013    13.1 1164.83800       4 24.99156 121.5341  32.2
## 165 2012     0.0  185.42960       0 24.97110 121.5317  55.2
## 351 2013    13.2  492.23130       5 24.96515 121.5374  42.3
## 60  2013    13.3  336.05320       5 24.95776 121.5344  42.4
## 66  2013    40.1  123.74290       8 24.97635 121.5433  44.3
## 267 2013    17.8 1783.18000       3 24.96731 121.5149  23.7
## 2   2012    19.5  306.59470       9 24.98034 121.5395  42.2
## 1   2012    32.0   84.87882      10 24.98298 121.5402  37.9
## 198 2013    34.4  126.72860       8 24.96881 121.5409  48.2
## 14  2012    20.4 2469.64500       4 24.96108 121.5105  23.8
## 302 2012    38.0  461.78480       0 24.97229 121.5345  35.7
## 258 2013    17.3  444.13340       1 24.97501 121.5273  43.9
## 303 2013    16.5 2288.01100       3 24.95885 121.5136  23.2
## 320 2013    34.6  272.67830       5 24.95562 121.5387  26.9
## 156 2013    13.8 4082.01500       0 24.94155 121.5038  15.6
## 317 2013    13.3  250.63100       7 24.96606 121.5430  42.0
## 95  2012    40.9  167.59890       5 24.96630 121.5403  41.0
## 57  2013    33.6  371.24950       8 24.97254 121.5406  41.9
## 260 2013    17.7  837.72330       0 24.96334 121.5477  28.8
## 94  2012    31.9 1146.32900       0 24.94920 121.5308  16.1
## 104 2012     0.0  208.39050       6 24.95618 121.5384  45.7
## 297 2012    12.5 1144.43600       4 24.99176 121.5346  34.1
## 53  2013    32.1 1438.57900       3 24.97419 121.5175  27.0
## 311 2013    16.4 1643.49900       2 24.95394 121.5517  24.7
## 144 2013    13.6  492.23130       5 24.96515 121.5374  40.1
## 230 2013    31.0 1156.41200       0 24.94890 121.5310  19.0
## 327 2013     4.1   56.47425       7 24.95744 121.5371  62.1
## 160 2012    15.5  815.93140       4 24.97886 121.5346  37.4
## 175 2013     4.3  432.03850       7 24.98050 121.5378  45.2
## 244 2013    32.8  204.17050       8 24.98236 121.5392  48.2
## 139 2013    10.0  942.46640       0 24.97843 121.5241  43.5
## 201 2013    17.4  995.75540       0 24.96305 121.5491  25.5
## 243 2012     2.0 2077.39000       3 24.96357 121.5133  33.4
## 39  2012     3.1  577.96150       6 24.97201 121.5472  47.7
## 45  2013     2.7  533.47620       4 24.97445 121.5477  53.9
## 337 2012     5.1 1867.23300       2 24.98407 121.5175  35.6
## 342 2013    13.0  750.07040       2 24.97371 121.5495  37.0
## 354 2013     4.1 2147.37600       3 24.96299 121.5128  31.3
## 380 2013     0.0  292.99780       6 24.97744 121.5446  69.7
## 56  2012    31.7 1160.63200       0 24.94968 121.5301  13.7
## 305 2013    20.0 1626.08300       3 24.96622 121.5167  29.4
## 257 2012    14.6  339.22890       1 24.97519 121.5315  26.5
## 265 2013    32.6  493.65700       7 24.96968 121.5452  40.6
## 410 2013    13.7 4082.01500       0 24.94155 121.5038  15.4
## 189 2012    34.8  190.03920       8 24.97707 121.5431  44.3
## 108 2013    12.2 1360.13900       1 24.95204 121.5484  26.6
## 46  2013    36.6  488.81930       8 24.97015 121.5449  38.3
## 326 2013    36.6  488.81930       8 24.97015 121.5449  38.1
## 197 2013    22.8  707.90670       2 24.98100 121.5471  36.6
## 205 2013    18.0 1414.83700       1 24.95182 121.5489  26.6
## 236 2012    12.9  250.63100       7 24.96606 121.5430  39.3
## 147 2012     0.0  185.42960       0 24.97110 121.5317  52.2
## 107 2013    17.2  189.51810       8 24.97707 121.5431  47.1
## 261 2013    17.0 1485.09700       4 24.97073 121.5170  30.7
## 177 2012    13.9 4573.77900       0 24.94867 121.4951  19.2
## 217 2013    37.8  590.92920       1 24.97153 121.5356  39.7
## 234 2013    39.7  333.36790       9 24.98016 121.5393  32.4
## 191 2013    35.3  616.57350       8 24.97945 121.5364  42.3
## 87  2012     1.8 1455.79800       1 24.95120 121.5490  27.0
## 30  2013     7.1  451.24380       5 24.97563 121.5469  57.1
## 157 2013    30.7 1264.73000       0 24.94883 121.5295  18.3
## 83  2013    13.2  150.93470       7 24.96725 121.5425  48.1
## 346 2012     0.0  185.42960       0 24.97110 121.5317  37.9
## 403 2012    12.7  187.48230       1 24.97388 121.5298  28.5
## 371 2012    15.9  289.32480       5 24.98203 121.5435  42.1
## 210 2012    34.8  175.62940       8 24.97347 121.5427  40.9
## 385 2012    16.1 4066.58700       0 24.94297 121.5034  12.9
## 102 2012    12.7  170.12890       1 24.97371 121.5298  32.9
## 91  2012     0.0  274.01440       1 24.97480 121.5306  45.4
## 123 2013    31.5  414.94760       4 24.98199 121.5446  32.5
## 413 2013     8.1  104.81010       5 24.96674 121.5407  52.5
## 16  2013    35.7  579.20830       2 24.98240 121.5462  50.5
## 70  2012    12.5  561.98450       5 24.98746 121.5439  42.0
## 401 2013    26.8  482.75810       5 24.97433 121.5386  35.5
## 391 2013    32.8  377.83020       9 24.97151 121.5435  38.6
## 61  2013    11.0 1931.20700       2 24.96365 121.5147  21.3
## 167 2013     0.0  292.99780       6 24.97744 121.5446  73.6
## 93  2012    20.6 2469.64500       4 24.96108 121.5105  21.8
## 154 2013     6.5  376.17090       6 24.95418 121.5371  40.9
## 226 2013     1.1  193.58450       6 24.96571 121.5409  49.0
## 155 2013    16.9 4066.58700       0 24.94297 121.5034  20.7
## 23  2012    14.7 1360.13900       1 24.95204 121.5484  24.6
## 352 2012     4.0 2180.24500       3 24.96324 121.5124  28.6
## 183 2013    13.5 2147.37600       3 24.96299 121.5128  23.6
## 106 2012     0.0  292.99780       6 24.97744 121.5446  71.0
## 85  2013    15.1  383.28050       7 24.96735 121.5446  43.7
## 5   2012     5.0  390.56840       5 24.97937 121.5425  43.1
## 291 2013    37.7  490.34460       0 24.97217 121.5347  37.0
## 390 2013    40.9  122.36190       8 24.96756 121.5423  67.7
## 360 2013     5.6 2408.99300       0 24.95505 121.5596  24.7
## 349 2012     4.6  259.66070       6 24.97585 121.5452  53.7
## 52  2013    31.3 1758.40600       1 24.95402 121.5528  20.7
## 27  2012     3.1  383.86240       5 24.98085 121.5439  56.2
## 120 2013    16.6  289.32480       5 24.98203 121.5435  59.6
## 345 2013    34.6 3085.17000       0 24.99800 121.5155  41.2
## 119 2013    25.3 1583.72200       3 24.96622 121.5171  30.6
## 179 2013    13.1 1144.43600       4 24.99176 121.5346  36.7
## 26  2013    29.3 1487.86800       2 24.97542 121.5173  27.0
## 34  2013    16.5  323.65500       6 24.97841 121.5428  49.3
## 131 2013    29.6  535.52700       8 24.98092 121.5365  37.5
## 67  2013     1.0  193.58450       6 24.96571 121.5409  50.7
## 92  2013     9.1 1402.01600       0 24.98569 121.5276  43.2
## 364 2013    32.3  109.94550      10 24.98182 121.5409  48.0
## 132 2013     4.0 2147.37600       3 24.96299 121.5128  30.7
## 86  2012     0.0  338.96790       9 24.96853 121.5441  50.8
## 307 2013    14.4  169.98030       1 24.97369 121.5298  50.2
## 275 2013    27.5  394.01730       7 24.97305 121.5399  41.0
## 221 2013    37.2  186.51010       9 24.97703 121.5426  78.3
## 361 2012    32.9   87.30222      10 24.98300 121.5402  47.1
## 254 2012    30.4 1735.59500       2 24.96464 121.5162  25.9
## 228 2012    32.4  265.06090       8 24.98059 121.5399  40.2
## 334 2012     7.8  104.81010       5 24.96674 121.5407  38.4
## 163 2012    16.0 4066.58700       0 24.94297 121.5034  11.6
## 63  2012    17.2 2175.87700       3 24.96303 121.5125  27.7
## 145 2013    11.9 1360.13900       1 24.95204 121.5484  28.4
## 382 2013     8.0  132.54690       9 24.98298 121.5398  47.3
## 396 2012    21.2  512.54870       4 24.97400 121.5384  42.5
## 158 2013    16.1  815.93140       4 24.97886 121.5346  35.6
## 338 2012    31.3  600.86040       5 24.96871 121.5465  30.9
## 185 2012    14.1 2615.46500       0 24.95495 121.5617  21.8
## 232 2012    16.2 4074.73600       0 24.94235 121.5036  14.7
## 24  2013    10.1  279.17260       7 24.97528 121.5454  47.9
## 231 2013     4.0 2147.37600       3 24.96299 121.5128  33.4
## 62  2013     5.3  259.66070       6 24.97585 121.5452  63.2
## 170 2013     8.4 1962.62800       1 24.95468 121.5548  23.5
## 332 2013    25.6 4519.69000       0 24.94826 121.4959  15.6
## 235 2013     8.0 2216.61200       4 24.96007 121.5136  23.9
## 383 2013    16.3 3529.56400       0 24.93207 121.5160  29.3
## 400 2012    12.7  170.12890       1 24.97371 121.5298  37.3
## 293 2013    17.5  395.67470       5 24.95674 121.5340  24.5
## 35  2012    15.4  205.36700       7 24.98419 121.5424  55.1
## 126 2013     1.1  193.58450       6 24.96571 121.5409  48.6
## 73  2013    32.5  424.54420       8 24.97587 121.5391  36.3
## 277 2013    19.1  461.10160       5 24.95425 121.5399  34.0
## 117 2013    30.9 6396.28300       1 24.94375 121.4788  12.2
## 269 2013    17.2  390.56840       5 24.97937 121.5425  40.1
## 286 2013    30.1  718.29370       3 24.97509 121.5364  55.3
## 206 2013    12.8 1449.72200       3 24.97289 121.5173  21.4
## 366 2012    17.3 2261.43200       4 24.96182 121.5122  29.5
## 33  2012    37.9  488.57270       1 24.97349 121.5345  34.2
## 353 2012    18.4 2674.96100       3 24.96143 121.5083  25.7
## 192 2013    13.2  750.07040       2 24.97371 121.5495  37.8
## 263 2012    15.9  289.32480       5 24.98203 121.5435  53.0
## 10  2013    17.9 1783.18000       3 24.96731 121.5149  22.1
## 304 2013    38.3  439.71050       0 24.97161 121.5342  38.4
## 7   2012    34.5  623.47310       7 24.97933 121.5364  40.3
## 208 2013    38.5  665.06360       3 24.97503 121.5369  34.2
## 310 2013    30.3 1264.73000       0 24.94883 121.5295  19.1
## 51  2013    21.7  512.54870       4 24.97400 121.5384  44.2
## 399 2013    14.7 1717.19300       2 24.96447 121.5165  23.0
## 65  2013    17.5  995.75540       0 24.96305 121.5491  25.3
## 319 2013     7.1  379.55750      10 24.98343 121.5376  49.8
## 199 2013    34.0  157.60520       7 24.96628 121.5420  39.1
## 182 2013    11.6  201.89390       8 24.98489 121.5412  55.9
## 280 2013     2.6 1554.25000       3 24.97026 121.5164  31.1
## 241 2013    11.0 1712.63200       2 24.96412 121.5167  28.8
## 36  2013    13.9 4079.41800       0 25.01459 121.5182  27.3
## 321 2012    13.5 4197.34900       0 24.93885 121.5038  18.6
## 405 2013    16.4  289.32480       5 24.98203 121.5435  41.2
## 295 2013    26.4  335.52730       6 24.97960 121.5414  38.1
## 395 2013    32.6 4136.27100       1 24.95544 121.4963  24.7
## 69  2013    30.4  464.22300       6 24.97964 121.5380  36.2
## 411 2012     5.6   90.45606       9 24.97433 121.5431  50.0
## 394 2013    16.9  967.40000       4 24.98872 121.5341  40.3
## 397 2012    37.1  918.63570       1 24.97198 121.5506  31.9
## 151 2013    35.8  170.73110       7 24.96719 121.5427  48.5
## 89  2012     8.9 1406.43000       0 24.98573 121.5276  48.0
## 375 2013     5.4  390.56840       5 24.97937 121.5425  49.5
## 203 2012    38.3  642.69850       3 24.97559 121.5371  31.5
## 105 2012    32.7  392.44590       6 24.96398 121.5425  30.5
## 309 2013    16.4  289.32480       5 24.98203 121.5435  53.0
## 359 2013     1.1  193.58450       6 24.96571 121.5409  45.1
## 84  2012    25.3 2707.39200       3 24.96056 121.5083  17.7
## 130 2013    38.5  216.83290       7 24.98086 121.5416  41.0
## 322 2012    16.9  964.74960       4 24.98872 121.5341  37.7
## 133 2013    26.6  482.75810       5 24.97433 121.5386  37.5
## 407 2013     1.9  372.13860       7 24.97293 121.5403  40.5
## 135 2012    33.4  186.96860       6 24.96604 121.5421  42.2
## 259 2013     0.0  292.99780       6 24.97744 121.5446  63.3
## 245 2013     4.8 1559.82700       3 24.97213 121.5163  21.7
## 316 2013    15.6 1756.41100       2 24.98320 121.5181  27.3
## 80  2013    18.0 1414.83700       1 24.95182 121.5489  26.5
## 273 2012    13.0  492.23130       5 24.96515 121.5374  40.5
## 127 2013    38.6  804.68970       4 24.97838 121.5348  62.9
## 49  2013    24.2 4605.74900       0 24.94684 121.4958  13.4
## 331 2013    32.0 1156.77700       0 24.94935 121.5305  12.8
## 414 2013     6.5   90.45606       9 24.97433 121.5431  63.9
## 330 2013    13.6 4197.34900       0 24.93885 121.5038  19.2
## 12  2013     6.3   90.45606       9 24.97433 121.5431  58.1
## 409 2013    18.5 2175.74400       3 24.96330 121.5124  28.1
## 204 2012    15.6  289.32480       5 24.98203 121.5435  46.1
FML <- vector("list", 7)
FML[[1]] <- formula("yr ~ yrs_old")
FML[[2]] <- formula("yr ~ yrs_old + m_sta")
FML[[3]] <- formula("yr ~ yrs_old + m_sta + nstores")
FML[[4]] <- formula("yr ~ yrs_old + m_sta + nstores + lat")
FML[[5]] <- formula("yr ~ yrs_old + m_sta + nstores + lat + lon")
FML[[6]] <- formula("yr ~ yrs_old + m_sta + nstores + lat + lon + price")
FML[[7]] <- formula("yr ~ poly(yrs_old, 7)")

ID.MODEL <- 6

yrs_old.tr <- model.matrix(FML[[ID.MODEL]], d0.tr)
yrs_old.te <- model.matrix(FML[[ID.MODEL]], d0.te)
nc <- ncol(yrs_old.tr)
me.tr <- apply(yrs_old.tr, 2, mean) 
sd.tr <- apply(yrs_old.tr, 2, sd)
yrs_old.tr <- scale(yrs_old.tr, center = me.tr, scale = sd.tr) 
yrs_old.te <- scale(yrs_old.te, center = me.tr, scale = sd.tr)
yrs_old.tr[, 1] <- 1
yrs_old.te[, 1] <- 1
model <- 
  keras_model_sequential(input_shape = c(nc))    |> 
  layer_dense(units = nc*2, activation = "relu") |> 
  layer_dense(units = nc*4, activation = "relu") |> 
  layer_dense(units = nc*2, activation = "relu") |> 
  layer_dense(units = 1,    activation = "linear")  

summary(model)
## Model: "sequential_1"
## ┌───────────────────────────────────┬──────────────────────────┬───────────────
## │ Layer (type)                      │ Output Shape             │       Param # 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_4 (Dense)                   │ (None, 14)               │           112 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_5 (Dense)                   │ (None, 28)               │           420 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_6 (Dense)                   │ (None, 14)               │           406 
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_7 (Dense)                   │ (None, 1)                │            15 
## └───────────────────────────────────┴──────────────────────────┴───────────────
##  Total params: 953 (3.72 KB)
##  Trainable params: 953 (3.72 KB)
##  Non-trainable params: 0 (0.00 B)
compile(model,
        loss      = "mse", 
        optimizer = optimizer_adam(learning_rate = 0.1),  
        metrics   = c("mean_absolute_error"))
callbacks <- list(
  callback_early_stopping(patience = 20, monitor = "val_loss"),
  callback_model_checkpoint(filepath = "bestmodel.keras",
                            monitor = "val_loss", save_best_only = T),
  callback_reduce_lr_on_plateau(monitor = "val_loss", 
                                factor = 0.1, patience = 5)
)

#fit.dp <- fit(model, yrs_old.tr, d0.tr$y, verbose= 0, batch_size = 2^6,epochs= 100,    validation_split = 0.2, callbacks  = callbacks)