if (!require(keras3))
{
install.packages("keras3")
library(keras3)
#install_keras() # r-kerasという仮想環境にKerasがインストールされる。
# install_keras(tensorflow = "gpu") # GPU演算用(NVIDIA GPUとcuDNNが必要)
}
if (!require(plotly)) install.packages("plotly")
if ("keras3" %in% rownames(installed.packages())) {
cat("kerasパッケージはインストールされています。")
} else {
cat("kerasパッケージはインストールされていません。")
}
## kerasパッケージはインストールされています。
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)
ii <- 1:(24*11) # 11日分のインデックス
d.tr <- d[ ii, ] # 訓練データを抽出(前11日)
d.te <- d[-ii, ] # 試験データを抽出(後3日)
d.tr
## 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
nrow(d)
## [1] 336
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)
nrow(d.tr)
## [1] 264
nrow(x.tr)
## [1] 264
x.te <- model.matrix(FML[[ID.MODEL]], d.te)
nc <- ncol(x.tr) # カラム数
x.tr
## (Intercept) x x2 x3
## 1 1 1 1 2.588190e+01
## 2 1 2 4 5.000000e+01
## 3 1 3 9 7.071068e+01
## 4 1 4 16 8.660254e+01
## 5 1 5 25 9.659258e+01
## 6 1 6 36 1.000000e+02
## 7 1 7 49 9.659258e+01
## 8 1 8 64 8.660254e+01
## 9 1 9 81 7.071068e+01
## 10 1 10 100 5.000000e+01
## 11 1 11 121 2.588190e+01
## 12 1 12 144 1.224606e-14
## 13 1 13 169 -2.588190e+01
## 14 1 14 196 -5.000000e+01
## 15 1 15 225 -7.071068e+01
## 16 1 16 256 -8.660254e+01
## 17 1 17 289 -9.659258e+01
## 18 1 18 324 -1.000000e+02
## 19 1 19 361 -9.659258e+01
## 20 1 20 400 -8.660254e+01
## 21 1 21 441 -7.071068e+01
## 22 1 22 484 -5.000000e+01
## 23 1 23 529 -2.588190e+01
## 24 1 24 576 -2.449213e-14
## 25 1 25 625 2.588190e+01
## 26 1 26 676 5.000000e+01
## 27 1 27 729 7.071068e+01
## 28 1 28 784 8.660254e+01
## 29 1 29 841 9.659258e+01
## 30 1 30 900 1.000000e+02
## 31 1 31 961 9.659258e+01
## 32 1 32 1024 8.660254e+01
## 33 1 33 1089 7.071068e+01
## 34 1 34 1156 5.000000e+01
## 35 1 35 1225 2.588190e+01
## 36 1 36 1296 3.673819e-14
## 37 1 37 1369 -2.588190e+01
## 38 1 38 1444 -5.000000e+01
## 39 1 39 1521 -7.071068e+01
## 40 1 40 1600 -8.660254e+01
## 41 1 41 1681 -9.659258e+01
## 42 1 42 1764 -1.000000e+02
## 43 1 43 1849 -9.659258e+01
## 44 1 44 1936 -8.660254e+01
## 45 1 45 2025 -7.071068e+01
## 46 1 46 2116 -5.000000e+01
## 47 1 47 2209 -2.588190e+01
## 48 1 48 2304 -4.898425e-14
## 49 1 49 2401 2.588190e+01
## 50 1 50 2500 5.000000e+01
## 51 1 51 2601 7.071068e+01
## 52 1 52 2704 8.660254e+01
## 53 1 53 2809 9.659258e+01
## 54 1 54 2916 1.000000e+02
## 55 1 55 3025 9.659258e+01
## 56 1 56 3136 8.660254e+01
## 57 1 57 3249 7.071068e+01
## 58 1 58 3364 5.000000e+01
## 59 1 59 3481 2.588190e+01
## 60 1 60 3600 2.388660e-13
## 61 1 61 3721 -2.588190e+01
## 62 1 62 3844 -5.000000e+01
## 63 1 63 3969 -7.071068e+01
## 64 1 64 4096 -8.660254e+01
## 65 1 65 4225 -9.659258e+01
## 66 1 66 4356 -1.000000e+02
## 67 1 67 4489 -9.659258e+01
## 68 1 68 4624 -8.660254e+01
## 69 1 69 4761 -7.071068e+01
## 70 1 70 4900 -5.000000e+01
## 71 1 71 5041 -2.588190e+01
## 72 1 72 5184 -7.347638e-14
## 73 1 73 5329 2.588190e+01
## 74 1 74 5476 5.000000e+01
## 75 1 75 5625 7.071068e+01
## 76 1 76 5776 8.660254e+01
## 77 1 77 5929 9.659258e+01
## 78 1 78 6084 1.000000e+02
## 79 1 79 6241 9.659258e+01
## 80 1 80 6400 8.660254e+01
## 81 1 81 6561 7.071068e+01
## 82 1 82 6724 5.000000e+01
## 83 1 83 6889 2.588190e+01
## 84 1 84 7056 8.572244e-14
## 85 1 85 7225 -2.588190e+01
## 86 1 86 7396 -5.000000e+01
## 87 1 87 7569 -7.071068e+01
## 88 1 88 7744 -8.660254e+01
## 89 1 89 7921 -9.659258e+01
## 90 1 90 8100 -1.000000e+02
## 91 1 91 8281 -9.659258e+01
## 92 1 92 8464 -8.660254e+01
## 93 1 93 8649 -7.071068e+01
## 94 1 94 8836 -5.000000e+01
## 95 1 95 9025 -2.588190e+01
## 96 1 96 9216 -9.796851e-14
## 97 1 97 9409 2.588190e+01
## 98 1 98 9604 5.000000e+01
## 99 1 99 9801 7.071068e+01
## 100 1 100 10000 8.660254e+01
## 101 1 101 10201 9.659258e+01
## 102 1 102 10404 1.000000e+02
## 103 1 103 10609 9.659258e+01
## 104 1 104 10816 8.660254e+01
## 105 1 105 11025 7.071068e+01
## 106 1 106 11236 5.000000e+01
## 107 1 107 11449 2.588190e+01
## 108 1 108 11664 1.102146e-13
## 109 1 109 11881 -2.588190e+01
## 110 1 110 12100 -5.000000e+01
## 111 1 111 12321 -7.071068e+01
## 112 1 112 12544 -8.660254e+01
## 113 1 113 12769 -9.659258e+01
## 114 1 114 12996 -1.000000e+02
## 115 1 115 13225 -9.659258e+01
## 116 1 116 13456 -8.660254e+01
## 117 1 117 13689 -7.071068e+01
## 118 1 118 13924 -5.000000e+01
## 119 1 119 14161 -2.588190e+01
## 120 1 120 14400 -4.777320e-13
## 121 1 121 14641 2.588190e+01
## 122 1 122 14884 5.000000e+01
## 123 1 123 15129 7.071068e+01
## 124 1 124 15376 8.660254e+01
## 125 1 125 15625 9.659258e+01
## 126 1 126 15876 1.000000e+02
## 127 1 127 16129 9.659258e+01
## 128 1 128 16384 8.660254e+01
## 129 1 129 16641 7.071068e+01
## 130 1 130 16900 5.000000e+01
## 131 1 131 17161 2.588190e+01
## 132 1 132 17424 -2.205647e-13
## 133 1 133 17689 -2.588190e+01
## 134 1 134 17956 -5.000000e+01
## 135 1 135 18225 -7.071068e+01
## 136 1 136 18496 -8.660254e+01
## 137 1 137 18769 -9.659258e+01
## 138 1 138 19044 -1.000000e+02
## 139 1 139 19321 -9.659258e+01
## 140 1 140 19600 -8.660254e+01
## 141 1 141 19881 -7.071068e+01
## 142 1 142 20164 -5.000000e+01
## 143 1 143 20449 -2.588190e+01
## 144 1 144 20736 -1.469528e-13
## 145 1 145 21025 2.588190e+01
## 146 1 146 21316 5.000000e+01
## 147 1 147 21609 7.071068e+01
## 148 1 148 21904 8.660254e+01
## 149 1 149 22201 9.659258e+01
## 150 1 150 22500 1.000000e+02
## 151 1 151 22801 9.659258e+01
## 152 1 152 23104 8.660254e+01
## 153 1 153 23409 7.071068e+01
## 154 1 154 23716 5.000000e+01
## 155 1 155 24025 2.588190e+01
## 156 1 156 24336 5.144702e-13
## 157 1 157 24649 -2.588190e+01
## 158 1 158 24964 -5.000000e+01
## 159 1 159 25281 -7.071068e+01
## 160 1 160 25600 -8.660254e+01
## 161 1 161 25921 -9.659258e+01
## 162 1 162 26244 -1.000000e+02
## 163 1 163 26569 -9.659258e+01
## 164 1 164 26896 -8.660254e+01
## 165 1 165 27225 -7.071068e+01
## 166 1 166 27556 -5.000000e+01
## 167 1 167 27889 -2.588190e+01
## 168 1 168 28224 -1.714449e-13
## 169 1 169 28561 2.588190e+01
## 170 1 170 28900 5.000000e+01
## 171 1 171 29241 7.071068e+01
## 172 1 172 29584 8.660254e+01
## 173 1 173 29929 9.659258e+01
## 174 1 174 30276 1.000000e+02
## 175 1 175 30625 9.659258e+01
## 176 1 176 30976 8.660254e+01
## 177 1 177 31329 7.071068e+01
## 178 1 178 31684 5.000000e+01
## 179 1 179 32041 2.588190e+01
## 180 1 180 32400 -1.715804e-13
## 181 1 181 32761 -2.588190e+01
## 182 1 182 33124 -5.000000e+01
## 183 1 183 33489 -7.071068e+01
## 184 1 184 33856 -8.660254e+01
## 185 1 185 34225 -9.659258e+01
## 186 1 186 34596 -1.000000e+02
## 187 1 187 34969 -9.659258e+01
## 188 1 188 35344 -8.660254e+01
## 189 1 189 35721 -7.071068e+01
## 190 1 190 36100 -5.000000e+01
## 191 1 191 36481 -2.588190e+01
## 192 1 192 36864 -1.959370e-13
## 193 1 193 37249 2.588190e+01
## 194 1 194 37636 5.000000e+01
## 195 1 195 38025 7.071068e+01
## 196 1 196 38416 8.660254e+01
## 197 1 197 38809 9.659258e+01
## 198 1 198 39204 1.000000e+02
## 199 1 199 39601 9.659258e+01
## 200 1 200 40000 8.660254e+01
## 201 1 201 40401 7.071068e+01
## 202 1 202 40804 5.000000e+01
## 203 1 203 41209 2.588190e+01
## 204 1 204 41616 5.634544e-13
## 205 1 205 42025 -2.588190e+01
## 206 1 206 42436 -5.000000e+01
## 207 1 207 42849 -7.071068e+01
## 208 1 208 43264 -8.660254e+01
## 209 1 209 43681 -9.659258e+01
## 210 1 210 44100 -1.000000e+02
## 211 1 211 44521 -9.659258e+01
## 212 1 212 44944 -8.660254e+01
## 213 1 213 45369 -7.071068e+01
## 214 1 214 45796 -5.000000e+01
## 215 1 215 46225 -2.588190e+01
## 216 1 216 46656 -2.204291e-13
## 217 1 217 47089 2.588190e+01
## 218 1 218 47524 5.000000e+01
## 219 1 219 47961 7.071068e+01
## 220 1 220 48400 8.660254e+01
## 221 1 221 48841 9.659258e+01
## 222 1 222 49284 1.000000e+02
## 223 1 223 49729 9.659258e+01
## 224 1 224 50176 8.660254e+01
## 225 1 225 50625 7.071068e+01
## 226 1 226 51076 5.000000e+01
## 227 1 227 51529 2.588190e+01
## 228 1 228 51984 5.879466e-13
## 229 1 229 52441 -2.588190e+01
## 230 1 230 52900 -5.000000e+01
## 231 1 231 53361 -7.071068e+01
## 232 1 232 53824 -8.660254e+01
## 233 1 233 54289 -9.659258e+01
## 234 1 234 54756 -1.000000e+02
## 235 1 235 55225 -9.659258e+01
## 236 1 236 55696 -8.660254e+01
## 237 1 237 56169 -7.071068e+01
## 238 1 238 56644 -5.000000e+01
## 239 1 239 57121 -2.588190e+01
## 240 1 240 57600 -9.554640e-13
## 241 1 241 58081 2.588190e+01
## 242 1 242 58564 5.000000e+01
## 243 1 243 59049 7.071068e+01
## 244 1 244 59536 8.660254e+01
## 245 1 245 60025 9.659258e+01
## 246 1 246 60516 1.000000e+02
## 247 1 247 61009 9.659258e+01
## 248 1 248 61504 8.660254e+01
## 249 1 249 62001 7.071068e+01
## 250 1 250 62500 5.000000e+01
## 251 1 251 63001 2.588190e+01
## 252 1 252 63504 -9.810403e-14
## 253 1 253 64009 -2.588190e+01
## 254 1 254 64516 -5.000000e+01
## 255 1 255 65025 -7.071068e+01
## 256 1 256 65536 -8.660254e+01
## 257 1 257 66049 -9.659258e+01
## 258 1 258 66564 -1.000000e+02
## 259 1 259 67081 -9.659258e+01
## 260 1 260 67600 -8.660254e+01
## 261 1 261 68121 -7.071068e+01
## 262 1 262 68644 -5.000000e+01
## 263 1 263 69169 -2.588190e+01
## 264 1 264 69696 4.411293e-13
## attr(,"assign")
## [1] 0 1 2 3
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*8, 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, 32) │ 160
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_1 (Dense) │ (None, 16) │ 528
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_2 (Dense) │ (None, 8) │ 136
## ├───────────────────────────────────┼──────────────────────────┼───────────────
## │ dense_3 (Dense) │ (None, 1) │ 9
## └───────────────────────────────────┴──────────────────────────┴───────────────
## Total params: 833 (3.25 KB)
## Trainable params: 833 (3.25 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")) # 評価指標:絶対値誤差平均
dim(x.tr) # Should return something like (n, p) where n is the number of observations
## [1] 264 4
length(d.tr$y)
## [1] 264
# コールバック設定
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 - 47ms/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 -273.755 273.755 13.80677 284.095
# Kerasパッケージでの精度指標
evaluate(model, x.te, d.te$y)
## 3/3 - 0s - 15ms/step - loss: 80709.9688 - mean_absolute_error: 273.7550
## $loss
## [1] 80709.97
##
## $mean_absolute_error
## [1] 273.755
get.accuracy(yhat = yhat.lm, y = d.te$y)
## MBE MAE MAPE RMSE
## 1 -1.683005 3.942815 0.2068178 4.884525