@@ -138,96 +138,152 @@ cross_sets <- function(n, k){
138
138
139
139
# Create the results file by sinking an initial line and the values of the parameters in the elipsis argument
140
140
initialize_results_file <- function (res_file , ... ){
141
- params <- as.list(substitute(list (... )))
141
+ params <- list (... )
142
+ param_names <- as.list(substitute(list (... )))[- 1L ]
142
143
sep <- " \n ---------------------------------------\n\n "
143
144
sink(res_file )
144
145
cat(" Beginning the experiment. The parameters are: \n " )
145
146
for (i in 2 : length(params )){
146
- cat(paste0(names( params ) [i ], " : " , params [i ], " \n " ))
147
+ cat(paste0(param_names [i ], " : " , params [[ i ] ], " \n " ))
147
148
}
148
149
cat(sep )
149
- sink(NULL )
150
+ sink()
151
+ }
152
+
153
+ print_current_results <- function (res_file , res_matrix , it ){
154
+ sep <- " \n ---------------------------------------\n\n "
155
+ sink(res_file , append = T )
156
+ if (it == - 1 ){ # Final results
157
+ cat(" The final results of the experiment are: \n " )
158
+ print(res_matrix )
159
+ }
160
+ else {
161
+ cat(paste0(" The results of fold number " , it , " are: \n " ))
162
+ print(res_matrix )
163
+ cat(sep )
164
+ }
165
+
166
+ sink()
150
167
}
151
168
152
169
mae <- function (orig , pred ){
153
170
return (sum(abs(orig - pred )/ length(orig )))
154
171
}
155
172
156
- forecast_cycle_intervals <- function (f_dt_test , model , id_var , ... ){
173
+ forecast_cycle_intervals_single <- function (f_dt_test , model , id_var , obj_vars , pred_len ){
157
174
cycles <- f_dt_test [, unique(get(id_var ))]
158
175
reps <- f_dt_test [, ceiling(dim(.SD )[1 ] / pred_len ), by = id_var ]$ V1
159
- res_mae <- vector(mode = " numeric" , length = sum(reps ))
160
- for (i in cycles ){
176
+ res_matrix <- matrix (nrow = sum(reps ), ncol = 2 )
177
+ global_rep <- 1
178
+
179
+ for (i in 1 : length(cycles )){
161
180
ini <- 1
162
- # TODO
181
+ din_pred_len <- pred_len
182
+ for (j in 1 : reps [i ]){
183
+ if (ini + din_pred_len > dim(f_dt_test [get(id_var ) == cycles [i ], ! eval(id_var ), with = F ])[1 ]) # Last iteration of each cycle is probably smaller
184
+ din_pred_len <- dim(f_dt_test [get(id_var ) == cycles [i ], ! eval(id_var ), with = F ])[1 ] - ini + 1
185
+ span <- Sys.time()
186
+ res_cycle <- suppressWarnings(dbnR :: forecast_ts(f_dt_test [get(id_var ) == cycles [i ], ! eval(id_var ), with = F ],
187
+ model_fit , size = size , obj_vars = obj_vars ,
188
+ ini = ini , len = din_pred_len , prov_ev = ev_vars ,
189
+ print_res = F , plot_res = F ))
190
+ res_matrix [global_rep , 2 ] <- span - Sys.time()
191
+ res_matrix [global_rep , 1 ] <- mae(res_cycle $ orig [,get(obj_vars )], res_cycle $ pred [,get(obj_vars )])
192
+ global_rep <- global_rep + 1
193
+ ini <- ini + din_pred_len
194
+ }
163
195
}
196
+
197
+ return (apply(res_matrix , 2 , mean ))
164
198
}
165
199
166
- launch_single_model <- function (f_dt_train , f_dt_test , obj_vars , method , min_ind , max_depth ,
200
+ launch_single_model <- function (f_dt_train , f_dt_test , id_var , obj_vars , pred_len , method , min_ind , max_depth ,
167
201
n_it , n_ind , gb_cte , lb_cte , cte , r_probs , v_probs ){
168
- cat( " Single model training: \n " )
169
- tmp <- Sys.time()
202
+ res_matrix <- matrix ( nrow = 1 , ncol = 3 )
203
+ span <- Sys.time() # Size were? TODO
170
204
model_net <- dbnR :: learn_dbn_struc(dt_train , size , method = method , f_dt = f_dt_train , n_it = n_it ,
171
205
n_ind = n_ind , gb_cte = gb_cte , lb_cte = lb_cte , r_probs = r_probs ,
172
206
v_probs = v_probs , cte = cte )
173
207
model_fit <- dbnR :: fit_dbn_params(model_net , f_dt_train )
208
+ res_matrix [1 ,3 ] <- span - Sys.time()
209
+ res_matrix [1 ,1 : 2 ] <- forecast_cycle_intervals_single(f_dt_test , model_fit , id_var , obj_vars , pred_len )
174
210
175
- cat(paste0(" Elapsed time: " , tmp - Sys.time()))
176
-
177
- print(" Forecasting time for single net: " )
178
- res_net <- suppressWarnings(dbnR :: forecast_ts(f_dt_test , model_fit , size = size ,
179
- obj_vars = obj_vars , ini = ini , len = len , prov_ev = ev_vars ))
180
-
181
- cat(" \n ---------------------------------------\n\n " )
211
+ return (res_matrix )
182
212
}
183
213
184
- launch_hybrid_model <- function (){
214
+ launch_hybrid_model <- function (f_dt_train , f_dt_test , id_var , obj_vars , mv , homogen , pred_len , method , min_ind , max_depth ,
215
+ n_it , n_ind , gb_cte , lb_cte , r_probs , v_probs , prune_val ){
216
+ res_matrix <- matrix (nrow = 1 , ncol = 3 )
217
+ span <- Sys.time()
218
+ model <- mtDBN :: mtDBN $ new()
219
+ model $ fit_model(dt_train , size , method = method , obj_var = obj_vars , mv = mv , homogen = homogen ,
220
+ min_ind = min_ind , max_depth = max_depth , f_dt = f_dt_train , n_it = n_it , n_ind = n_ind , gb_cte = gb_cte ,
221
+ lb_cte = lb_cte , cte = cte , r_probs = r_probs , v_probs = v_probs , prune_val = prune_val )
222
+ res_matrix [1 ,3 ] <- span - Sys.time()
223
+ res_matrix [1 ,1 : 2 ] <- forecast_cycle_intervals_single(f_dt_test , model , id_var , obj_vars , pred_len )
185
224
225
+ return (res_matrix )
186
226
}
187
227
188
228
train_test_iteration <- function (dt , id_var , test_id , obj_vars ,
189
229
method = " psoho" , min_ind = 300 , max_depth = 8 , n_it = 100 ,
190
230
n_ind = 100 , gb_cte = 0.3 , lb_cte = 0.7 , cte = F ,
191
- r_probs = c(- 0.5 , 1.5 ), v_probs = c(10 ,65 ,25 ), prune_val = 0.015 ){
231
+ r_probs = c(- 0.5 , 1.5 ), v_probs = c(10 ,65 ,25 ), prune_val = 0.015 , pred_len = 20 ){
192
232
193
- res_mae <- vector(mode = " numeric" , length = 5 )
233
+ res_matrix <- matrix (nrow = 5 , ncol = 3 )
234
+ colnames(res_matrix ) <- c(" MAE" , " exec_time" , " train_time" )
194
235
pred_vars <- names(dt_train )[! (names(dt_train ) %in% obj_vars )]
195
236
dt_train <- dt [! (profile_id %in% test_id )]
196
237
dt_test <- dt [profile_id %in% test_id ]
197
238
198
239
f_dt_train <- dbnR :: filtered_fold_dt(dt_train , size , id_var )
199
240
f_dt_test <- dbnR :: filtered_fold_dt(dt_test , size , id_var , clear_id_var = F )
200
- dt_train [, (id_var ) : = NULL ]
201
- # dt_test[, (id_var) := NULL]
202
241
203
- res_mae [1 ] <- launch_single_model()
204
- res_mae [2 ] <- launch_hybrid_model()
205
- res_mae [3 ] <- launch_hybrid_model()
206
- res_mae [4 ] <- launch_hybrid_model()
207
- res_mae [5 ] <- launch_hybrid_model()
242
+ res_matrix [1 ,] <- launch_single_model(f_dt_train , f_dt_test , id_var , obj_vars , pred_len , method , min_ind , max_depth ,
243
+ n_it , n_ind , gb_cte , lb_cte , cte , r_probs , v_probs )
244
+ # res_matrix[2,] <- launch_hybrid_model()
245
+ # res_matrix[3,] <- launch_hybrid_model()
246
+ # res_matrix[4,] <- launch_hybrid_model()
247
+ # res_matrix[5,] <- launch_hybrid_model()
208
248
209
- return (res_mae )
249
+ return (res_matrix )
210
250
}
211
251
212
- full_exp_motor_run <- function (dt , id_var , cross_sets , obj_vars , seed = NULL ,
252
+
253
+
254
+ full_exp_motor_run <- function (dt , id_var , obj_vars , seed = NULL ,
213
255
method = " psoho" , min_ind = 300 , max_depth = 8 , n_it = 100 ,
214
256
n_ind = 100 , gb_cte = 0.3 , lb_cte = 0.7 , cte = F ,
215
- r_probs = c(- 0.5 , 1.5 ), v_probs = c(10 ,65 ,25 ), prune_val = 0.015 ,
216
- res_file = " full_run_results.txt" ){
257
+ r_probs = c(- 0.5 , 1.5 ), v_probs = c(10 ,65 ,25 ), prune_val = 0.015 , pred_len = 20 ,
258
+ fold_len = 3 , res_file = " full_run_results.txt" ){
217
259
218
-
219
- res_mae <- matrix (nrow = length(cross_sets ), ncol = 5 )
260
+ res_matrix <- matrix (nrow = 5 , ncol = 3 , 0 ) # 5 different models, 3 columns: MAE, exec_time and train_time
220
261
set.seed(seed )
262
+ cv_sets <- cross_sets(dt [, unique(get(id_var ))], fold_len )
221
263
222
- initialize_results_file(res_file = " full_run_results.txt " , cross_sets , obj_vars , seed ,
223
- method , min_ind , max_depth , n_it , n_ind , gb_cte , lb_ct , cte ,
264
+ initialize_results_file(res_file , cv_sets , obj_vars , seed ,
265
+ method , min_ind , max_depth , n_it , n_ind , gb_cte , lb_cte , cte ,
224
266
r_probs , v_probs , prune_val )
225
267
226
- for (i in 1 : length(cross_sets )){
227
- res_mae [i ,] <- train_test_iteration(dt , id_var , cross_sets [[i ]], obj_vars , seed , method , min_ind , max_depth ,
228
- n_it , n_ind , gb_cte , lb_cte , cte , r_probs , v_probs , prune_val )
229
-
268
+ for (i in 1 : length(cv_sets )){
269
+ message(paste0(" Currently on the fold number " , i , " out of " , length(cv_sets )))
270
+ res_tmp <- train_test_iteration(dt , id_var , cv_sets [[i ]], obj_vars , method , min_ind , max_depth ,
271
+ n_it , n_ind , gb_cte , lb_cte , cte , r_probs , v_probs , prune_val , pred_len )
272
+ print_current_results(res_file , res_tmp , i )
273
+ res_matrix <- res_matrix + res_tmp
230
274
}
231
275
276
+ res_matrix <- res_matrix / length(cv_sets )
277
+ print_current_results(res_matrix , - 1 )
232
278
}
233
279
280
+ main_prep_and_run <- function (){
281
+ dt <- data.table :: fread(" ./dataset/motor_measures_v2.csv" ) # 0.5 secs between rows
282
+ size <- 3
283
+ id_var <- " profile_id"
284
+
285
+ dt [, torque : = NULL ]
286
+ dt <- dbnR :: reduce_freq(dt , 30 , 0.5 , id_var ) # 30 secs between rows
287
+ obj_vars <- " pm_t_0"
288
+ full_exp_motor_run(dt , id_var , obj_vars , seed = 42 , n_it = 2 )
289
+ }
0 commit comments