File size: 101,787 Bytes
9e55601
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SMOTENC(๋‹จ์ˆœ์„ ํ˜•๋ณด๊ฐ„์ฆ๊ฐ•)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "11000 | 11000 | 21893\n",
      "12000 | 12000 | 23686\n",
      "12500 | 12500 | 24694\n",
      "13000 | 13000 | 25149\n",
      "12000 | 12000 | 23471\n",
      "12000 | 12000 | 23798\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from imblearn.over_sampling import SMOTENC\n",
    "\n",
    "# ์ง€์—ญ๋ณ„ ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๊ฒฝ๋กœ\n",
    "regions = ['incheon', 'seoul','busan', 'daegu', 'daejeon', 'gwangju']\n",
    "file_paths = [f'../data/data_for_modeling/{region}_train.csv' for region in regions]\n",
    "output_paths = [f'../data/data_oversampled/smote_{region}.csv' for region in regions]\n",
    "\n",
    "# ์ง€์—ญ๋ณ„ ์ฒ˜๋ฆฌ\n",
    "for file_path, output_path in zip(file_paths, output_paths):\n",
    "    # ๋ฐ์ดํ„ฐ ๋กœ๋“œ\n",
    "    data = pd.read_csv(file_path, index_col=0)\n",
    "    data['cloudcover'] = data['cloudcover'].astype('int')\n",
    "    data['lm_cloudcover'] = data['lm_cloudcover'].astype('int')\n",
    "    X = data.drop(columns=['multi_class', 'binary_class'])\n",
    "    y = data['multi_class']\n",
    "\n",
    "    # ๋ถˆํ•„์š”ํ•œ ์—ด ์ œ๊ฑฐ\n",
    "    X.drop(columns=['ground_temp - temp_C', 'hour_sin', 'hour_cos', 'month_sin', 'month_cos'], inplace=True)\n",
    "\n",
    "    # SMOTENC์—์„œ ์‚ฌ์šฉํ•  ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜ ์—ด ๋ฒˆํ˜ธ ์„ค์ •\n",
    "    categorical_features_indices = [i for i, dtype in enumerate(X.dtypes) if dtype != 'float64']\n",
    "\n",
    "    # sampling_strategy ์„ค์ •\n",
    "    count_class_2 = (y == 2).sum()\n",
    "    sampling_strategy = {\n",
    "        0: int(np.ceil(count_class_2 / 1000) * 500),\n",
    "        1: int(np.ceil(count_class_2 / 1000) * 500),\n",
    "        2: count_class_2\n",
    "    }\n",
    "\n",
    "    # SMOTENC ์ ์šฉ\n",
    "    smotenc = SMOTENC(categorical_features=categorical_features_indices, sampling_strategy=sampling_strategy, random_state=42)\n",
    "    X_resampled, y_resampled = smotenc.fit_resample(X, y)\n",
    "\n",
    "    # Resampled ๋ฐ์ดํ„ฐ ์ƒ์„ฑ\n",
    "    lerp_data = X_resampled.copy()\n",
    "    lerp_data['multi_class'] = y_resampled\n",
    "\n",
    "    # ์ œ๊ฑฐ๋ณ€์ˆ˜ ๋ณต๊ตฌ\n",
    "    lerp_data['binary_class'] = lerp_data['multi_class'].apply(lambda x: 0 if x == 2 else 1)\n",
    "    lerp_data['hour_sin'] = np.sin(2 * np.pi * lerp_data['hour'] / 24)\n",
    "    lerp_data['hour_cos'] = np.cos(2 * np.pi * lerp_data['hour'] / 24)\n",
    "    lerp_data['month_sin'] = np.sin(2 * np.pi * lerp_data['month'] / 12)\n",
    "    lerp_data['month_cos'] = np.cos(2 * np.pi * lerp_data['month'] / 12)\n",
    "    lerp_data['ground_temp - temp_C'] = lerp_data['groundtemp'] - lerp_data['temp_C']\n",
    "\n",
    "    # ๊ฒฐ๊ณผ ์ €์žฅ\n",
    "    lerp_data.to_csv(output_path, index = False)\n",
    "    print(len(lerp_data[lerp_data['multi_class']==0]),'|',len(lerp_data[lerp_data['multi_class']==1]),'|',len(lerp_data[lerp_data['multi_class']==2]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SMOTENC(์ดˆ๊ธฐ์„ ํ˜•๋ณด๊ฐ„์ฆ๊ฐ•) + CTGAN(์กฐ๊ฑด๋ถ€์ฆ๊ฐ•)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'%pip install imbalanced-learn'"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''%pip install imbalanced-learn sdv optuna'''"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### ์†Œ์ˆ˜๋ฒ”์ฃผ๋‹น ์ฆ๊ฐ• ๋ชฉํ‘œ 20000๊ฐœ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using device: cuda\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-01-20 14:56:59,102] A new study created in memory with name: no-name-b76e8d7c-ea9f-42f3-b88f-320929a7e5ac\n",
      "[I 2025-01-20 14:57:16,217] Trial 0 finished with value: -37.318639001504366 and parameters: {'embedding_dim': 71, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 1}. Best is trial 0 with value: -37.318639001504366.\n",
      "[I 2025-01-20 14:57:36,855] Trial 1 finished with value: -90.68083127767693 and parameters: {'embedding_dim': 70, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 0 with value: -37.318639001504366.\n",
      "[I 2025-01-20 14:58:03,444] Trial 2 finished with value: -13.074059044651209 and parameters: {'embedding_dim': 84, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 8, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 2 with value: -13.074059044651209.\n",
      "[I 2025-01-20 14:58:54,752] Trial 3 finished with value: -12.274816765539791 and parameters: {'embedding_dim': 128, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 3 with value: -12.274816765539791.\n",
      "[I 2025-01-20 14:59:09,155] Trial 4 finished with value: -34.44549346411927 and parameters: {'embedding_dim': 90, 'generator_dim': (64, 64), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 1}. Best is trial 3 with value: -12.274816765539791.\n",
      "[I 2025-01-20 14:59:50,114] Trial 5 finished with value: -9.00948546286418 and parameters: {'embedding_dim': 68, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 5 with value: -9.00948546286418.\n",
      "[I 2025-01-20 15:01:11,009] Trial 6 finished with value: -6.388978160012437 and parameters: {'embedding_dim': 118, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 6 with value: -6.388978160012437.\n",
      "[I 2025-01-20 15:01:25,167] Trial 7 finished with value: -228.64770439962442 and parameters: {'embedding_dim': 108, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 1}. Best is trial 6 with value: -6.388978160012437.\n",
      "[I 2025-01-20 15:01:51,402] Trial 8 finished with value: -5.368727454151448 and parameters: {'embedding_dim': 114, 'generator_dim': (64, 64), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 8 with value: -5.368727454151448.\n",
      "[I 2025-01-20 15:02:11,569] Trial 9 finished with value: -278.60033287713617 and parameters: {'embedding_dim': 104, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 8 with value: -5.368727454151448.\n",
      "[I 2025-01-20 15:03:05,202] Trial 10 finished with value: -11.579568231204782 and parameters: {'embedding_dim': 116, 'generator_dim': (64, 64), 'discriminator_dim': (64, 64), 'pac': 8, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 8 with value: -5.368727454151448.\n",
      "[I 2025-01-20 15:04:54,530] Trial 11 finished with value: -51.98893561900591 and parameters: {'embedding_dim': 124, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 3}. Best is trial 8 with value: -5.368727454151448.\n",
      "[I 2025-01-20 15:06:15,065] Trial 12 finished with value: -104.10651741905765 and parameters: {'embedding_dim': 112, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 8 with value: -5.368727454151448.\n",
      "[I 2025-01-20 15:08:05,216] Trial 13 finished with value: -71.59408383664889 and parameters: {'embedding_dim': 99, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 3}. Best is trial 8 with value: -5.368727454151448.\n",
      "[I 2025-01-20 15:08:45,626] Trial 14 finished with value: -110.1562292208483 and parameters: {'embedding_dim': 119, 'generator_dim': (64, 64), 'discriminator_dim': (64, 64), 'pac': 8, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 8 with value: -5.368727454151448.\n",
      "[I 2025-01-20 15:09:36,821] Trial 15 finished with value: -3.8151168836858163 and parameters: {'embedding_dim': 120, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 15 with value: -3.8151168836858163.\n",
      "[I 2025-01-20 15:10:03,381] Trial 16 finished with value: -8.68366593294427 and parameters: {'embedding_dim': 101, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 15 with value: -3.8151168836858163.\n",
      "[I 2025-01-20 15:10:30,167] Trial 17 finished with value: -48.95835312594844 and parameters: {'embedding_dim': 93, 'generator_dim': (64, 64), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 15 with value: -3.8151168836858163.\n",
      "[I 2025-01-20 15:11:21,958] Trial 18 finished with value: -20.81247815272162 and parameters: {'embedding_dim': 108, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 15 with value: -3.8151168836858163.\n",
      "[I 2025-01-20 15:11:49,059] Trial 19 finished with value: -50.99872228893688 and parameters: {'embedding_dim': 81, 'generator_dim': (64, 64), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 15 with value: -3.8151168836858163.\n",
      "[I 2025-01-20 15:13:09,572] Trial 20 finished with value: -5.639452046764817 and parameters: {'embedding_dim': 123, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 15 with value: -3.8151168836858163.\n",
      "[I 2025-01-20 15:14:30,274] Trial 21 finished with value: -23.57417977156469 and parameters: {'embedding_dim': 128, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 15 with value: -3.8151168836858163.\n",
      "[I 2025-01-20 15:15:22,032] Trial 22 finished with value: -0.6778059786818922 and parameters: {'embedding_dim': 122, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:16:13,320] Trial 23 finished with value: -32.5624320546421 and parameters: {'embedding_dim': 113, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:17:04,695] Trial 24 finished with value: -5.785384536972532 and parameters: {'embedding_dim': 121, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:17:56,139] Trial 25 finished with value: -8.738764219614195 and parameters: {'embedding_dim': 111, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:18:22,038] Trial 26 finished with value: -184.45992185820504 and parameters: {'embedding_dim': 105, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 8, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:19:13,003] Trial 27 finished with value: -2.6991205788981727 and parameters: {'embedding_dim': 115, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:20:04,624] Trial 28 finished with value: -44.592267621272406 and parameters: {'embedding_dim': 124, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:20:56,181] Trial 29 finished with value: -44.22943387558266 and parameters: {'embedding_dim': 117, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:21:47,508] Trial 30 finished with value: -29.557955872673972 and parameters: {'embedding_dim': 128, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:22:38,696] Trial 31 finished with value: -3.0604149741858233 and parameters: {'embedding_dim': 115, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:23:30,109] Trial 32 finished with value: -4.184301463771818 and parameters: {'embedding_dim': 121, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:24:21,165] Trial 33 finished with value: -56.76796024388123 and parameters: {'embedding_dim': 78, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:25:12,460] Trial 34 finished with value: -68.78895549007119 and parameters: {'embedding_dim': 109, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:25:26,435] Trial 35 finished with value: -7.698349027772178 and parameters: {'embedding_dim': 115, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:26:17,239] Trial 36 finished with value: -1.92703376893977 and parameters: {'embedding_dim': 125, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:27:09,507] Trial 37 finished with value: -342.3563728328815 and parameters: {'embedding_dim': 124, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:27:30,145] Trial 38 finished with value: -38.64880022938009 and parameters: {'embedding_dim': 65, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:28:21,527] Trial 39 finished with value: -171.94890295218917 and parameters: {'embedding_dim': 126, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:29:42,180] Trial 40 finished with value: -2.797751148097547 and parameters: {'embedding_dim': 95, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:31:31,734] Trial 41 finished with value: -195.52351726339586 and parameters: {'embedding_dim': 95, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 3}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:32:52,135] Trial 42 finished with value: -66.50269881474058 and parameters: {'embedding_dim': 88, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:34:11,496] Trial 43 finished with value: -11.503285915156347 and parameters: {'embedding_dim': 89, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:35:03,425] Trial 44 finished with value: -198.7212272708481 and parameters: {'embedding_dim': 104, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:35:30,511] Trial 45 finished with value: -5.755500215208933 and parameters: {'embedding_dim': 99, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 3}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:36:21,350] Trial 46 finished with value: -17.212335519290654 and parameters: {'embedding_dim': 74, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:37:42,167] Trial 47 finished with value: -47.30773434273214 and parameters: {'embedding_dim': 85, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:38:33,458] Trial 48 finished with value: -4.050649756572355 and parameters: {'embedding_dim': 118, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:39:53,817] Trial 49 finished with value: -85.45026059502085 and parameters: {'embedding_dim': 93, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 22 with value: -0.6778059786818922.\n",
      "[I 2025-01-20 15:40:45,481] A new study created in memory with name: no-name-9f81a759-8c1c-45e7-9717-966f9494aea6\n",
      "[I 2025-01-20 15:42:36,221] Trial 0 finished with value: -75.5212527916712 and parameters: {'embedding_dim': 499, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 4, 'batch_size': 1024, 'discriminator_steps': 5}. Best is trial 0 with value: -75.5212527916712.\n",
      "[I 2025-01-20 15:44:06,113] Trial 1 finished with value: -111.70948723752186 and parameters: {'embedding_dim': 281, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 0 with value: -75.5212527916712.\n",
      "[I 2025-01-20 15:48:33,946] Trial 2 finished with value: -479.1722735079276 and parameters: {'embedding_dim': 468, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 4}. Best is trial 0 with value: -75.5212527916712.\n",
      "[I 2025-01-20 15:53:59,017] Trial 3 finished with value: -48.69174576070862 and parameters: {'embedding_dim': 219, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 5}. Best is trial 3 with value: -48.69174576070862.\n",
      "[I 2025-01-20 15:56:03,676] Trial 4 finished with value: -4.409888912338193 and parameters: {'embedding_dim': 137, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 3}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 15:56:37,777] Trial 5 finished with value: -471.9978221268116 and parameters: {'embedding_dim': 229, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 1024, 'discriminator_steps': 1}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 15:58:28,153] Trial 6 finished with value: -601.2484927626908 and parameters: {'embedding_dim': 478, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 1024, 'discriminator_steps': 5}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:00:31,897] Trial 7 finished with value: -695.4921399608821 and parameters: {'embedding_dim': 450, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 4, 'batch_size': 512, 'discriminator_steps': 3}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:04:59,739] Trial 8 finished with value: -47.389652192459366 and parameters: {'embedding_dim': 194, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 4}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:07:34,586] Trial 9 finished with value: -1001.9812539137846 and parameters: {'embedding_dim': 355, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:09:38,375] Trial 10 finished with value: -33.10530614059147 and parameters: {'embedding_dim': 130, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 3}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:11:41,364] Trial 11 finished with value: -362.128696252612 and parameters: {'embedding_dim': 128, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 3}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:13:12,305] Trial 12 finished with value: -328.82671400582115 and parameters: {'embedding_dim': 130, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:15:47,167] Trial 13 finished with value: -7.9286899630985275 and parameters: {'embedding_dim': 359, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 4}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:18:22,255] Trial 14 finished with value: -342.6117545823074 and parameters: {'embedding_dim': 354, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 4}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:20:57,741] Trial 15 finished with value: -67.35499346617792 and parameters: {'embedding_dim': 391, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 4}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:21:55,034] Trial 16 finished with value: -266.2126635115298 and parameters: {'embedding_dim': 302, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:24:30,585] Trial 17 finished with value: -35.730265204691946 and parameters: {'embedding_dim': 426, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 4}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:26:33,459] Trial 18 finished with value: -108.18797777120533 and parameters: {'embedding_dim': 259, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 3}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:27:45,561] Trial 19 finished with value: -71.26357253219594 and parameters: {'embedding_dim': 329, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 1024, 'discriminator_steps': 3}. Best is trial 4 with value: -4.409888912338193.\n",
      "[I 2025-01-20 16:29:15,652] Trial 20 finished with value: -1.3630811306533475 and parameters: {'embedding_dim': 402, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 20 with value: -1.3630811306533475.\n",
      "[I 2025-01-20 16:30:44,754] Trial 21 finished with value: -488.94996822363987 and parameters: {'embedding_dim': 402, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 20 with value: -1.3630811306533475.\n",
      "[I 2025-01-20 16:32:13,977] Trial 22 finished with value: -716.9087223543194 and parameters: {'embedding_dim': 380, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 20 with value: -1.3630811306533475.\n",
      "[I 2025-01-20 16:34:15,782] Trial 23 finished with value: -1312.349106866347 and parameters: {'embedding_dim': 323, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 3}. Best is trial 20 with value: -1.3630811306533475.\n",
      "[I 2025-01-20 16:35:45,149] Trial 24 finished with value: -658.7045880157874 and parameters: {'embedding_dim': 425, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 20 with value: -1.3630811306533475.\n",
      "[I 2025-01-20 16:36:41,995] Trial 25 finished with value: -649.0407497590966 and parameters: {'embedding_dim': 358, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 20 with value: -1.3630811306533475.\n",
      "[I 2025-01-20 16:39:18,618] Trial 26 finished with value: -137.14788624945254 and parameters: {'embedding_dim': 428, 'generator_dim': (128, 128), 'discriminator_dim': (256, 256), 'pac': 4, 'batch_size': 512, 'discriminator_steps': 4}. Best is trial 20 with value: -1.3630811306533475.\n",
      "[I 2025-01-20 16:41:23,169] Trial 27 finished with value: -11.215443967140468 and parameters: {'embedding_dim': 172, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 3}. Best is trial 20 with value: -1.3630811306533475.\n",
      "[I 2025-01-20 16:44:54,394] Trial 28 finished with value: -70.15458903694731 and parameters: {'embedding_dim': 301, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 3}. Best is trial 20 with value: -1.3630811306533475.\n",
      "[I 2025-01-20 16:46:43,597] Trial 29 finished with value: -77.00986664642153 and parameters: {'embedding_dim': 269, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 4, 'batch_size': 1024, 'discriminator_steps': 5}. Best is trial 20 with value: -1.3630811306533475.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Processed and saved: ../data/data_oversampled/ctgan_incheon.feather\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-01-20 16:48:14,616] A new study created in memory with name: no-name-9673bd2f-608c-45e0-b8eb-39eeba0d0bbe\n",
      "[I 2025-01-20 16:48:37,588] Trial 0 finished with value: -23.155852178206054 and parameters: {'embedding_dim': 72, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 0 with value: -23.155852178206054.\n",
      "[I 2025-01-20 16:48:42,118] Trial 1 finished with value: -34.21490168723894 and parameters: {'embedding_dim': 90, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 1}. Best is trial 0 with value: -23.155852178206054.\n",
      "[I 2025-01-20 16:49:05,052] Trial 2 finished with value: -4.003410149026237 and parameters: {'embedding_dim': 118, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:49:28,467] Trial 3 finished with value: -21.564028021550694 and parameters: {'embedding_dim': 106, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:49:51,875] Trial 4 finished with value: -7.355484157065245 and parameters: {'embedding_dim': 112, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:50:00,722] Trial 5 finished with value: -32.39901609359498 and parameters: {'embedding_dim': 74, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 3}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:50:24,169] Trial 6 finished with value: -4.0750874978322935 and parameters: {'embedding_dim': 68, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:50:30,904] Trial 7 finished with value: -5.8933791686324675 and parameters: {'embedding_dim': 117, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:50:37,571] Trial 8 finished with value: -15.325497040087624 and parameters: {'embedding_dim': 128, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:50:48,499] Trial 9 finished with value: -16.06789263895181 and parameters: {'embedding_dim': 112, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:51:11,461] Trial 10 finished with value: -6.933575610142412 and parameters: {'embedding_dim': 92, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:51:48,391] Trial 11 finished with value: -4.1384946672555945 and parameters: {'embedding_dim': 64, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:52:38,821] Trial 12 finished with value: -9.416054623408765 and parameters: {'embedding_dim': 82, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 3}. Best is trial 2 with value: -4.003410149026237.\n",
      "[I 2025-01-20 16:52:55,737] Trial 13 finished with value: -2.7694488886245567 and parameters: {'embedding_dim': 102, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 13 with value: -2.7694488886245567.\n",
      "[I 2025-01-20 16:53:12,663] Trial 14 finished with value: -8.615367995825054 and parameters: {'embedding_dim': 100, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 13 with value: -2.7694488886245567.\n",
      "[I 2025-01-20 16:53:29,586] Trial 15 finished with value: -6.889357108499393 and parameters: {'embedding_dim': 123, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 13 with value: -2.7694488886245567.\n",
      "[I 2025-01-20 16:53:52,531] Trial 16 finished with value: -9.171953998759633 and parameters: {'embedding_dim': 98, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 13 with value: -2.7694488886245567.\n",
      "[I 2025-01-20 16:54:09,458] Trial 17 finished with value: -57.35581165476122 and parameters: {'embedding_dim': 106, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 13 with value: -2.7694488886245567.\n",
      "[I 2025-01-20 16:54:26,358] Trial 18 finished with value: -8.11141919896362 and parameters: {'embedding_dim': 119, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 13 with value: -2.7694488886245567.\n",
      "[I 2025-01-20 16:54:49,299] Trial 19 finished with value: -36.89391231331456 and parameters: {'embedding_dim': 105, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 13 with value: -2.7694488886245567.\n",
      "[I 2025-01-20 16:55:12,263] Trial 20 finished with value: -0.915130278465809 and parameters: {'embedding_dim': 85, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:55:35,365] Trial 21 finished with value: -9.14515742082317 and parameters: {'embedding_dim': 88, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:55:58,368] Trial 22 finished with value: -11.94829599012277 and parameters: {'embedding_dim': 81, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:56:15,325] Trial 23 finished with value: -1.5616654362533082 and parameters: {'embedding_dim': 82, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:56:32,320] Trial 24 finished with value: -2.062209737409747 and parameters: {'embedding_dim': 82, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:56:49,278] Trial 25 finished with value: -2.528799284383497 and parameters: {'embedding_dim': 80, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:57:06,209] Trial 26 finished with value: -5.408362529903892 and parameters: {'embedding_dim': 76, 'generator_dim': (64, 64), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:57:23,136] Trial 27 finished with value: -8.895873144737894 and parameters: {'embedding_dim': 88, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:57:29,847] Trial 28 finished with value: -67.16752180682067 and parameters: {'embedding_dim': 85, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:57:46,817] Trial 29 finished with value: -2.3990267779936456 and parameters: {'embedding_dim': 94, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:58:09,819] Trial 30 finished with value: -1.0609161149494997 and parameters: {'embedding_dim': 77, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:58:32,799] Trial 31 finished with value: -40.89668749736999 and parameters: {'embedding_dim': 76, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:58:55,758] Trial 32 finished with value: -20.543485177832817 and parameters: {'embedding_dim': 71, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:59:18,740] Trial 33 finished with value: -48.817409667795275 and parameters: {'embedding_dim': 85, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:59:41,793] Trial 34 finished with value: -8.609796785683871 and parameters: {'embedding_dim': 80, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 16:59:52,805] Trial 35 finished with value: -0.9307100824718637 and parameters: {'embedding_dim': 70, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:00:03,767] Trial 36 finished with value: -18.096015461780212 and parameters: {'embedding_dim': 70, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:00:08,288] Trial 37 finished with value: -47.453982612938844 and parameters: {'embedding_dim': 76, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 1}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:00:31,733] Trial 38 finished with value: -317.9490947764603 and parameters: {'embedding_dim': 67, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 1}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:00:36,269] Trial 39 finished with value: -5.325056185063841 and parameters: {'embedding_dim': 74, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 1}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:01:26,667] Trial 40 finished with value: -2.4975095593414944 and parameters: {'embedding_dim': 65, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:01:37,549] Trial 41 finished with value: -8.724928631283321 and parameters: {'embedding_dim': 85, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:01:54,575] Trial 42 finished with value: -9.957479554800914 and parameters: {'embedding_dim': 78, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:02:17,543] Trial 43 finished with value: -20.086840991896658 and parameters: {'embedding_dim': 90, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:02:28,489] Trial 44 finished with value: -123.24510747774687 and parameters: {'embedding_dim': 73, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 1}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:02:51,367] Trial 45 finished with value: -2.8224441691394726 and parameters: {'embedding_dim': 83, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 8, 'batch_size': 128, 'discriminator_steps': 3}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:03:08,278] Trial 46 finished with value: -61.541871320706946 and parameters: {'embedding_dim': 78, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:03:45,236] Trial 47 finished with value: -44.6086713907501 and parameters: {'embedding_dim': 71, 'generator_dim': (64, 64), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 64, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:03:49,767] Trial 48 finished with value: -18.76213014994069 and parameters: {'embedding_dim': 69, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 1}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:04:06,677] Trial 49 finished with value: -14.235673820573563 and parameters: {'embedding_dim': 92, 'generator_dim': (128, 128), 'discriminator_dim': (64, 64), 'pac': 8, 'batch_size': 128, 'discriminator_steps': 2}. Best is trial 20 with value: -0.915130278465809.\n",
      "[I 2025-01-20 17:04:29,881] A new study created in memory with name: no-name-cd965ffc-fc7d-429e-ae05-208f0c3fad33\n",
      "[I 2025-01-20 17:06:32,714] Trial 0 finished with value: -522.274136185342 and parameters: {'embedding_dim': 225, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 3}. Best is trial 0 with value: -522.274136185342.\n",
      "[I 2025-01-20 17:07:20,042] Trial 1 finished with value: -586.1407911119707 and parameters: {'embedding_dim': 480, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 1024, 'discriminator_steps': 4}. Best is trial 0 with value: -522.274136185342.\n",
      "[I 2025-01-20 17:08:50,110] Trial 2 finished with value: -1338.898800006008 and parameters: {'embedding_dim': 383, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 0 with value: -522.274136185342.\n",
      "[I 2025-01-20 17:09:46,877] Trial 3 finished with value: -595.5573560928374 and parameters: {'embedding_dim': 441, 'generator_dim': (128, 128), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 1024, 'discriminator_steps': 5}. Best is trial 0 with value: -522.274136185342.\n",
      "[I 2025-01-20 17:10:15,266] Trial 4 finished with value: -186.13472727208838 and parameters: {'embedding_dim': 186, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 1024, 'discriminator_steps': 2}. Best is trial 4 with value: -186.13472727208838.\n",
      "[I 2025-01-20 17:11:59,408] Trial 5 finished with value: -556.572362981219 and parameters: {'embedding_dim': 379, 'generator_dim': (128, 128), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 5}. Best is trial 4 with value: -186.13472727208838.\n",
      "[I 2025-01-20 17:13:07,775] Trial 6 finished with value: -30.304752691466533 and parameters: {'embedding_dim': 214, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 3}. Best is trial 6 with value: -30.304752691466533.\n",
      "[I 2025-01-20 17:14:32,975] Trial 7 finished with value: -31.549366617667648 and parameters: {'embedding_dim': 388, 'generator_dim': (128, 128), 'discriminator_dim': (256, 256), 'pac': 4, 'batch_size': 512, 'discriminator_steps': 4}. Best is trial 6 with value: -30.304752691466533.\n",
      "[I 2025-01-20 17:15:12,970] Trial 8 finished with value: -345.73649432175523 and parameters: {'embedding_dim': 409, 'generator_dim': (128, 128), 'discriminator_dim': (128, 128), 'pac': 8, 'batch_size': 1024, 'discriminator_steps': 3}. Best is trial 6 with value: -30.304752691466533.\n",
      "[I 2025-01-20 17:15:45,595] Trial 9 finished with value: -1021.6740667962498 and parameters: {'embedding_dim': 451, 'generator_dim': (128, 128), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 6 with value: -30.304752691466533.\n",
      "[I 2025-01-20 17:16:18,456] Trial 10 finished with value: -0.6514198871412 and parameters: {'embedding_dim': 270, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:16:51,307] Trial 11 finished with value: -4.8963478843156665 and parameters: {'embedding_dim': 277, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:17:24,454] Trial 12 finished with value: -153.22796082787534 and parameters: {'embedding_dim': 289, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:17:56,888] Trial 13 finished with value: -199.5670473579735 and parameters: {'embedding_dim': 299, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:18:47,371] Trial 14 finished with value: -140.37597916237385 and parameters: {'embedding_dim': 134, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:19:20,921] Trial 15 finished with value: -3561.1724538614976 and parameters: {'embedding_dim': 261, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:20:51,379] Trial 16 finished with value: -547.4278435153543 and parameters: {'embedding_dim': 334, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:21:24,230] Trial 17 finished with value: -1821.0058166894948 and parameters: {'embedding_dim': 341, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:22:14,676] Trial 18 finished with value: -21.687672514288167 and parameters: {'embedding_dim': 253, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:23:12,549] Trial 19 finished with value: -110.57179286531195 and parameters: {'embedding_dim': 161, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:24:39,667] Trial 20 finished with value: -880.2718942270703 and parameters: {'embedding_dim': 259, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 4}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:25:29,860] Trial 21 finished with value: -15.677402299300798 and parameters: {'embedding_dim': 247, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:26:20,084] Trial 22 finished with value: -443.87283814186236 and parameters: {'embedding_dim': 303, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:26:52,252] Trial 23 finished with value: -1813.9072516488602 and parameters: {'embedding_dim': 216, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:27:42,365] Trial 24 finished with value: -3066.9405889616755 and parameters: {'embedding_dim': 273, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:28:15,491] Trial 25 finished with value: -49.0184152543112 and parameters: {'embedding_dim': 343, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:29:06,215] Trial 26 finished with value: -1436.6956066386338 and parameters: {'embedding_dim': 233, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 512, 'discriminator_steps': 2}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:29:39,298] Trial 27 finished with value: -1622.8851329380343 and parameters: {'embedding_dim': 187, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 512, 'discriminator_steps': 1}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:31:10,397] Trial 28 finished with value: -610.6098245576701 and parameters: {'embedding_dim': 318, 'generator_dim': (256, 256), 'discriminator_dim': (256, 256), 'pac': 8, 'batch_size': 256, 'discriminator_steps': 2}. Best is trial 10 with value: -0.6514198871412.\n",
      "[I 2025-01-20 17:31:48,784] Trial 29 finished with value: -227.41157626188772 and parameters: {'embedding_dim': 233, 'generator_dim': (256, 256), 'discriminator_dim': (128, 128), 'pac': 4, 'batch_size': 1024, 'discriminator_steps': 3}. Best is trial 10 with value: -0.6514198871412.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Processed and saved: ../data/data_oversampled/ctgan_seoul.feather\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from imblearn.over_sampling import SMOTENC\n",
    "import optuna\n",
    "from ctgan import CTGAN\n",
    "import torch\n",
    "import warnings\n",
    "\n",
    "# ์ง€์—ญ๋ณ„ ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๊ฒฝ๋กœ\n",
    "regions = ['busan', 'daegu', 'daejeon', 'gwangju', 'incheon', 'seoul']\n",
    "file_paths = [f'../data/data_for_modeling/{region}_train.csv' for region in regions]\n",
    "output_paths = [f'../data/data_oversampled/ctgan20000_{region}.csv' for region in regions]\n",
    "\n",
    "# GPU ์‚ฌ์šฉ ์„ค์ •\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "print(f\"Using device: {device}\")\n",
    "\n",
    "# ๊ฒฝ๊ณ  ๋ฌด์‹œ\n",
    "warnings.filterwarnings(\"ignore\", category=UserWarning, module=\"optuna.distributions\")\n",
    "\n",
    "# ์ง€์—ญ๋ณ„ ์ฒ˜๋ฆฌ\n",
    "for file_path, output_path in zip(file_paths, output_paths):\n",
    "    # ๋ฐ์ดํ„ฐ ๋กœ๋“œ\n",
    "    data = pd.read_csv(file_path, index_col=0)\n",
    "    X = data.drop(columns=['multi_class', 'binary_class'])\n",
    "    y = data['multi_class']\n",
    "\n",
    "    # ๋ถˆํ•„์š”ํ•œ ์—ด ์ œ๊ฑฐ\n",
    "    X.drop(columns=['ground_temp - temp_C', 'hour_sin', 'hour_cos', 'month_sin', 'month_cos'], inplace=True)\n",
    "\n",
    "    # SMOTENC์—์„œ ์‚ฌ์šฉํ•  ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜ ์—ด ๋ฒˆํ˜ธ ์„ค์ •\n",
    "    categorical_features_indices = [i for i, dtype in enumerate(X.dtypes) if dtype != 'float64']\n",
    "\n",
    "    # sampling_strategy ์„ค์ •\n",
    "    count_class_0 = (y == 0).sum()\n",
    "    count_class_1 = (y == 1).sum()\n",
    "    count_class_2 = (y == 2).sum()\n",
    "    sampling_strategy = {\n",
    "        0: 500 if count_class_0 <= 500 else 1000,\n",
    "        1: int(np.ceil(count_class_1 / 100) * 100),  # ๋ฐฑ์˜ ์ž๋ฆฌ๋กœ ์˜ฌ๋ฆผ\n",
    "        2: count_class_2\n",
    "    }\n",
    "\n",
    "    # SMOTENC ์ ์šฉ\n",
    "    smotenc = SMOTENC(categorical_features=categorical_features_indices, sampling_strategy=sampling_strategy, random_state=42)\n",
    "    X_resampled, y_resampled = smotenc.fit_resample(X, y)\n",
    "\n",
    "    # Resampled ๋ฐ์ดํ„ฐ ์ƒ์„ฑ\n",
    "    lerp_data = X_resampled.copy()\n",
    "    lerp_data['multi_class'] = y_resampled\n",
    "\n",
    "    # CTGAN์—์„œ ์‚ฌ์šฉํ•  ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜ ์—ด ์ด๋ฆ„ ์„ค์ •\n",
    "    categorical_features = [\n",
    "        col for col, dtype in zip(lerp_data.columns, lerp_data.dtypes) if dtype != 'float64'\n",
    "    ]\n",
    "\n",
    "    # Optuna ๋ชฉ์  ํ•จ์ˆ˜ ์ •์˜\n",
    "    def objective(trial):\n",
    "        # ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํƒ์ƒ‰ ๋ฒ”์œ„ ์„ค์ •\n",
    "        embedding_dim = trial.suggest_int(\"embedding_dim\", 64, 128)\n",
    "        generator_dim = trial.suggest_categorical(\"generator_dim\", [(64, 64), (128, 128)])\n",
    "        discriminator_dim = trial.suggest_categorical(\"discriminator_dim\", [(64, 64), (128, 128)])\n",
    "        pac = trial.suggest_categorical(\"pac\", [4, 8])\n",
    "        batch_size = trial.suggest_categorical(\"batch_size\", [64, 128, 256])\n",
    "        discriminator_steps = trial.suggest_int(\"discriminator_steps\", 1, 3)\n",
    "\n",
    "        # CTGAN ๋ชจ๋ธ ์ƒ์„ฑ\n",
    "        ctgan = CTGAN(\n",
    "            embedding_dim=embedding_dim,\n",
    "            generator_dim=generator_dim,\n",
    "            discriminator_dim=discriminator_dim,\n",
    "            batch_size=batch_size,\n",
    "            discriminator_steps=discriminator_steps,\n",
    "            pac=pac\n",
    "        )\n",
    "\n",
    "        # ๋ฒ”์ฃผ 0 ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง\n",
    "        data_0 = lerp_data[lerp_data['multi_class'] == 0]\n",
    "\n",
    "        # ๋ชจ๋ธ ํ•™์Šต\n",
    "        ctgan.fit(data_0, discrete_columns=categorical_features)\n",
    "\n",
    "        # ์ƒ˜ํ”Œ ์ƒ์„ฑ\n",
    "        generated_data = ctgan.sample(len(data_0) * 2)\n",
    "\n",
    "        # ํ‰๊ฐ€: ์ƒ˜ํ”Œ์˜ ์—ฐ์†ํ˜• ๋ณ€์ˆ˜ ๋ถ„ํฌ ๋น„๊ต\n",
    "        real_visi = data_0['visi']\n",
    "        generated_visi = generated_data['visi']\n",
    "\n",
    "        # ๋ถ„ํฌ ๊ฐ„ ์ฐจ์ด(MSE) ๊ณ„์‚ฐ\n",
    "        mse = ((real_visi.mean() - generated_visi.mean())**2 + (real_visi.std() - generated_visi.std())**2)\n",
    "        return -mse\n",
    "\n",
    "    # Optuna๋กœ ์ตœ์ ํ™” ์ˆ˜ํ–‰\n",
    "    study = optuna.create_study(direction=\"maximize\")\n",
    "    study.optimize(objective, n_trials=50)\n",
    "\n",
    "    # ์ตœ์  ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์ถœ๋ ฅ\n",
    "    best_params = study.best_params\n",
    "\n",
    "    # ์ตœ์  ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋กœ CTGAN ํ•™์Šต ๋ฐ ์ƒ˜ํ”Œ ์ƒ์„ฑ\n",
    "    ctgan = CTGAN(\n",
    "        embedding_dim=best_params[\"embedding_dim\"],\n",
    "        generator_dim=best_params[\"generator_dim\"],\n",
    "        discriminator_dim=best_params[\"discriminator_dim\"],\n",
    "        batch_size=best_params[\"batch_size\"],\n",
    "        discriminator_steps=best_params[\"discriminator_steps\"],\n",
    "        pac=best_params[\"pac\"]\n",
    "    )\n",
    "\n",
    "    # ๋ฒ”์ฃผ 0 ๋ฐ์ดํ„ฐ๋กœ ์ตœ์ข… ํ•™์Šต\n",
    "    ctgan.fit(lerp_data[lerp_data['multi_class'] == 0], discrete_columns=categorical_features)\n",
    "    generated_0 = ctgan.sample(20000)\n",
    "\n",
    "    # ๋ฒ”์ฃผ 1 ๋ฐ์ดํ„ฐ ์ตœ์ ํ™” ๋ฐ ์ƒ์„ฑ\n",
    "    def objective_class1(trial):\n",
    "        embedding_dim = trial.suggest_int(\"embedding_dim\", 128, 512)\n",
    "        generator_dim = trial.suggest_categorical(\"generator_dim\", [(128, 128), (256, 256)])\n",
    "        discriminator_dim = trial.suggest_categorical(\"discriminator_dim\", [(128, 128), (256, 256)])\n",
    "        pac = trial.suggest_categorical(\"pac\", [4, 8])\n",
    "        batch_size = trial.suggest_categorical(\"batch_size\", [256, 512, 1024])\n",
    "        discriminator_steps = trial.suggest_int(\"discriminator_steps\", 1, 5)\n",
    "\n",
    "        ctgan = CTGAN(\n",
    "            embedding_dim=embedding_dim,\n",
    "            generator_dim=generator_dim,\n",
    "            discriminator_dim=discriminator_dim,\n",
    "            batch_size=batch_size,\n",
    "            discriminator_steps=discriminator_steps,\n",
    "            pac=pac\n",
    "        )\n",
    "\n",
    "        data_1 = lerp_data[lerp_data['multi_class'] == 1]\n",
    "        ctgan.fit(data_1, discrete_columns=categorical_features)\n",
    "        generated_data = ctgan.sample(len(data_1) * 2)\n",
    "\n",
    "        real_visi = data_1['visi']\n",
    "        generated_visi = generated_data['visi']\n",
    "        mse = ((real_visi.mean() - generated_visi.mean())**2 + (real_visi.std() - generated_visi.std())**2)\n",
    "        return -mse\n",
    "\n",
    "    study_class1 = optuna.create_study(direction=\"maximize\")\n",
    "    study_class1.optimize(objective_class1, n_trials=30)\n",
    "\n",
    "    best_params_class1 = study_class1.best_params\n",
    "    ctgan = CTGAN(\n",
    "        embedding_dim=best_params_class1[\"embedding_dim\"],\n",
    "        generator_dim=best_params_class1[\"generator_dim\"],\n",
    "        discriminator_dim=best_params_class1[\"discriminator_dim\"],\n",
    "        batch_size=best_params_class1[\"batch_size\"],\n",
    "        discriminator_steps=best_params_class1[\"discriminator_steps\"],\n",
    "        pac=best_params_class1[\"pac\"]\n",
    "    )\n",
    "\n",
    "    ctgan.fit(lerp_data[lerp_data['multi_class'] == 1], discrete_columns=categorical_features)\n",
    "    generated_1 = ctgan.sample(20000 - int(np.ceil(count_class_1 / 100) * 100))\n",
    "\n",
    "    # ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ ๋ฐ ์ €์žฅ\n",
    "    well_generated0 = generated_0[(generated_0['visi'] >= 0) & (generated_0['visi'] < 100)]\n",
    "    well_generated1 = generated_1[(generated_1['visi'] >= 100) & (generated_1['visi'] < 500)]\n",
    "    smote_gan_data = pd.concat([lerp_data, well_generated0, well_generated1], axis=0)\n",
    "    # ์ œ๊ฑฐ๋ณ€์ˆ˜ ๋ณต๊ตฌ\n",
    "    smote_gan_data['binary_class'] = smote_gan_data['multi_class'].apply(lambda x: 0 if x == 2 else 1)\n",
    "    smote_gan_data['hour_sin'] = np.sin(2 * np.pi * smote_gan_data['hour'] / 24)\n",
    "    smote_gan_data['hour_cos'] = np.cos(2 * np.pi * smote_gan_data['hour'] / 24)\n",
    "    smote_gan_data['month_sin'] = np.sin(2 * np.pi * smote_gan_data['month'] / 12)\n",
    "    smote_gan_data['month_cos'] = np.cos(2 * np.pi * smote_gan_data['month'] / 12)\n",
    "    smote_gan_data['ground_temp - temp_C'] = smote_gan_data['groundtemp'] - smote_gan_data['temp_C']\n",
    "\n",
    "    filtered_data = smote_gan_data[smote_gan_data['multi_class'] != 2]\n",
    "    original_class2 = data[data['multi_class'] == 2]\n",
    "    final_data = pd.concat([filtered_data, original_class2], axis=0)\n",
    "    final_data.reset_index(drop=True, inplace=True)\n",
    "\n",
    "    # ๊ฒฐ๊ณผ ์ €์žฅ\n",
    "    final_data.to_csv(output_path, index = False)\n",
    "    print(len(final_data[final_data['multi_class']==0]),'|',len(final_data[final_data['multi_class']==1]),'|',len(final_data[final_data['multi_class']==2]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### ์†Œ์ˆ˜๋ฒ”์ฃผ๋‹น ์ฆ๊ฐ• ๋ชฉํ‘œ 10000๊ฐœ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/root/miniconda3/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using device: cuda\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[I 2025-01-22 02:07:50,408] A new study created in memory with name: no-name-f35c7b28-3dae-4b56-9eb2-6e054e9a2682\n",
      "/root/miniconda3/lib/python3.12/site-packages/torch/autograd/graph.py:825: UserWarning: Attempting to run cuBLAS, but there was no current CUDA context! Attempting to set the primary context... (Triggered internally at ../aten/src/ATen/cuda/CublasHandlePool.cpp:135.)\n",
      "  return Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass\n",
      "[W 2025-01-22 02:07:55,487] Trial 0 failed with parameters: {'embedding_dim': 96, 'generator_dim': (64, 64), 'discriminator_dim': (64, 64), 'pac': 8, 'batch_size': 64, 'discriminator_steps': 2} because of the following error: KeyboardInterrupt().\n",
      "Traceback (most recent call last):\n",
      "  File \"/root/miniconda3/lib/python3.12/site-packages/optuna/study/_optimize.py\", line 197, in _run_trial\n",
      "    value_or_values = func(trial)\n",
      "                      ^^^^^^^^^^^\n",
      "  File \"/tmp/ipykernel_386644/1364079751.py\", line 81, in objective\n",
      "    ctgan.fit(data_0, discrete_columns=categorical_features)\n",
      "  File \"/root/miniconda3/lib/python3.12/site-packages/ctgan/synthesizers/base.py\", line 50, in wrapper\n",
      "    return function(self, *args, **kwargs)\n",
      "           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "  File \"/root/miniconda3/lib/python3.12/site-packages/ctgan/synthesizers/ctgan.py\", line 408, in fit\n",
      "    loss_d.backward()\n",
      "  File \"/root/miniconda3/lib/python3.12/site-packages/torch/_tensor.py\", line 581, in backward\n",
      "    torch.autograd.backward(\n",
      "  File \"/root/miniconda3/lib/python3.12/site-packages/torch/autograd/__init__.py\", line 347, in backward\n",
      "    _engine_run_backward(\n",
      "  File \"/root/miniconda3/lib/python3.12/site-packages/torch/autograd/graph.py\", line 825, in _engine_run_backward\n",
      "    return Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass\n",
      "           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
      "KeyboardInterrupt\n",
      "[W 2025-01-22 02:07:55,488] Trial 0 failed with value None.\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[1], line 96\u001b[0m\n\u001b[1;32m     94\u001b[0m \u001b[38;5;66;03m# Optuna๋กœ ์ตœ์ ํ™” ์ˆ˜ํ–‰\u001b[39;00m\n\u001b[1;32m     95\u001b[0m study \u001b[38;5;241m=\u001b[39m optuna\u001b[38;5;241m.\u001b[39mcreate_study(direction\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmaximize\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 96\u001b[0m \u001b[43mstudy\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptimize\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobjective\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn_trials\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m50\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m     98\u001b[0m \u001b[38;5;66;03m# ์ตœ์  ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์ถœ๋ ฅ\u001b[39;00m\n\u001b[1;32m     99\u001b[0m best_params \u001b[38;5;241m=\u001b[39m study\u001b[38;5;241m.\u001b[39mbest_params\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/optuna/study/study.py:475\u001b[0m, in \u001b[0;36mStudy.optimize\u001b[0;34m(self, func, n_trials, timeout, n_jobs, catch, callbacks, gc_after_trial, show_progress_bar)\u001b[0m\n\u001b[1;32m    373\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21moptimize\u001b[39m(\n\u001b[1;32m    374\u001b[0m     \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m    375\u001b[0m     func: ObjectiveFuncType,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    382\u001b[0m     show_progress_bar: \u001b[38;5;28mbool\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[1;32m    383\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    384\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"Optimize an objective function.\u001b[39;00m\n\u001b[1;32m    385\u001b[0m \n\u001b[1;32m    386\u001b[0m \u001b[38;5;124;03m    Optimization is done by choosing a suitable set of hyperparameter values from a given\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    473\u001b[0m \u001b[38;5;124;03m            If nested invocation of this method occurs.\u001b[39;00m\n\u001b[1;32m    474\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m--> 475\u001b[0m     \u001b[43m_optimize\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    476\u001b[0m \u001b[43m        \u001b[49m\u001b[43mstudy\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m    477\u001b[0m \u001b[43m        \u001b[49m\u001b[43mfunc\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    478\u001b[0m \u001b[43m        \u001b[49m\u001b[43mn_trials\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mn_trials\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    479\u001b[0m \u001b[43m        \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    480\u001b[0m \u001b[43m        \u001b[49m\u001b[43mn_jobs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mn_jobs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    481\u001b[0m \u001b[43m        \u001b[49m\u001b[43mcatch\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mcatch\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43misinstance\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mcatch\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mIterable\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43m(\u001b[49m\u001b[43mcatch\u001b[49m\u001b[43m,\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    482\u001b[0m \u001b[43m        \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcallbacks\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    483\u001b[0m \u001b[43m        \u001b[49m\u001b[43mgc_after_trial\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgc_after_trial\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    484\u001b[0m \u001b[43m        \u001b[49m\u001b[43mshow_progress_bar\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mshow_progress_bar\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    485\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/optuna/study/_optimize.py:63\u001b[0m, in \u001b[0;36m_optimize\u001b[0;34m(study, func, n_trials, timeout, n_jobs, catch, callbacks, gc_after_trial, show_progress_bar)\u001b[0m\n\u001b[1;32m     61\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m     62\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m n_jobs \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m---> 63\u001b[0m         \u001b[43m_optimize_sequential\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m     64\u001b[0m \u001b[43m            \u001b[49m\u001b[43mstudy\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     65\u001b[0m \u001b[43m            \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     66\u001b[0m \u001b[43m            \u001b[49m\u001b[43mn_trials\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     67\u001b[0m \u001b[43m            \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     68\u001b[0m \u001b[43m            \u001b[49m\u001b[43mcatch\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     69\u001b[0m \u001b[43m            \u001b[49m\u001b[43mcallbacks\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     70\u001b[0m \u001b[43m            \u001b[49m\u001b[43mgc_after_trial\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     71\u001b[0m \u001b[43m            \u001b[49m\u001b[43mreseed_sampler_rng\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m     72\u001b[0m \u001b[43m            \u001b[49m\u001b[43mtime_start\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m     73\u001b[0m \u001b[43m            \u001b[49m\u001b[43mprogress_bar\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mprogress_bar\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m     74\u001b[0m \u001b[43m        \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     75\u001b[0m     \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m     76\u001b[0m         \u001b[38;5;28;01mif\u001b[39;00m n_jobs \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m:\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/optuna/study/_optimize.py:160\u001b[0m, in \u001b[0;36m_optimize_sequential\u001b[0;34m(study, func, n_trials, timeout, catch, callbacks, gc_after_trial, reseed_sampler_rng, time_start, progress_bar)\u001b[0m\n\u001b[1;32m    157\u001b[0m         \u001b[38;5;28;01mbreak\u001b[39;00m\n\u001b[1;32m    159\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 160\u001b[0m     frozen_trial \u001b[38;5;241m=\u001b[39m \u001b[43m_run_trial\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstudy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcatch\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    161\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m    162\u001b[0m     \u001b[38;5;66;03m# The following line mitigates memory problems that can be occurred in some\u001b[39;00m\n\u001b[1;32m    163\u001b[0m     \u001b[38;5;66;03m# environments (e.g., services that use computing containers such as GitHub Actions).\u001b[39;00m\n\u001b[1;32m    164\u001b[0m     \u001b[38;5;66;03m# Please refer to the following PR for further details:\u001b[39;00m\n\u001b[1;32m    165\u001b[0m     \u001b[38;5;66;03m# https://github.com/optuna/optuna/pull/325.\u001b[39;00m\n\u001b[1;32m    166\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m gc_after_trial:\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/optuna/study/_optimize.py:248\u001b[0m, in \u001b[0;36m_run_trial\u001b[0;34m(study, func, catch)\u001b[0m\n\u001b[1;32m    241\u001b[0m         \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mShould not reach.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    243\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[1;32m    244\u001b[0m     frozen_trial\u001b[38;5;241m.\u001b[39mstate \u001b[38;5;241m==\u001b[39m TrialState\u001b[38;5;241m.\u001b[39mFAIL\n\u001b[1;32m    245\u001b[0m     \u001b[38;5;129;01mand\u001b[39;00m func_err \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m    246\u001b[0m     \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(func_err, catch)\n\u001b[1;32m    247\u001b[0m ):\n\u001b[0;32m--> 248\u001b[0m     \u001b[38;5;28;01mraise\u001b[39;00m func_err\n\u001b[1;32m    249\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m frozen_trial\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/optuna/study/_optimize.py:197\u001b[0m, in \u001b[0;36m_run_trial\u001b[0;34m(study, func, catch)\u001b[0m\n\u001b[1;32m    195\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m get_heartbeat_thread(trial\u001b[38;5;241m.\u001b[39m_trial_id, study\u001b[38;5;241m.\u001b[39m_storage):\n\u001b[1;32m    196\u001b[0m     \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 197\u001b[0m         value_or_values \u001b[38;5;241m=\u001b[39m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtrial\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    198\u001b[0m     \u001b[38;5;28;01mexcept\u001b[39;00m exceptions\u001b[38;5;241m.\u001b[39mTrialPruned \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m    199\u001b[0m         \u001b[38;5;66;03m# TODO(mamu): Handle multi-objective cases.\u001b[39;00m\n\u001b[1;32m    200\u001b[0m         state \u001b[38;5;241m=\u001b[39m TrialState\u001b[38;5;241m.\u001b[39mPRUNED\n",
      "Cell \u001b[0;32mIn[1], line 81\u001b[0m, in \u001b[0;36mobjective\u001b[0;34m(trial)\u001b[0m\n\u001b[1;32m     78\u001b[0m data_0 \u001b[38;5;241m=\u001b[39m lerp_data[lerp_data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmulti_class\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m     80\u001b[0m \u001b[38;5;66;03m# ๋ชจ๋ธ ํ•™์Šต\u001b[39;00m\n\u001b[0;32m---> 81\u001b[0m \u001b[43mctgan\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata_0\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdiscrete_columns\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcategorical_features\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     83\u001b[0m \u001b[38;5;66;03m# ์ƒ˜ํ”Œ ์ƒ์„ฑ\u001b[39;00m\n\u001b[1;32m     84\u001b[0m generated_data \u001b[38;5;241m=\u001b[39m ctgan\u001b[38;5;241m.\u001b[39msample(\u001b[38;5;28mlen\u001b[39m(data_0) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m2\u001b[39m)\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/ctgan/synthesizers/base.py:50\u001b[0m, in \u001b[0;36mrandom_state.<locals>.wrapper\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m     48\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwrapper\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m     49\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrandom_states \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m---> 50\u001b[0m         \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunction\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     52\u001b[0m     \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m     53\u001b[0m         \u001b[38;5;28;01mwith\u001b[39;00m set_random_states(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrandom_states, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset_random_state):\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/ctgan/synthesizers/ctgan.py:408\u001b[0m, in \u001b[0;36mCTGAN.fit\u001b[0;34m(self, train_data, discrete_columns, epochs)\u001b[0m\n\u001b[1;32m    406\u001b[0m     optimizerD\u001b[38;5;241m.\u001b[39mzero_grad(set_to_none\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n\u001b[1;32m    407\u001b[0m     pen\u001b[38;5;241m.\u001b[39mbackward(retain_graph\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m--> 408\u001b[0m     \u001b[43mloss_d\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    409\u001b[0m     optimizerD\u001b[38;5;241m.\u001b[39mstep()\n\u001b[1;32m    411\u001b[0m fakez \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mnormal(mean\u001b[38;5;241m=\u001b[39mmean, std\u001b[38;5;241m=\u001b[39mstd)\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/torch/_tensor.py:581\u001b[0m, in \u001b[0;36mTensor.backward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m    571\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_torch_function_unary(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m    572\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m handle_torch_function(\n\u001b[1;32m    573\u001b[0m         Tensor\u001b[38;5;241m.\u001b[39mbackward,\n\u001b[1;32m    574\u001b[0m         (\u001b[38;5;28mself\u001b[39m,),\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    579\u001b[0m         inputs\u001b[38;5;241m=\u001b[39minputs,\n\u001b[1;32m    580\u001b[0m     )\n\u001b[0;32m--> 581\u001b[0m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mautograd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    582\u001b[0m \u001b[43m    \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgradient\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs\u001b[49m\n\u001b[1;32m    583\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/torch/autograd/__init__.py:347\u001b[0m, in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m    342\u001b[0m     retain_graph \u001b[38;5;241m=\u001b[39m create_graph\n\u001b[1;32m    344\u001b[0m \u001b[38;5;66;03m# The reason we repeat the same comment below is that\u001b[39;00m\n\u001b[1;32m    345\u001b[0m \u001b[38;5;66;03m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[1;32m    346\u001b[0m \u001b[38;5;66;03m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[0;32m--> 347\u001b[0m \u001b[43m_engine_run_backward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    348\u001b[0m \u001b[43m    \u001b[49m\u001b[43mtensors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    349\u001b[0m \u001b[43m    \u001b[49m\u001b[43mgrad_tensors_\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    350\u001b[0m \u001b[43m    \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    351\u001b[0m \u001b[43m    \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    352\u001b[0m \u001b[43m    \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m    353\u001b[0m \u001b[43m    \u001b[49m\u001b[43mallow_unreachable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m    354\u001b[0m \u001b[43m    \u001b[49m\u001b[43maccumulate_grad\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m    355\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n",
      "File \u001b[0;32m~/miniconda3/lib/python3.12/site-packages/torch/autograd/graph.py:825\u001b[0m, in \u001b[0;36m_engine_run_backward\u001b[0;34m(t_outputs, *args, **kwargs)\u001b[0m\n\u001b[1;32m    823\u001b[0m     unregister_hooks \u001b[38;5;241m=\u001b[39m _register_logging_hooks_on_whole_graph(t_outputs)\n\u001b[1;32m    824\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 825\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mVariable\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_execution_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_backward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m  \u001b[49m\u001b[38;5;66;43;03m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[1;32m    826\u001b[0m \u001b[43m        \u001b[49m\u001b[43mt_outputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m    827\u001b[0m \u001b[43m    \u001b[49m\u001b[43m)\u001b[49m  \u001b[38;5;66;03m# Calls into the C++ engine to run the backward pass\u001b[39;00m\n\u001b[1;32m    828\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m    829\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m attach_logging_hooks:\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from imblearn.over_sampling import SMOTENC\n",
    "import optuna\n",
    "from ctgan import CTGAN\n",
    "import torch\n",
    "import warnings\n",
    "\n",
    "# ์ง€์—ญ๋ณ„ ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๊ฒฝ๋กœ\n",
    "regions = ['busan', 'daegu', 'daejeon', 'gwangju', 'incheon', 'seoul']\n",
    "file_paths = [f'../data/data_for_modeling/{region}_train.csv' for region in regions]\n",
    "output_paths = [f'../data/data_oversampled/ctgan10000_{region}.csv' for region in regions]\n",
    "\n",
    "# GPU ์‚ฌ์šฉ ์„ค์ •\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "print(f\"Using device: {device}\")\n",
    "\n",
    "# ๊ฒฝ๊ณ  ๋ฌด์‹œ\n",
    "warnings.filterwarnings(\"ignore\", category=UserWarning, module=\"optuna.distributions\")\n",
    "\n",
    "# ์ง€์—ญ๋ณ„ ์ฒ˜๋ฆฌ\n",
    "for file_path, output_path in zip(file_paths, output_paths):\n",
    "    # ๋ฐ์ดํ„ฐ ๋กœ๋“œ\n",
    "    data = pd.read_csv(file_path, index_col=0)\n",
    "    X = data.drop(columns=['multi_class', 'binary_class'])\n",
    "    y = data['multi_class']\n",
    "\n",
    "    # ๋ถˆํ•„์š”ํ•œ ์—ด ์ œ๊ฑฐ\n",
    "    X.drop(columns=['ground_temp - temp_C', 'hour_sin', 'hour_cos', 'month_sin', 'month_cos'], inplace=True)\n",
    "\n",
    "    # SMOTENC์—์„œ ์‚ฌ์šฉํ•  ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜ ์—ด ๋ฒˆํ˜ธ ์„ค์ •\n",
    "    categorical_features_indices = [i for i, dtype in enumerate(X.dtypes) if dtype != 'float64']\n",
    "\n",
    "    # sampling_strategy ์„ค์ •\n",
    "    count_class_0 = (y == 0).sum()\n",
    "    count_class_1 = (y == 1).sum()\n",
    "    count_class_2 = (y == 2).sum()\n",
    "    sampling_strategy = {\n",
    "        0: 500 if count_class_0 <= 500 else 1000,\n",
    "        1: int(np.ceil(count_class_1 / 100) * 100),  # ๋ฐฑ์˜ ์ž๋ฆฌ๋กœ ์˜ฌ๋ฆผ\n",
    "        2: count_class_2\n",
    "    }\n",
    "\n",
    "    # SMOTENC ์ ์šฉ\n",
    "    smotenc = SMOTENC(categorical_features=categorical_features_indices, sampling_strategy=sampling_strategy, random_state=42)\n",
    "    X_resampled, y_resampled = smotenc.fit_resample(X, y)\n",
    "\n",
    "    # Resampled ๋ฐ์ดํ„ฐ ์ƒ์„ฑ\n",
    "    lerp_data = X_resampled.copy()\n",
    "    lerp_data['multi_class'] = y_resampled\n",
    "\n",
    "    # CTGAN์—์„œ ์‚ฌ์šฉํ•  ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜ ์—ด ์ด๋ฆ„ ์„ค์ •\n",
    "    categorical_features = [\n",
    "        col for col, dtype in zip(lerp_data.columns, lerp_data.dtypes) if dtype != 'float64'\n",
    "    ]\n",
    "\n",
    "    # Optuna ๋ชฉ์  ํ•จ์ˆ˜ ์ •์˜\n",
    "    def objective(trial):\n",
    "        # ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํƒ์ƒ‰ ๋ฒ”์œ„ ์„ค์ •\n",
    "        embedding_dim = trial.suggest_int(\"embedding_dim\", 64, 128)\n",
    "        generator_dim = trial.suggest_categorical(\"generator_dim\", [(64, 64), (128, 128)])\n",
    "        discriminator_dim = trial.suggest_categorical(\"discriminator_dim\", [(64, 64), (128, 128)])\n",
    "        pac = trial.suggest_categorical(\"pac\", [4, 8])\n",
    "        batch_size = trial.suggest_categorical(\"batch_size\", [64, 128, 256])\n",
    "        discriminator_steps = trial.suggest_int(\"discriminator_steps\", 1, 3)\n",
    "\n",
    "        # CTGAN ๋ชจ๋ธ ์ƒ์„ฑ\n",
    "        ctgan = CTGAN(\n",
    "            embedding_dim=embedding_dim,\n",
    "            generator_dim=generator_dim,\n",
    "            discriminator_dim=discriminator_dim,\n",
    "            batch_size=batch_size,\n",
    "            discriminator_steps=discriminator_steps,\n",
    "            pac=pac\n",
    "        )\n",
    "\n",
    "        # ๋ฒ”์ฃผ 0 ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง\n",
    "        data_0 = lerp_data[lerp_data['multi_class'] == 0]\n",
    "\n",
    "        # ๋ชจ๋ธ ํ•™์Šต\n",
    "        ctgan.fit(data_0, discrete_columns=categorical_features)\n",
    "\n",
    "        # ์ƒ˜ํ”Œ ์ƒ์„ฑ\n",
    "        generated_data = ctgan.sample(len(data_0) * 2)\n",
    "\n",
    "        # ํ‰๊ฐ€: ์ƒ˜ํ”Œ์˜ ์—ฐ์†ํ˜• ๋ณ€์ˆ˜ ๋ถ„ํฌ ๋น„๊ต\n",
    "        real_visi = data_0['visi']\n",
    "        generated_visi = generated_data['visi']\n",
    "\n",
    "        # ๋ถ„ํฌ ๊ฐ„ ์ฐจ์ด(MSE) ๊ณ„์‚ฐ\n",
    "        mse = ((real_visi.mean() - generated_visi.mean())**2 + (real_visi.std() - generated_visi.std())**2)\n",
    "        return -mse\n",
    "\n",
    "    # Optuna๋กœ ์ตœ์ ํ™” ์ˆ˜ํ–‰\n",
    "    study = optuna.create_study(direction=\"maximize\")\n",
    "    study.optimize(objective, n_trials=50)\n",
    "\n",
    "    # ์ตœ์  ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์ถœ๋ ฅ\n",
    "    best_params = study.best_params\n",
    "\n",
    "    # ์ตœ์  ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋กœ CTGAN ํ•™์Šต ๋ฐ ์ƒ˜ํ”Œ ์ƒ์„ฑ\n",
    "    ctgan = CTGAN(\n",
    "        embedding_dim=best_params[\"embedding_dim\"],\n",
    "        generator_dim=best_params[\"generator_dim\"],\n",
    "        discriminator_dim=best_params[\"discriminator_dim\"],\n",
    "        batch_size=best_params[\"batch_size\"],\n",
    "        discriminator_steps=best_params[\"discriminator_steps\"],\n",
    "        pac=best_params[\"pac\"]\n",
    "    )\n",
    "\n",
    "    # ๋ฒ”์ฃผ 0 ๋ฐ์ดํ„ฐ๋กœ ์ตœ์ข… ํ•™์Šต\n",
    "    ctgan.fit(lerp_data[lerp_data['multi_class'] == 0], discrete_columns=categorical_features)\n",
    "    generated_0 = ctgan.sample(10000)\n",
    "\n",
    "    # ๋ฒ”์ฃผ 1 ๋ฐ์ดํ„ฐ ์ตœ์ ํ™” ๋ฐ ์ƒ์„ฑ\n",
    "    def objective_class1(trial):\n",
    "        embedding_dim = trial.suggest_int(\"embedding_dim\", 128, 512)\n",
    "        generator_dim = trial.suggest_categorical(\"generator_dim\", [(128, 128), (256, 256)])\n",
    "        discriminator_dim = trial.suggest_categorical(\"discriminator_dim\", [(128, 128), (256, 256)])\n",
    "        pac = trial.suggest_categorical(\"pac\", [4, 8])\n",
    "        batch_size = trial.suggest_categorical(\"batch_size\", [256, 512, 1024])\n",
    "        discriminator_steps = trial.suggest_int(\"discriminator_steps\", 1, 5)\n",
    "\n",
    "        ctgan = CTGAN(\n",
    "            embedding_dim=embedding_dim,\n",
    "            generator_dim=generator_dim,\n",
    "            discriminator_dim=discriminator_dim,\n",
    "            batch_size=batch_size,\n",
    "            discriminator_steps=discriminator_steps,\n",
    "            pac=pac\n",
    "        )\n",
    "\n",
    "        data_1 = lerp_data[lerp_data['multi_class'] == 1]\n",
    "        ctgan.fit(data_1, discrete_columns=categorical_features)\n",
    "        generated_data = ctgan.sample(len(data_1) * 2)\n",
    "\n",
    "        real_visi = data_1['visi']\n",
    "        generated_visi = generated_data['visi']\n",
    "        mse = ((real_visi.mean() - generated_visi.mean())**2 + (real_visi.std() - generated_visi.std())**2)\n",
    "        return -mse\n",
    "\n",
    "    study_class1 = optuna.create_study(direction=\"maximize\")\n",
    "    study_class1.optimize(objective_class1, n_trials=30)\n",
    "\n",
    "    best_params_class1 = study_class1.best_params\n",
    "    ctgan = CTGAN(\n",
    "        embedding_dim=best_params_class1[\"embedding_dim\"],\n",
    "        generator_dim=best_params_class1[\"generator_dim\"],\n",
    "        discriminator_dim=best_params_class1[\"discriminator_dim\"],\n",
    "        batch_size=best_params_class1[\"batch_size\"],\n",
    "        discriminator_steps=best_params_class1[\"discriminator_steps\"],\n",
    "        pac=best_params_class1[\"pac\"]\n",
    "    )\n",
    "\n",
    "    ctgan.fit(lerp_data[lerp_data['multi_class'] == 1], discrete_columns=categorical_features)\n",
    "    generated_1 = ctgan.sample(10000 - int(np.ceil(count_class_1 / 100) * 100))\n",
    "\n",
    "    # ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ ๋ฐ ์ €์žฅ\n",
    "    well_generated0 = generated_0[(generated_0['visi'] >= 0) & (generated_0['visi'] < 100)]\n",
    "    well_generated1 = generated_1[(generated_1['visi'] >= 100) & (generated_1['visi'] < 500)]\n",
    "    smote_gan_data = pd.concat([lerp_data, well_generated0, well_generated1], axis=0)\n",
    "    # ์ œ๊ฑฐ๋ณ€์ˆ˜ ๋ณต๊ตฌ\n",
    "    smote_gan_data['binary_class'] = smote_gan_data['multi_class'].apply(lambda x: 0 if x == 2 else 1)\n",
    "    smote_gan_data['hour_sin'] = np.sin(2 * np.pi * smote_gan_data['hour'] / 24)\n",
    "    smote_gan_data['hour_cos'] = np.cos(2 * np.pi * smote_gan_data['hour'] / 24)\n",
    "    smote_gan_data['month_sin'] = np.sin(2 * np.pi * smote_gan_data['month'] / 12)\n",
    "    smote_gan_data['month_cos'] = np.cos(2 * np.pi * smote_gan_data['month'] / 12)\n",
    "    smote_gan_data['ground_temp - temp_C'] = smote_gan_data['groundtemp'] - smote_gan_data['temp_C']\n",
    "\n",
    "    filtered_data = smote_gan_data[smote_gan_data['multi_class'] != 2]\n",
    "    original_class2 = data[data['multi_class'] == 2]\n",
    "    final_data = pd.concat([filtered_data, original_class2], axis=0)\n",
    "    final_data.reset_index(drop=True, inplace=True)\n",
    "\n",
    "    # ๊ฒฐ๊ณผ ์ €์žฅ\n",
    "    final_data.to_csv(output_path, index = False)\n",
    "    print(len(final_data[final_data['multi_class']==0]),'|',len(final_data[final_data['multi_class']==1]),'|',len(final_data[final_data['multi_class']==2]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### ์†Œ์ˆ˜๋ฒ”์ฃผ๋‹น ์ฆ๊ฐ• ๋ชฉํ‘œ 7000๊ฐœ"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from imblearn.over_sampling import SMOTENC\n",
    "import optuna\n",
    "from ctgan import CTGAN\n",
    "import torch\n",
    "import warnings\n",
    "\n",
    "# ์ง€์—ญ๋ณ„ ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๊ฒฝ๋กœ\n",
    "regions = ['busan', 'daegu', 'daejeon', 'gwangju', 'incheon', 'seoul']\n",
    "file_paths = [f'../data/data_for_modeling/{region}_train.csv' for region in regions]\n",
    "output_paths = [f'../data/data_oversampled/ctgan7000_{region}.csv' for region in regions]\n",
    "\n",
    "# GPU ์‚ฌ์šฉ ์„ค์ •\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "print(f\"Using device: {device}\")\n",
    "\n",
    "# ๊ฒฝ๊ณ  ๋ฌด์‹œ\n",
    "warnings.filterwarnings(\"ignore\", category=UserWarning, module=\"optuna.distributions\")\n",
    "\n",
    "# ์ง€์—ญ๋ณ„ ์ฒ˜๋ฆฌ\n",
    "for file_path, output_path in zip(file_paths, output_paths):\n",
    "    # ๋ฐ์ดํ„ฐ ๋กœ๋“œ\n",
    "    data = pd.read_csv(file_path, index_col=0)\n",
    "    X = data.drop(columns=['multi_class', 'binary_class'])\n",
    "    y = data['multi_class']\n",
    "\n",
    "    # ๋ถˆํ•„์š”ํ•œ ์—ด ์ œ๊ฑฐ\n",
    "    X.drop(columns=['ground_temp - temp_C', 'hour_sin', 'hour_cos', 'month_sin', 'month_cos'], inplace=True)\n",
    "\n",
    "    # SMOTENC์—์„œ ์‚ฌ์šฉํ•  ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜ ์—ด ๋ฒˆํ˜ธ ์„ค์ •\n",
    "    categorical_features_indices = [i for i, dtype in enumerate(X.dtypes) if dtype != 'float64']\n",
    "\n",
    "    # sampling_strategy ์„ค์ •\n",
    "    count_class_0 = (y == 0).sum()\n",
    "    count_class_1 = (y == 1).sum()\n",
    "    count_class_2 = (y == 2).sum()\n",
    "    sampling_strategy = {\n",
    "        0: 500 if count_class_0 <= 500 else 1000,\n",
    "        1: int(np.ceil(count_class_1 / 100) * 100),  # ๋ฐฑ์˜ ์ž๋ฆฌ๋กœ ์˜ฌ๋ฆผ\n",
    "        2: count_class_2\n",
    "    }\n",
    "\n",
    "    # SMOTENC ์ ์šฉ\n",
    "    smotenc = SMOTENC(categorical_features=categorical_features_indices, sampling_strategy=sampling_strategy, random_state=42)\n",
    "    X_resampled, y_resampled = smotenc.fit_resample(X, y)\n",
    "\n",
    "    # Resampled ๋ฐ์ดํ„ฐ ์ƒ์„ฑ\n",
    "    lerp_data = X_resampled.copy()\n",
    "    lerp_data['multi_class'] = y_resampled\n",
    "\n",
    "    # CTGAN์—์„œ ์‚ฌ์šฉํ•  ๋ฒ”์ฃผํ˜• ๋ณ€์ˆ˜ ์—ด ์ด๋ฆ„ ์„ค์ •\n",
    "    categorical_features = [\n",
    "        col for col, dtype in zip(lerp_data.columns, lerp_data.dtypes) if dtype != 'float64'\n",
    "    ]\n",
    "\n",
    "    # Optuna ๋ชฉ์  ํ•จ์ˆ˜ ์ •์˜\n",
    "    def objective(trial):\n",
    "        # ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํƒ์ƒ‰ ๋ฒ”์œ„ ์„ค์ •\n",
    "        embedding_dim = trial.suggest_int(\"embedding_dim\", 64, 128)\n",
    "        generator_dim = trial.suggest_categorical(\"generator_dim\", [(64, 64), (128, 128)])\n",
    "        discriminator_dim = trial.suggest_categorical(\"discriminator_dim\", [(64, 64), (128, 128)])\n",
    "        pac = trial.suggest_categorical(\"pac\", [4, 8])\n",
    "        batch_size = trial.suggest_categorical(\"batch_size\", [64, 128, 256])\n",
    "        discriminator_steps = trial.suggest_int(\"discriminator_steps\", 1, 3)\n",
    "\n",
    "        # CTGAN ๋ชจ๋ธ ์ƒ์„ฑ\n",
    "        ctgan = CTGAN(\n",
    "            embedding_dim=embedding_dim,\n",
    "            generator_dim=generator_dim,\n",
    "            discriminator_dim=discriminator_dim,\n",
    "            batch_size=batch_size,\n",
    "            discriminator_steps=discriminator_steps,\n",
    "            pac=pac\n",
    "        )\n",
    "\n",
    "        # ๋ฒ”์ฃผ 0 ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง\n",
    "        data_0 = lerp_data[lerp_data['multi_class'] == 0]\n",
    "\n",
    "        # ๋ชจ๋ธ ํ•™์Šต\n",
    "        ctgan.fit(data_0, discrete_columns=categorical_features)\n",
    "\n",
    "        # ์ƒ˜ํ”Œ ์ƒ์„ฑ\n",
    "        generated_data = ctgan.sample(len(data_0) * 2)\n",
    "\n",
    "        # ํ‰๊ฐ€: ์ƒ˜ํ”Œ์˜ ์—ฐ์†ํ˜• ๋ณ€์ˆ˜ ๋ถ„ํฌ ๋น„๊ต\n",
    "        real_visi = data_0['visi']\n",
    "        generated_visi = generated_data['visi']\n",
    "\n",
    "        # ๋ถ„ํฌ ๊ฐ„ ์ฐจ์ด(MSE) ๊ณ„์‚ฐ\n",
    "        mse = ((real_visi.mean() - generated_visi.mean())**2 + (real_visi.std() - generated_visi.std())**2)\n",
    "        return -mse\n",
    "\n",
    "    # Optuna๋กœ ์ตœ์ ํ™” ์ˆ˜ํ–‰\n",
    "    study = optuna.create_study(direction=\"maximize\")\n",
    "    study.optimize(objective, n_trials=50)\n",
    "\n",
    "    # ์ตœ์  ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์ถœ๋ ฅ\n",
    "    best_params = study.best_params\n",
    "\n",
    "    # ์ตœ์  ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋กœ CTGAN ํ•™์Šต ๋ฐ ์ƒ˜ํ”Œ ์ƒ์„ฑ\n",
    "    ctgan = CTGAN(\n",
    "        embedding_dim=best_params[\"embedding_dim\"],\n",
    "        generator_dim=best_params[\"generator_dim\"],\n",
    "        discriminator_dim=best_params[\"discriminator_dim\"],\n",
    "        batch_size=best_params[\"batch_size\"],\n",
    "        discriminator_steps=best_params[\"discriminator_steps\"],\n",
    "        pac=best_params[\"pac\"]\n",
    "    )\n",
    "\n",
    "    # ๋ฒ”์ฃผ 0 ๋ฐ์ดํ„ฐ๋กœ ์ตœ์ข… ํ•™์Šต\n",
    "    ctgan.fit(lerp_data[lerp_data['multi_class'] == 0], discrete_columns=categorical_features)\n",
    "    generated_0 = ctgan.sample(7000)\n",
    "\n",
    "    # ๋ฒ”์ฃผ 1 ๋ฐ์ดํ„ฐ ์ตœ์ ํ™” ๋ฐ ์ƒ์„ฑ\n",
    "    def objective_class1(trial):\n",
    "        embedding_dim = trial.suggest_int(\"embedding_dim\", 128, 512)\n",
    "        generator_dim = trial.suggest_categorical(\"generator_dim\", [(128, 128), (256, 256)])\n",
    "        discriminator_dim = trial.suggest_categorical(\"discriminator_dim\", [(128, 128), (256, 256)])\n",
    "        pac = trial.suggest_categorical(\"pac\", [4, 8])\n",
    "        batch_size = trial.suggest_categorical(\"batch_size\", [256, 512, 1024])\n",
    "        discriminator_steps = trial.suggest_int(\"discriminator_steps\", 1, 5)\n",
    "\n",
    "        ctgan = CTGAN(\n",
    "            embedding_dim=embedding_dim,\n",
    "            generator_dim=generator_dim,\n",
    "            discriminator_dim=discriminator_dim,\n",
    "            batch_size=batch_size,\n",
    "            discriminator_steps=discriminator_steps,\n",
    "            pac=pac\n",
    "        )\n",
    "\n",
    "        data_1 = lerp_data[lerp_data['multi_class'] == 1]\n",
    "        ctgan.fit(data_1, discrete_columns=categorical_features)\n",
    "        generated_data = ctgan.sample(len(data_1) * 2)\n",
    "\n",
    "        real_visi = data_1['visi']\n",
    "        generated_visi = generated_data['visi']\n",
    "        mse = ((real_visi.mean() - generated_visi.mean())**2 + (real_visi.std() - generated_visi.std())**2)\n",
    "        return -mse\n",
    "\n",
    "    study_class1 = optuna.create_study(direction=\"maximize\")\n",
    "    study_class1.optimize(objective_class1, n_trials=30)\n",
    "\n",
    "    best_params_class1 = study_class1.best_params\n",
    "    ctgan = CTGAN(\n",
    "        embedding_dim=best_params_class1[\"embedding_dim\"],\n",
    "        generator_dim=best_params_class1[\"generator_dim\"],\n",
    "        discriminator_dim=best_params_class1[\"discriminator_dim\"],\n",
    "        batch_size=best_params_class1[\"batch_size\"],\n",
    "        discriminator_steps=best_params_class1[\"discriminator_steps\"],\n",
    "        pac=best_params_class1[\"pac\"]\n",
    "    )\n",
    "\n",
    "    ctgan.fit(lerp_data[lerp_data['multi_class'] == 1], discrete_columns=categorical_features)\n",
    "    generated_1 = ctgan.sample(7000 - int(np.ceil(count_class_1 / 100) * 100))\n",
    "\n",
    "    # ๋ฐ์ดํ„ฐ ๋ณ‘ํ•ฉ ๋ฐ ์ €์žฅ\n",
    "    well_generated0 = generated_0[(generated_0['visi'] >= 0) & (generated_0['visi'] < 100)]\n",
    "    well_generated1 = generated_1[(generated_1['visi'] >= 100) & (generated_1['visi'] < 500)]\n",
    "    smote_gan_data = pd.concat([lerp_data, well_generated0, well_generated1], axis=0)\n",
    "    # ์ œ๊ฑฐ๋ณ€์ˆ˜ ๋ณต๊ตฌ\n",
    "    smote_gan_data['binary_class'] = smote_gan_data['multi_class'].apply(lambda x: 0 if x == 2 else 1)\n",
    "    smote_gan_data['hour_sin'] = np.sin(2 * np.pi * smote_gan_data['hour'] / 24)\n",
    "    smote_gan_data['hour_cos'] = np.cos(2 * np.pi * smote_gan_data['hour'] / 24)\n",
    "    smote_gan_data['month_sin'] = np.sin(2 * np.pi * smote_gan_data['month'] / 12)\n",
    "    smote_gan_data['month_cos'] = np.cos(2 * np.pi * smote_gan_data['month'] / 12)\n",
    "    smote_gan_data['ground_temp - temp_C'] = smote_gan_data['groundtemp'] - smote_gan_data['temp_C']\n",
    "\n",
    "    filtered_data = smote_gan_data[smote_gan_data['multi_class'] != 2]\n",
    "    original_class2 = data[data['multi_class'] == 2]\n",
    "    final_data = pd.concat([filtered_data, original_class2], axis=0)\n",
    "    final_data.reset_index(drop=True, inplace=True)\n",
    "\n",
    "    # ๊ฒฐ๊ณผ ์ €์žฅ\n",
    "    final_data.to_csv(output_path, index = False)\n",
    "    print(len(final_data[final_data['multi_class']==0]),'|',len(final_data[final_data['multi_class']==1]),'|',len(final_data[final_data['multi_class']==2]))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}