Fraud Machine Learning Modelling을 돕기 위한 합성 데이터
합성 데이터는 fraud cases를 완하하는데 도움을 줄 수 있습니다
Fraud cases는 모든 비즈니스 산업에서 일반적이며 막대한 재정적 손실을 초래합니다. 작든 크든, 좋든 싫든 모든 기업은 사기 문제에 직면하게 됩니다.
Fraud problem을 완화하기 위해 machine learning fraud detection 연구에 많은 노력을 기울였지만, 아직 완벽한 솔루션은 없습니다. 비즈니스마다 요구 사항이 다르고 데이터가 끊임없이 진화하고 있기 때문입니다.
완벽한 솔루션은 없지만 모델을 개선할 수 있는 몇 가지 방법이 있습니다. 솔루션 중 하나는 합성 데이터를 사용하는 것입니다. 합성 데이터란 무엇이며 fraud detection에 어떻게 도움이 될까요?
이제 시작해봅시다.
Synthetic Data
합성 데이터는 컴퓨터 기술을 통해 생성된 데이터로 현실 세계에는 존재하지 않습니다. 즉, 합성 데이터는 직접 수집하지 않고, 생성된 데이터로 정의할 수 있습니다.
합성 데이터는 데이터 세계에서 새로운 것이 아닙니다. 그러나 기술이 발전함에 따라 합성 데이터는 더욱 중요해지고 다양한 산업에 영향을 미치고 있습니다. 왜 이런 영향을 미치게 되었는지, 데이터 과학 세계에서 합성 데이터의 여러 application을 살펴보겠습니다:
-
데이터 수집 노력 없이 방대한 양의 데이터 생성
-
실제 상황을 반영하는 데이터 세트 생성
-
데이터 사용 개인 정보 보호
-
아직 발생하지 않은 조건에서의 시뮬레이션
-
데이터 imbalance 완화
합성 데이터에 대한 연구가 아직 진행 중이기 때문에 리스트는 계속 늘어날 것입니다. 요점은 합성 데이터가 데이터 과학에 도움이 되고 업계에 영향을 미친다는 것입니다.
또한, 합성 데이터는 데이터가 생성되고 저장되는 방식에 따라 분류될 수 있습니다. 분류는 다음과 같습니다:
-
Full Synthetic Data: 원본 데이터를 기반으로 했지만, 원본 데이터를 포함하지 않았습니다. 데이터 세트에는 합성 데이터만 포함되지만, 원본 데이터와 유사한 속성을 지니고 있습니다.
-
Partial Synthetic Data: variable 수준에서 원본 및 합성 데이터의 조합. 이 category는 민감한 데이터와 같은 특정 변수를 합성 변수로 대체하려는 경우에 자주 사용됩니다.
-
Hybrid Synthetic Data: 데이터 생성은 실제 데이터와 합성 데이터 모두에서 이뤄집니다. variable 사이의 기본 분포와 관계는 그대로지만, 데이터 세트에는 원본 데이터와 합성 데이터가 모두 포함됩니다.
지금까지 합성 데이터와 그 유용성에 대해 배웠지만, fraud machine learning 개발에 어떻게 도움이 될 수 있을까요? 한발 물러서서 fraud 데이터 세트의 일반적인 사례를 살펴봐야 합니다.
Fraud Modelling
Fradu 방지 data science 프로젝트의 성공은 비즈니스 전략과 fraud 모델의 두 가지 요소에 달려 있습니다.
앞서 언급했듯이 fraud 사건은 거의 발생하지 않지만, 각 사건은 많은 손실을 초래할 수 있습니다. 이는 fraud 모델링에 imbalance data case를 맞이하게 된다는 것입니다.
연구에 따르면, 합성 데이터는 소수 데이터를 oversampling하고 balanced 데이터 세트를 생성하여 imbalance 문제를 완화하는 데 도움이 될 수 있습니다. 예를 들어, paper by Dina et al. (2022)은 CTGAN에 의해 생성된 합성 데이터는 imbalanced 데이터에 대해 훈련된 동일한 ML 모델에 비해 정확도가 8% 향상되었음을 보여줍니다.
합성 데이터 밸런싱을 위한 가장 유명한 전략은 SMOTE이지만, 이 기술은 복잡한 데이터에서 거의 이점을 제공하지 않습니다. 이것이 ML 성능을 높이는 데 도움이 되는 것으로 입증된 GAN 모델을 주로 사용하여 데이터 합성을 위한 다른 접근 방식을 시도하는 이유입니다.
합성 데이터는 장점이 있지만, 연구가 시작된지는 아직 얼마되지 않았기 때문에 합성 데이터를 모델링 프로세스에 적용할 때 다음과 같은 단점에 유의하세요:
-
데이터 복잡성이 증가하면, 생성된 합성 데이터가 실제 population을 나타내지 않을 수 있습니다. 이렇게 하면 모델이 잘못된 insights을 배우고 잘못된 예측을 하게 됩니다.
-
합성 데이터 quality는 데이터 생성에 사용된 데이터 세트에 따라 다릅니다. 잘못된 원본 데이터는 잘못된 합성 데이터를 생성하여 모델의 output이 부정확합니다.
모델링에 합성 데이터를 사용할 때의 위험성과 약점을 이해했다면, imbalanced 데이터가 fraud에 어떻게 도움이 되는지 직접 접근해 보겠습니다.
Develop a Fraud Model Detection
이 예에서는 Shivam Bansal이 Kaggle에서 제공하는 ‘Vehicle Insurance Claim Fraud Detection’ 데이터 세트를 사용합니다. 이 데이터 세트에는 claim에 대해 사기를 저지를 고객을 감지하는 비즈니스 문제를 가지고 있습니다.
import pandas as pd
from pandas_profiling import ProfileReport
df = pd.read_csv("fraud_oracle.csv")
profile = ProfileReport(df)
전반적으로, 약 33개의 변수와 15420개의 관측치가 있으며 대부분의 데이터는 범주형입니다. 누락된 데이터가 없으므로 누락된 데이터를 처리할 필요가 없습니다. 분포를 보기 위해 변수 target을 확인해봅시다.
위의 summary에서 알 수 있듯이 target ‘FraudFound’의 imbalance가 심각합니다. fraud가 아닌 데이터와 비교하여 6%의 데이터(923개의 관측치)만이 fraud였습니다.
다음 파트에서는 차량 보험 사기를 예측하는 분류기 모델을 구축해 보겠습니다. 모든 데이터 세트를 사용하지 않고, training 목적으로 일부 categorical encoding을 수행합니다.
df = df[['AccidentArea', 'Sex', 'MaritalStatus', 'Age', 'Fault', 'PolicyType',
'VehicleCategory', 'VehiclePrice', 'Deductible', 'DriverRating',
'Days_Policy_Accident','Days_Policy_Claim','PastNumberOfClaims',
'AgeOfVehicle','BasePolicy', 'FraudFound_P']]
df = pd.get_dummies(df, columns=df.select_dtypes("object").columns,
drop_first=True)
Data cleaning 후, 모델을 훈련시킵니다.
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
X_train, X_test, y_train, y_test = train_test_split(df.drop("FraudFound_P", axis=1),
df["FraudFound_P"],
train_size=0.7,
stratify=df["FraudFound_P"], # 데이터 비율 유지
random_state=100)
model = RandomForestClassifier(random_state=100)
model.fit(X_train, y_train)
RandomForestClassifier(random_state=100)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
RandomForestClassifier(random_state=100)
RandomForest를 사용하여 fraud 모델의 성능을 평가해 봅니다.
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
precision recall f1-score support
0 0.94 0.98 0.96 4349
1 0.14 0.04 0.07 277
accuracy 0.93 4626
macro avg 0.54 0.51 0.51 4626
weighted avg 0.89 0.93 0.91 4626
위의 결과에서 알 수 있듯이 대부분의 예측은 fraud가 아닌 경우를 예측합니다. 이 아티클에서는 이미 이러한 경우를 예상했으므로 추가 합성 데이터를 사용하여 모델 성능을 높이려고 합니다.
먼저 패키지를 설치해야 합니다. ydata-synthetic 패키지에서 가져온 모델을 사용하여 작업을 더 쉽게 만들 것입니다. 이 예에서는 Conditional Wassertein GAN with Gradient Penalty (CWGAN-GP) 모델을 사용하여 합성 데이터를 생성합니다. 이 모델은 데이터 세트의 balance를 맞추는 데 적합합니다.
# !pip install ydata-synthetic
설치 후, CWGAN-GP 모델이 학습할 데이터 세트를 설정합니다. 또한 분할한 train 데이터를 기반으로 합성 데이터를 생성합니다. 그 이유는 테스트 데이터 세트에 합성 데이터를 포함하여 data leaks을 피하고 싶기 때문입니다.
X_train_synth = X_train.copy()
X_train_synth['FraudFound_P'] = y_train
모델에 소수의 데이터만 synthesizer에 훈련시키고 싶기 때문에, fraud cases인 경우만 데이터 세트로 선택합니다.
X_train_synth_min = X_train_synth[X_train_synth["FraudFound_P"] == 1].copy()
다음 단계는 CWGAN-GP 모델의 개발입니다. parameter를 지정합니다
from ydata_synthetic.synthesizers.regular import cwgangp
from ydata_synthetic.synthesizers import ModelParameters, TrainParameters
synth_model = cwgangp.model.CWGANGP
# parameter
noise_dim = 61
dim = 128
batch_size = 128
log_step = 100
epochs = 200
learning_rate = 5e-4
beta_1 = 0.5
beta_2 = 0.9
models_dir = './cache'
gan_args = ModelParameters(batch_size=batch_size, lr=learning_rate, betas=(beta_1, beta_2),
noise_dim=noise_dim, layers_dim=dim)
train_args = TrainParameters(epochs=epochs, sample_interval=log_step)
synthesizer = synth_model(gan_args, n_critic=10)
모델을 학습시키기 위해 어떤 칼럼이 numerical인지 categorical인지 결정해야 합니다. 이 예에서는 모든 칼럼을 numerical로 취급합니다.
synthesizer.fit(data=X_train_synth_min, train_arguments=train_args,
num_cols=list(X_train_synth_min.drop('FraudFound_P', axis=1).columns),
cat_cols=[], label_cols=['FraudFound_P'])
0%| | 0/200 [00:00<?, ?it/s]
Number of iterations per epoch: 6
0%|▍ | 1/200 [00:07<24:42, 7.45s/it]
Epoch: 0 | critic_loss: -0.18840967118740082 | gen_loss: 0.03733024373650551
1%|▊ | 2/200 [00:07<10:35, 3.21s/it]
Epoch: 1 | critic_loss: -0.06161585450172424 | gen_loss: 0.08629059791564941
2%|█▏ | 3/200 [00:07<06:06, 1.86s/it]
Epoch: 2 | critic_loss: -0.2222920060157776 | gen_loss: 0.13438183069229126
2%|█▋ | 4/200 [00:08<04:00, 1.23s/it]
Epoch: 3 | critic_loss: -0.18035899102687836 | gen_loss: 0.15498244762420654
2%|██ | 5/200 [00:08<02:49, 1.15it/s]
Epoch: 4 | critic_loss: -0.15652552247047424 | gen_loss: 0.18586257100105286
3%|██▍ | 6/200 [00:08<02:07, 1.52it/s]
Epoch: 5 | critic_loss: -0.16978693008422852 | gen_loss: 0.19723007082939148
4%|██▊ | 7/200 [00:08<01:40, 1.92it/s]
Epoch: 6 | critic_loss: -0.058145806193351746 | gen_loss: 0.22440189123153687
4%|███▎ | 8/200 [00:09<01:23, 2.30it/s]
Epoch: 7 | critic_loss: -0.031163856387138367 | gen_loss: 0.228996142745018
4%|███▋ | 9/200 [00:09<01:13, 2.61it/s]
Epoch: 8 | critic_loss: -0.04187111556529999 | gen_loss: 0.22223684191703796
5%|████ | 10/200 [00:09<01:06, 2.86it/s]
Epoch: 9 | critic_loss: -0.12917296588420868 | gen_loss: 0.23300811648368835
6%|████▍ | 11/200 [00:09<01:01, 3.05it/s]
Epoch: 10 | critic_loss: -0.14195621013641357 | gen_loss: 0.2642074227333069
6%|████▊ | 12/200 [00:10<00:58, 3.20it/s]
Epoch: 11 | critic_loss: -0.18270359933376312 | gen_loss: 0.2693111300468445
6%|█████▎ | 13/200 [00:10<00:56, 3.31it/s]
Epoch: 12 | critic_loss: -0.15068601071834564 | gen_loss: 0.26711422204971313
7%|█████▋ | 14/200 [00:10<00:54, 3.38it/s]
Epoch: 13 | critic_loss: -0.17398734390735626 | gen_loss: 0.2810978293418884
8%|██████ | 15/200 [00:11<00:53, 3.44it/s]
Epoch: 14 | critic_loss: -0.17138810455799103 | gen_loss: 0.28365975618362427
8%|██████▍ | 16/200 [00:11<00:53, 3.43it/s]
Epoch: 15 | critic_loss: -0.17812904715538025 | gen_loss: 0.25822219252586365
8%|██████▉ | 17/200 [00:11<00:52, 3.48it/s]
Epoch: 16 | critic_loss: -0.17729909718036652 | gen_loss: 0.30871883034706116
9%|███████▎ | 18/200 [00:11<00:51, 3.51it/s]
Epoch: 17 | critic_loss: -0.17693321406841278 | gen_loss: 0.3022943139076233
10%|███████▋ | 19/200 [00:12<00:51, 3.50it/s]
Epoch: 18 | critic_loss: -0.01916174590587616 | gen_loss: 0.31317105889320374
10%|████████ | 20/200 [00:12<00:51, 3.51it/s]
Epoch: 19 | critic_loss: -0.16351042687892914 | gen_loss: 0.35547035932540894
10%|████████▌ | 21/200 [00:12<00:50, 3.51it/s]
Epoch: 20 | critic_loss: -0.18230712413787842 | gen_loss: 0.32079052925109863
11%|████████▉ | 22/200 [00:13<00:52, 3.42it/s]
Epoch: 21 | critic_loss: -0.19166556000709534 | gen_loss: 0.30292344093322754
12%|█████████▎ | 23/200 [00:13<00:53, 3.33it/s]
Epoch: 22 | critic_loss: -0.1864338517189026 | gen_loss: 0.3262517750263214
12%|█████████▋ | 24/200 [00:13<00:52, 3.34it/s]
Epoch: 23 | critic_loss: -0.16972339153289795 | gen_loss: 0.3279057443141937
12%|██████████▏ | 25/200 [00:14<00:51, 3.37it/s]
Epoch: 24 | critic_loss: -0.19312818348407745 | gen_loss: 0.3238387405872345
13%|██████████▌ | 26/200 [00:14<00:51, 3.40it/s]
Epoch: 25 | critic_loss: -0.1822628229856491 | gen_loss: 0.34720057249069214
14%|██████████▉ | 27/200 [00:14<00:50, 3.43it/s]
Epoch: 26 | critic_loss: -0.16222897171974182 | gen_loss: 0.3588358461856842
14%|███████████▎ | 28/200 [00:14<00:50, 3.39it/s]
Epoch: 27 | critic_loss: -0.20526570081710815 | gen_loss: 0.2955209016799927
14%|███████████▋ | 29/200 [00:15<00:50, 3.41it/s]
Epoch: 28 | critic_loss: -0.22017785906791687 | gen_loss: 0.32519829273223877
15%|████████████▏ | 30/200 [00:15<00:49, 3.45it/s]
Epoch: 29 | critic_loss: -0.028029561042785645 | gen_loss: 0.33196333050727844
16%|████████████▌ | 31/200 [00:15<00:48, 3.47it/s]
Epoch: 30 | critic_loss: -0.18671752512454987 | gen_loss: 0.32129910588264465
16%|████████████▉ | 32/200 [00:16<00:48, 3.48it/s]
Epoch: 31 | critic_loss: -0.20709607005119324 | gen_loss: 0.32487213611602783
16%|█████████████▎ | 33/200 [00:16<00:48, 3.48it/s]
Epoch: 32 | critic_loss: -0.21102604269981384 | gen_loss: 0.3262215852737427
17%|█████████████▊ | 34/200 [00:16<00:47, 3.48it/s]
Epoch: 33 | critic_loss: -0.20651109516620636 | gen_loss: 0.3222775161266327
18%|██████████████▏ | 35/200 [00:16<00:48, 3.43it/s]
Epoch: 34 | critic_loss: -0.20740610361099243 | gen_loss: 0.33706310391426086
18%|██████████████▌ | 36/200 [00:17<00:47, 3.43it/s]
Epoch: 35 | critic_loss: -0.21264103055000305 | gen_loss: 0.34640416502952576
18%|██████████████▉ | 37/200 [00:17<00:47, 3.44it/s]
Epoch: 36 | critic_loss: -0.20959866046905518 | gen_loss: 0.3171178698539734
19%|███████████████▍ | 38/200 [00:17<00:46, 3.45it/s]
Epoch: 37 | critic_loss: -0.21862775087356567 | gen_loss: 0.3392353951931
20%|███████████████▊ | 39/200 [00:18<00:47, 3.43it/s]
Epoch: 38 | critic_loss: -0.20555825531482697 | gen_loss: 0.29389309883117676
20%|████████████████▏ | 40/200 [00:18<00:47, 3.40it/s]
Epoch: 39 | critic_loss: -0.21553707122802734 | gen_loss: 0.3630827069282532
20%|████████████████▌ | 41/200 [00:18<00:46, 3.44it/s]
Epoch: 40 | critic_loss: -0.21727615594863892 | gen_loss: 0.3468192219734192
21%|█████████████████ | 42/200 [00:18<00:45, 3.47it/s]
Epoch: 41 | critic_loss: -0.14304694533348083 | gen_loss: 0.3662793040275574
22%|█████████████████▍ | 43/200 [00:19<00:45, 3.44it/s]
Epoch: 42 | critic_loss: -0.1817150115966797 | gen_loss: 0.32429155707359314
22%|█████████████████▊ | 44/200 [00:19<00:45, 3.46it/s]
Epoch: 43 | critic_loss: -0.23568402230739594 | gen_loss: 0.36516010761260986
22%|██████████████████▏ | 45/200 [00:19<00:44, 3.48it/s]
Epoch: 44 | critic_loss: -0.22753556072711945 | gen_loss: 0.36574888229370117
23%|██████████████████▋ | 46/200 [00:20<00:44, 3.44it/s]
Epoch: 45 | critic_loss: -0.18554610013961792 | gen_loss: 0.3498827815055847
24%|███████████████████ | 47/200 [00:20<00:45, 3.40it/s]
Epoch: 46 | critic_loss: -0.22544097900390625 | gen_loss: 0.35783758759498596
24%|███████████████████▍ | 48/200 [00:20<00:44, 3.41it/s]
Epoch: 47 | critic_loss: -0.23484359681606293 | gen_loss: 0.3798193633556366
24%|███████████████████▊ | 49/200 [00:21<00:44, 3.43it/s]
Epoch: 48 | critic_loss: -0.223350390791893 | gen_loss: 0.32446756958961487
25%|████████████████████▎ | 50/200 [00:21<00:43, 3.41it/s]
Epoch: 49 | critic_loss: -0.22570274770259857 | gen_loss: 0.3751850128173828
26%|████████████████████▋ | 51/200 [00:21<00:43, 3.42it/s]
Epoch: 50 | critic_loss: -0.21425823867321014 | gen_loss: 0.31816259026527405
26%|█████████████████████ | 52/200 [00:21<00:43, 3.40it/s]
Epoch: 51 | critic_loss: -0.2245754450559616 | gen_loss: 0.3842402994632721
26%|█████████████████████▍ | 53/200 [00:22<00:43, 3.41it/s]
Epoch: 52 | critic_loss: -0.2378351241350174 | gen_loss: 0.3931001126766205
27%|█████████████████████▊ | 54/200 [00:22<00:43, 3.39it/s]
Epoch: 53 | critic_loss: -0.22294089198112488 | gen_loss: 0.3855641782283783
28%|██████████████████████▎ | 55/200 [00:22<00:42, 3.39it/s]
Epoch: 54 | critic_loss: -0.21079280972480774 | gen_loss: 0.38321831822395325
28%|██████████████████████▋ | 56/200 [00:23<00:42, 3.39it/s]
Epoch: 55 | critic_loss: -0.2221517264842987 | gen_loss: 0.3699430823326111
28%|███████████████████████ | 57/200 [00:23<00:42, 3.38it/s]
Epoch: 56 | critic_loss: -0.24232064187526703 | gen_loss: 0.40048637986183167
29%|███████████████████████▍ | 58/200 [00:23<00:43, 3.30it/s]
Epoch: 57 | critic_loss: -0.2409924864768982 | gen_loss: 0.40212133526802063
30%|███████████████████████▉ | 59/200 [00:23<00:42, 3.30it/s]
Epoch: 58 | critic_loss: -0.24176256358623505 | gen_loss: 0.4005703628063202
30%|████████████████████████▎ | 60/200 [00:24<00:41, 3.35it/s]
Epoch: 59 | critic_loss: -0.25570499897003174 | gen_loss: 0.423927903175354
30%|████████████████████████▋ | 61/200 [00:24<00:41, 3.37it/s]
Epoch: 60 | critic_loss: -0.23650819063186646 | gen_loss: 0.3820476531982422
31%|█████████████████████████ | 62/200 [00:24<00:40, 3.40it/s]
Epoch: 61 | critic_loss: -0.13492217659950256 | gen_loss: 0.40035322308540344
32%|█████████████████████████▌ | 63/200 [00:25<00:40, 3.42it/s]
Epoch: 62 | critic_loss: -0.22140148282051086 | gen_loss: 0.325278103351593
32%|█████████████████████████▉ | 64/200 [00:25<00:39, 3.44it/s]
Epoch: 63 | critic_loss: -0.25078997015953064 | gen_loss: 0.4220958650112152
32%|██████████████████████████▎ | 65/200 [00:25<00:39, 3.43it/s]
Epoch: 64 | critic_loss: -0.25431713461875916 | gen_loss: 0.42779776453971863
33%|██████████████████████████▋ | 66/200 [00:26<00:39, 3.43it/s]
Epoch: 65 | critic_loss: -0.24193213880062103 | gen_loss: 0.3858298063278198
34%|███████████████████████████▏ | 67/200 [00:26<00:39, 3.39it/s]
Epoch: 66 | critic_loss: -0.2422177642583847 | gen_loss: 0.3854648470878601
34%|███████████████████████████▌ | 68/200 [00:26<00:39, 3.37it/s]
Epoch: 67 | critic_loss: -0.2650587260723114 | gen_loss: 0.43304184079170227
34%|███████████████████████████▉ | 69/200 [00:26<00:38, 3.42it/s]
Epoch: 68 | critic_loss: -0.20429494976997375 | gen_loss: 0.36637356877326965
35%|████████████████████████████▎ | 70/200 [00:27<00:38, 3.42it/s]
Epoch: 69 | critic_loss: -0.2427869737148285 | gen_loss: 0.3877147436141968
36%|████████████████████████████▊ | 71/200 [00:27<00:37, 3.41it/s]
Epoch: 70 | critic_loss: -0.24758070707321167 | gen_loss: 0.40981465578079224
36%|█████████████████████████████▏ | 72/200 [00:27<00:37, 3.45it/s]
Epoch: 71 | critic_loss: -0.2581954598426819 | gen_loss: 0.38129404187202454
36%|█████████████████████████████▌ | 73/200 [00:28<00:36, 3.47it/s]
Epoch: 72 | critic_loss: -0.24487003684043884 | gen_loss: 0.39252394437789917
37%|█████████████████████████████▉ | 74/200 [00:28<00:36, 3.47it/s]
Epoch: 73 | critic_loss: -0.25425684452056885 | gen_loss: 0.40929079055786133
38%|██████████████████████████████▍ | 75/200 [00:28<00:36, 3.46it/s]
Epoch: 74 | critic_loss: -0.2667801082134247 | gen_loss: 0.3995470106601715
38%|██████████████████████████████▊ | 76/200 [00:28<00:35, 3.46it/s]
Epoch: 75 | critic_loss: -0.26049959659576416 | gen_loss: 0.3829888701438904
38%|███████████████████████████████▏ | 77/200 [00:29<00:35, 3.45it/s]
Epoch: 76 | critic_loss: -0.23728244006633759 | gen_loss: 0.38839197158813477
39%|███████████████████████████████▌ | 78/200 [00:29<00:35, 3.45it/s]
Epoch: 77 | critic_loss: -0.23814870417118073 | gen_loss: 0.3790966868400574
40%|███████████████████████████████▉ | 79/200 [00:29<00:34, 3.46it/s]
Epoch: 78 | critic_loss: -0.2559835612773895 | gen_loss: 0.38460248708724976
40%|████████████████████████████████▍ | 80/200 [00:30<00:35, 3.42it/s]
Epoch: 79 | critic_loss: -0.2578791081905365 | gen_loss: 0.39483532309532166
40%|████████████████████████████████▊ | 81/200 [00:30<00:34, 3.41it/s]
Epoch: 80 | critic_loss: -0.2551480233669281 | gen_loss: 0.4234008491039276
41%|█████████████████████████████████▏ | 82/200 [00:30<00:34, 3.40it/s]
Epoch: 81 | critic_loss: -0.2587549686431885 | gen_loss: 0.4106212854385376
42%|█████████████████████████████████▌ | 83/200 [00:30<00:34, 3.36it/s]
Epoch: 82 | critic_loss: -0.18323181569576263 | gen_loss: 0.35344940423965454
42%|██████████████████████████████████ | 84/200 [00:31<00:34, 3.34it/s]
Epoch: 83 | critic_loss: -0.24634215235710144 | gen_loss: 0.41156867146492004
42%|██████████████████████████████████▍ | 85/200 [00:31<00:34, 3.31it/s]
Epoch: 84 | critic_loss: -0.23395822942256927 | gen_loss: 0.39288395643234253
43%|██████████████████████████████████▊ | 86/200 [00:31<00:33, 3.36it/s]
Epoch: 85 | critic_loss: -0.19759848713874817 | gen_loss: 0.3763793706893921
44%|███████████████████████████████████▏ | 87/200 [00:32<00:33, 3.39it/s]
Epoch: 86 | critic_loss: -0.22596175968647003 | gen_loss: 0.39175358414649963
44%|███████████████████████████████████▋ | 88/200 [00:32<00:32, 3.41it/s]
Epoch: 87 | critic_loss: -0.26906150579452515 | gen_loss: 0.41639018058776855
44%|████████████████████████████████████ | 89/200 [00:32<00:32, 3.43it/s]
Epoch: 88 | critic_loss: -0.2638269066810608 | gen_loss: 0.40709614753723145
45%|████████████████████████████████████▍ | 90/200 [00:33<00:31, 3.44it/s]
Epoch: 89 | critic_loss: -0.24647468328475952 | gen_loss: 0.3741465210914612
46%|████████████████████████████████████▊ | 91/200 [00:33<00:31, 3.44it/s]
Epoch: 90 | critic_loss: -0.24450160562992096 | gen_loss: 0.3891570270061493
46%|█████████████████████████████████████▎ | 92/200 [00:33<00:31, 3.44it/s]
Epoch: 91 | critic_loss: -0.25481364130973816 | gen_loss: 0.4017965793609619
46%|█████████████████████████████████████▋ | 93/200 [00:33<00:31, 3.44it/s]
Epoch: 92 | critic_loss: -0.28516602516174316 | gen_loss: 0.4508054256439209
47%|██████████████████████████████████████ | 94/200 [00:34<00:31, 3.41it/s]
Epoch: 93 | critic_loss: -0.1940636783838272 | gen_loss: 0.39802244305610657
48%|██████████████████████████████████████▍ | 95/200 [00:34<00:31, 3.36it/s]
Epoch: 94 | critic_loss: -0.23319678008556366 | gen_loss: 0.3516239523887634
48%|██████████████████████████████████████▉ | 96/200 [00:34<00:31, 3.32it/s]
Epoch: 95 | critic_loss: -0.2214893102645874 | gen_loss: 0.3705796003341675
48%|███████████████████████████████████████▎ | 97/200 [00:35<00:30, 3.33it/s]
Epoch: 96 | critic_loss: -0.2419338971376419 | gen_loss: 0.416594535112381
49%|███████████████████████████████████████▋ | 98/200 [00:35<00:30, 3.37it/s]
Epoch: 97 | critic_loss: -0.278506875038147 | gen_loss: 0.44215062260627747
50%|████████████████████████████████████████ | 99/200 [00:35<00:29, 3.40it/s]
Epoch: 98 | critic_loss: -0.23439666628837585 | gen_loss: 0.3692026138305664
50%|████████████████████████████████████████ | 100/200 [00:35<00:29, 3.40it/s]
Epoch: 99 | critic_loss: -0.22140789031982422 | gen_loss: 0.3604203760623932
50%|████████████████████████████████████████▍ | 101/200 [00:36<00:29, 3.36it/s]
Epoch: 100 | critic_loss: -0.2289312332868576 | gen_loss: 0.3572380542755127
51%|████████████████████████████████████████▊ | 102/200 [00:36<00:28, 3.40it/s]
Epoch: 101 | critic_loss: -0.23688626289367676 | gen_loss: 0.4007105231285095
52%|█████████████████████████████████████████▏ | 103/200 [00:36<00:28, 3.42it/s]
Epoch: 102 | critic_loss: -0.22634679079055786 | gen_loss: 0.36621057987213135
52%|█████████████████████████████████████████▌ | 104/200 [00:37<00:28, 3.41it/s]
Epoch: 103 | critic_loss: -0.24656540155410767 | gen_loss: 0.3869836926460266
52%|██████████████████████████████████████████ | 105/200 [00:37<00:27, 3.40it/s]
Epoch: 104 | critic_loss: -0.2521984279155731 | gen_loss: 0.3999665081501007
53%|██████████████████████████████████████████▍ | 106/200 [00:37<00:27, 3.38it/s]
Epoch: 105 | critic_loss: -0.2712993919849396 | gen_loss: 0.4148338735103607
54%|██████████████████████████████████████████▊ | 107/200 [00:38<00:27, 3.33it/s]
Epoch: 106 | critic_loss: -0.254154771566391 | gen_loss: 0.38774532079696655
54%|███████████████████████████████████████████▏ | 108/200 [00:38<00:27, 3.34it/s]
Epoch: 107 | critic_loss: -0.22105593979358673 | gen_loss: 0.37799692153930664
55%|███████████████████████████████████████████▌ | 109/200 [00:38<00:27, 3.34it/s]
Epoch: 108 | critic_loss: -0.27111756801605225 | gen_loss: 0.3996857702732086
55%|████████████████████████████████████████████ | 110/200 [00:38<00:26, 3.35it/s]
Epoch: 109 | critic_loss: -0.23431813716888428 | gen_loss: 0.37395644187927246
56%|████████████████████████████████████████████▍ | 111/200 [00:39<00:27, 3.26it/s]
Epoch: 110 | critic_loss: -0.26009538769721985 | gen_loss: 0.3903313875198364
56%|████████████████████████████████████████████▊ | 112/200 [00:39<00:26, 3.29it/s]
Epoch: 111 | critic_loss: -0.26801806688308716 | gen_loss: 0.40040072798728943
56%|█████████████████████████████████████████████▏ | 113/200 [00:39<00:26, 3.34it/s]
Epoch: 112 | critic_loss: -0.2371458113193512 | gen_loss: 0.3767924904823303
57%|█████████████████████████████████████████████▌ | 114/200 [00:40<00:25, 3.37it/s]
Epoch: 113 | critic_loss: -0.2652629017829895 | gen_loss: 0.3943062722682953
57%|██████████████████████████████████████████████ | 115/200 [00:40<00:25, 3.38it/s]
Epoch: 114 | critic_loss: -0.25195518136024475 | gen_loss: 0.3877734839916229
58%|██████████████████████████████████████████████▍ | 116/200 [00:40<00:24, 3.38it/s]
Epoch: 115 | critic_loss: -0.26854845881462097 | gen_loss: 0.4060291051864624
58%|██████████████████████████████████████████████▊ | 117/200 [00:41<00:24, 3.39it/s]
Epoch: 116 | critic_loss: -0.24332481622695923 | gen_loss: 0.36277273297309875
59%|███████████████████████████████████████████████▏ | 118/200 [00:41<00:24, 3.33it/s]
Epoch: 117 | critic_loss: -0.2571922540664673 | gen_loss: 0.38936060667037964
60%|███████████████████████████████████████████████▌ | 119/200 [00:41<00:24, 3.29it/s]
Epoch: 118 | critic_loss: -0.2639597952365875 | gen_loss: 0.38300246000289917
60%|████████████████████████████████████████████████ | 120/200 [00:41<00:24, 3.33it/s]
Epoch: 119 | critic_loss: -0.23315274715423584 | gen_loss: 0.35862717032432556
60%|████████████████████████████████████████████████▍ | 121/200 [00:42<00:22, 3.52it/s]
Epoch: 120 | critic_loss: -0.24278020858764648 | gen_loss: 0.35789376497268677
61%|████████████████████████████████████████████████▊ | 122/200 [00:42<00:21, 3.66it/s]
Epoch: 121 | critic_loss: -0.21571536362171173 | gen_loss: 0.3576071262359619
62%|█████████████████████████████████████████████████▏ | 123/200 [00:42<00:20, 3.73it/s]
Epoch: 122 | critic_loss: -0.251568466424942 | gen_loss: 0.39690518379211426
62%|█████████████████████████████████████████████████▌ | 124/200 [00:42<00:19, 3.84it/s]
Epoch: 123 | critic_loss: -0.21602106094360352 | gen_loss: 0.3667871952056885
62%|██████████████████████████████████████████████████ | 125/200 [00:43<00:19, 3.92it/s]
Epoch: 124 | critic_loss: -0.20176321268081665 | gen_loss: 0.36355531215667725
63%|██████████████████████████████████████████████████▍ | 126/200 [00:43<00:18, 3.98it/s]
Epoch: 125 | critic_loss: -0.24002374708652496 | gen_loss: 0.3674788177013397
64%|██████████████████████████████████████████████████▊ | 127/200 [00:43<00:18, 4.01it/s]
Epoch: 126 | critic_loss: -0.23060013353824615 | gen_loss: 0.35755252838134766
64%|███████████████████████████████████████████████████▏ | 128/200 [00:43<00:17, 4.04it/s]
Epoch: 127 | critic_loss: -0.23299278318881989 | gen_loss: 0.3673613667488098
64%|███████████████████████████████████████████████████▌ | 129/200 [00:44<00:17, 4.05it/s]
Epoch: 128 | critic_loss: -0.2497032880783081 | gen_loss: 0.38848063349723816
65%|████████████████████████████████████████████████████ | 130/200 [00:44<00:17, 3.97it/s]
Epoch: 129 | critic_loss: -0.2657921314239502 | gen_loss: 0.38932669162750244
66%|████████████████████████████████████████████████████▍ | 131/200 [00:44<00:17, 3.91it/s]
Epoch: 130 | critic_loss: -0.2513227164745331 | gen_loss: 0.3647608757019043
66%|████████████████████████████████████████████████████▊ | 132/200 [00:44<00:17, 3.83it/s]
Epoch: 131 | critic_loss: -0.25593090057373047 | gen_loss: 0.38305535912513733
66%|█████████████████████████████████████████████████████▏ | 133/200 [00:45<00:17, 3.78it/s]
Epoch: 132 | critic_loss: -0.23889058828353882 | gen_loss: 0.3352544605731964
67%|█████████████████████████████████████████████████████▌ | 134/200 [00:45<00:17, 3.75it/s]
Epoch: 133 | critic_loss: -0.21322152018547058 | gen_loss: 0.35588937997817993
68%|██████████████████████████████████████████████████████ | 135/200 [00:45<00:17, 3.72it/s]
Epoch: 134 | critic_loss: -0.24366207420825958 | gen_loss: 0.36271294951438904
68%|██████████████████████████████████████████████████████▍ | 136/200 [00:46<00:17, 3.70it/s]
Epoch: 135 | critic_loss: -0.22219790518283844 | gen_loss: 0.33838164806365967
68%|██████████████████████████████████████████████████████▊ | 137/200 [00:46<00:17, 3.67it/s]
Epoch: 136 | critic_loss: -0.2340601235628128 | gen_loss: 0.3847951292991638
69%|███████████████████████████████████████████████████████▏ | 138/200 [00:46<00:16, 3.66it/s]
Epoch: 137 | critic_loss: -0.2620770335197449 | gen_loss: 0.3684349060058594
70%|███████████████████████████████████████████████████████▌ | 139/200 [00:46<00:16, 3.61it/s]
Epoch: 138 | critic_loss: -0.2637593150138855 | gen_loss: 0.3788525462150574
70%|████████████████████████████████████████████████████████ | 140/200 [00:47<00:16, 3.56it/s]
Epoch: 139 | critic_loss: -0.2961990535259247 | gen_loss: 0.4127715229988098
70%|████████████████████████████████████████████████████████▍ | 141/200 [00:47<00:16, 3.60it/s]
Epoch: 140 | critic_loss: -0.2552230656147003 | gen_loss: 0.373776912689209
71%|████████████████████████████████████████████████████████▊ | 142/200 [00:47<00:15, 3.69it/s]
Epoch: 141 | critic_loss: -0.24516622722148895 | gen_loss: 0.34251007437705994
72%|█████████████████████████████████████████████████████████▏ | 143/200 [00:47<00:15, 3.78it/s]
Epoch: 142 | critic_loss: -0.26412978768348694 | gen_loss: 0.3603253960609436
72%|█████████████████████████████████████████████████████████▌ | 144/200 [00:48<00:14, 3.86it/s]
Epoch: 143 | critic_loss: -0.24944782257080078 | gen_loss: 0.35506677627563477
72%|██████████████████████████████████████████████████████████ | 145/200 [00:48<00:14, 3.89it/s]
Epoch: 144 | critic_loss: -0.24392768740653992 | gen_loss: 0.3511508107185364
73%|██████████████████████████████████████████████████████████▍ | 146/200 [00:48<00:13, 3.94it/s]
Epoch: 145 | critic_loss: -0.2316821664571762 | gen_loss: 0.30226296186447144
74%|██████████████████████████████████████████████████████████▊ | 147/200 [00:48<00:13, 3.98it/s]
Epoch: 146 | critic_loss: -0.2833584249019623 | gen_loss: 0.3963167071342468
74%|███████████████████████████████████████████████████████████▏ | 148/200 [00:49<00:13, 3.96it/s]
Epoch: 147 | critic_loss: -0.2919508218765259 | gen_loss: 0.40546655654907227
74%|███████████████████████████████████████████████████████████▌ | 149/200 [00:49<00:12, 4.00it/s]
Epoch: 148 | critic_loss: -0.2800157070159912 | gen_loss: 0.3772668242454529
75%|████████████████████████████████████████████████████████████ | 150/200 [00:49<00:12, 3.99it/s]
Epoch: 149 | critic_loss: -0.2720150649547577 | gen_loss: 0.37494733929634094
76%|████████████████████████████████████████████████████████████▍ | 151/200 [00:49<00:12, 4.02it/s]
Epoch: 150 | critic_loss: -0.2640763521194458 | gen_loss: 0.3851677179336548
76%|████████████████████████████████████████████████████████████▊ | 152/200 [00:50<00:11, 4.03it/s]
Epoch: 151 | critic_loss: -0.28176337480545044 | gen_loss: 0.3738551437854767
76%|█████████████████████████████████████████████████████████████▏ | 153/200 [00:50<00:11, 3.97it/s]
Epoch: 152 | critic_loss: -0.29163628816604614 | gen_loss: 0.35690486431121826
77%|█████████████████████████████████████████████████████████████▌ | 154/200 [00:50<00:11, 4.00it/s]
Epoch: 153 | critic_loss: -0.23395287990570068 | gen_loss: 0.2983979880809784
78%|██████████████████████████████████████████████████████████████ | 155/200 [00:50<00:11, 4.01it/s]
Epoch: 154 | critic_loss: -0.29053735733032227 | gen_loss: 0.40300220251083374
78%|██████████████████████████████████████████████████████████████▍ | 156/200 [00:51<00:10, 4.02it/s]
Epoch: 155 | critic_loss: -0.2815514802932739 | gen_loss: 0.3668445348739624
78%|██████████████████████████████████████████████████████████████▊ | 157/200 [00:51<00:10, 4.05it/s]
Epoch: 156 | critic_loss: -0.307656466960907 | gen_loss: 0.4336288571357727
79%|███████████████████████████████████████████████████████████████▏ | 158/200 [00:51<00:10, 4.07it/s]
Epoch: 157 | critic_loss: -0.26327210664749146 | gen_loss: 0.3497222363948822
80%|███████████████████████████████████████████████████████████████▌ | 159/200 [00:51<00:10, 4.05it/s]
Epoch: 158 | critic_loss: -0.23013195395469666 | gen_loss: 0.32780539989471436
80%|████████████████████████████████████████████████████████████████ | 160/200 [00:52<00:10, 3.99it/s]
Epoch: 159 | critic_loss: -0.2967003881931305 | gen_loss: 0.4147905707359314
80%|████████████████████████████████████████████████████████████████▍ | 161/200 [00:52<00:09, 4.03it/s]
Epoch: 160 | critic_loss: -0.2615257799625397 | gen_loss: 0.3410722315311432
81%|████████████████████████████████████████████████████████████████▊ | 162/200 [00:52<00:09, 4.05it/s]
Epoch: 161 | critic_loss: -0.255295991897583 | gen_loss: 0.31429529190063477
82%|█████████████████████████████████████████████████████████████████▏ | 163/200 [00:52<00:09, 4.02it/s]
Epoch: 162 | critic_loss: -0.2733691334724426 | gen_loss: 0.3679298758506775
82%|█████████████████████████████████████████████████████████████████▌ | 164/200 [00:53<00:08, 4.02it/s]
Epoch: 163 | critic_loss: -0.2262057363986969 | gen_loss: 0.21206404268741608
82%|██████████████████████████████████████████████████████████████████ | 165/200 [00:53<00:08, 3.95it/s]
Epoch: 164 | critic_loss: -0.24785682559013367 | gen_loss: 0.31219327449798584
83%|██████████████████████████████████████████████████████████████████▍ | 166/200 [00:53<00:08, 3.90it/s]
Epoch: 165 | critic_loss: -0.30123722553253174 | gen_loss: 0.42210543155670166
84%|██████████████████████████████████████████████████████████████████▊ | 167/200 [00:54<00:08, 3.84it/s]
Epoch: 166 | critic_loss: -0.2758980691432953 | gen_loss: 0.38147351145744324
84%|███████████████████████████████████████████████████████████████████▏ | 168/200 [00:54<00:08, 3.80it/s]
Epoch: 167 | critic_loss: -0.316704124212265 | gen_loss: 0.39698055386543274
84%|███████████████████████████████████████████████████████████████████▌ | 169/200 [00:54<00:08, 3.76it/s]
Epoch: 168 | critic_loss: -0.3260529041290283 | gen_loss: 0.3972119688987732
85%|████████████████████████████████████████████████████████████████████ | 170/200 [00:54<00:08, 3.73it/s]
Epoch: 169 | critic_loss: -0.31215986609458923 | gen_loss: 0.38455331325531006
86%|████████████████████████████████████████████████████████████████████▍ | 171/200 [00:55<00:07, 3.70it/s]
Epoch: 170 | critic_loss: -0.3706111013889313 | gen_loss: 0.4608657956123352
86%|████████████████████████████████████████████████████████████████████▊ | 172/200 [00:55<00:07, 3.65it/s]
Epoch: 171 | critic_loss: -0.310491681098938 | gen_loss: 0.40522217750549316
86%|█████████████████████████████████████████████████████████████████████▏ | 173/200 [00:55<00:07, 3.59it/s]
Epoch: 172 | critic_loss: -0.3513323962688446 | gen_loss: 0.5187121033668518
87%|█████████████████████████████████████████████████████████████████████▌ | 174/200 [00:55<00:07, 3.58it/s]
Epoch: 173 | critic_loss: -0.24815236032009125 | gen_loss: 0.3275775909423828
88%|██████████████████████████████████████████████████████████████████████ | 175/200 [00:56<00:06, 3.57it/s]
Epoch: 174 | critic_loss: -0.28646451234817505 | gen_loss: 0.39188483357429504
88%|██████████████████████████████████████████████████████████████████████▍ | 176/200 [00:56<00:06, 3.56it/s]
Epoch: 175 | critic_loss: -0.27517643570899963 | gen_loss: 0.34296196699142456
88%|██████████████████████████████████████████████████████████████████████▊ | 177/200 [00:56<00:06, 3.55it/s]
Epoch: 176 | critic_loss: -0.31533291935920715 | gen_loss: 0.41212502121925354
89%|███████████████████████████████████████████████████████████████████████▏ | 178/200 [00:57<00:06, 3.54it/s]
Epoch: 177 | critic_loss: -0.31115561723709106 | gen_loss: 0.3898743689060211
90%|███████████████████████████████████████████████████████████████████████▌ | 179/200 [00:57<00:05, 3.53it/s]
Epoch: 178 | critic_loss: -0.31811240315437317 | gen_loss: 0.39330852031707764
90%|████████████████████████████████████████████████████████████████████████ | 180/200 [00:57<00:05, 3.47it/s]
Epoch: 179 | critic_loss: -0.296848863363266 | gen_loss: 0.38605380058288574
90%|████████████████████████████████████████████████████████████████████████▍ | 181/200 [00:57<00:05, 3.48it/s]
Epoch: 180 | critic_loss: -0.29916495084762573 | gen_loss: 0.40815067291259766
91%|████████████████████████████████████████████████████████████████████████▊ | 182/200 [00:58<00:05, 3.49it/s]
Epoch: 181 | critic_loss: -0.27015480399131775 | gen_loss: 0.35915547609329224
92%|█████████████████████████████████████████████████████████████████████████▏ | 183/200 [00:58<00:04, 3.49it/s]
Epoch: 182 | critic_loss: -0.2670876383781433 | gen_loss: 0.35377103090286255
92%|█████████████████████████████████████████████████████████████████████████▌ | 184/200 [00:58<00:04, 3.47it/s]
Epoch: 183 | critic_loss: -0.28833794593811035 | gen_loss: 0.3717002868652344
92%|██████████████████████████████████████████████████████████████████████████ | 185/200 [00:59<00:04, 3.43it/s]
Epoch: 184 | critic_loss: -0.26421743631362915 | gen_loss: 0.3495456576347351
93%|██████████████████████████████████████████████████████████████████████████▍ | 186/200 [00:59<00:04, 3.36it/s]
Epoch: 185 | critic_loss: -0.25993645191192627 | gen_loss: 0.37321561574935913
94%|██████████████████████████████████████████████████████████████████████████▊ | 187/200 [00:59<00:03, 3.39it/s]
Epoch: 186 | critic_loss: -0.3285483717918396 | gen_loss: 0.41389790177345276
94%|███████████████████████████████████████████████████████████████████████████▏ | 188/200 [01:00<00:03, 3.39it/s]
Epoch: 187 | critic_loss: -0.28951331973075867 | gen_loss: 0.3579261004924774
94%|███████████████████████████████████████████████████████████████████████████▌ | 189/200 [01:00<00:03, 3.36it/s]
Epoch: 188 | critic_loss: -0.32801833748817444 | gen_loss: 0.41400888562202454
95%|████████████████████████████████████████████████████████████████████████████ | 190/200 [01:00<00:02, 3.38it/s]
Epoch: 189 | critic_loss: -0.2878578007221222 | gen_loss: 0.36097797751426697
96%|████████████████████████████████████████████████████████████████████████████▍ | 191/200 [01:00<00:02, 3.40it/s]
Epoch: 190 | critic_loss: -0.274676650762558 | gen_loss: 0.34725967049598694
96%|████████████████████████████████████████████████████████████████████████████▊ | 192/200 [01:01<00:02, 3.42it/s]
Epoch: 191 | critic_loss: -0.3022336959838867 | gen_loss: 0.39650416374206543
96%|█████████████████████████████████████████████████████████████████████████████▏ | 193/200 [01:01<00:02, 3.40it/s]
Epoch: 192 | critic_loss: -0.29000529646873474 | gen_loss: 0.37750357389450073
97%|█████████████████████████████████████████████████████████████████████████████▌ | 194/200 [01:01<00:01, 3.38it/s]
Epoch: 193 | critic_loss: -0.24224022030830383 | gen_loss: 0.3046799302101135
98%|██████████████████████████████████████████████████████████████████████████████ | 195/200 [01:02<00:01, 3.40it/s]
Epoch: 194 | critic_loss: -0.286218523979187 | gen_loss: 0.3520301580429077
98%|██████████████████████████████████████████████████████████████████████████████▍ | 196/200 [01:02<00:01, 3.41it/s]
Epoch: 195 | critic_loss: -0.3064529299736023 | gen_loss: 0.38745638728141785
98%|██████████████████████████████████████████████████████████████████████████████▊ | 197/200 [01:02<00:00, 3.33it/s]
Epoch: 196 | critic_loss: -0.3627226948738098 | gen_loss: 0.5069276094436646
99%|███████████████████████████████████████████████████████████████████████████████▏| 198/200 [01:02<00:00, 3.36it/s]
Epoch: 197 | critic_loss: -0.31205806136131287 | gen_loss: 0.429940789937973
100%|███████████████████████████████████████████████████████████████████████████████▌| 199/200 [01:03<00:00, 3.40it/s]
Epoch: 198 | critic_loss: -0.28414756059646606 | gen_loss: 0.3612818419933319
100%|████████████████████████████████████████████████████████████████████████████████| 200/200 [01:03<00:00, 3.15it/s]
Epoch: 199 | critic_loss: -0.2664364278316498 | gen_loss: 0.3359828591346741
이제 훈련된 모델과 데이터를 합성할 것입니다. 예를 들어, 모델에서 100000개의 샘플 데이터를 합성할 수 있습니다.
synth_data = synthesizer.sample(X_train_synth_min[['FraudFound_P']])
while synth_data.shape[0] <= 100000:
temp = synthesizer.sample(X_train_synth_min[['FraudFound_P']])
synth_data = pd.concat([synth_data, temp], axis=0)
print(synth_data.shape)
synth_data.sample(50)
(100130, 44)
Age | Deductible | DriverRating | AccidentArea_Urban | Sex_Male | MaritalStatus_Married | MaritalStatus_Single | MaritalStatus_Widow | Fault_Third Party | PolicyType_Sedan - Collision | ... | AgeOfVehicle_3 years | AgeOfVehicle_4 years | AgeOfVehicle_5 years | AgeOfVehicle_6 years | AgeOfVehicle_7 years | AgeOfVehicle_more than 7 | AgeOfVehicle_new | BasePolicy_Collision | BasePolicy_Liability | FraudFound_P | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
135 | 15 | 313 | 0 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | 0 | 1 |
397 | 19 | 276 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
631 | 17 | 370 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 1 | 1 |
597 | 19 | 350 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 1 | 1 |
462 | 22 | 330 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
15 | 18 | 350 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 0 | 1 |
185 | 19 | 355 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 0 | 0 | 0 | 1 |
387 | 19 | 293 | 0 | 0 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
496 | 29 | 323 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | 0 | 1 |
469 | 10 | 288 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
500 | 43 | 382 | -2 | 254 | 0 | 254 | 1 | 0 | 254 | 1 | ... | 0 | 1 | 255 | 0 | 0 | 255 | 255 | 1 | 1 | 1 |
34 | 27 | 285 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
104 | 14 | 389 | 0 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
28 | 16 | 291 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
222 | 12 | 302 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 0 | 0 | 0 | 1 |
593 | 25 | 295 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | 0 | 1 |
362 | 27 | 344 | -1 | 255 | 0 | 255 | 1 | 0 | 255 | 1 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 1 | 1 | 1 |
20 | 33 | 315 | 0 | 0 | 0 | 255 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
629 | 12 | 352 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 0 | 1 |
274 | 25 | 358 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 1 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 1 | 1 |
313 | 18 | 314 | 0 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
72 | 16 | 353 | 0 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
407 | 18 | 328 | 0 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | 0 | 1 |
449 | 23 | 366 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 0 | 1 |
371 | 27 | 293 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
520 | 20 | 272 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
458 | 22 | 361 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 0 | 1 |
170 | 18 | 326 | -1 | 0 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
382 | 23 | 387 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 0 | 1 |
183 | 22 | 381 | -2 | 255 | 0 | 255 | 0 | 0 | 255 | 1 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 1 | 1 |
546 | 31 | 348 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 1 | 1 |
51 | 23 | 332 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
111 | 19 | 345 | 0 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | 0 | 1 |
486 | 18 | 295 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
493 | 24 | 328 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
253 | 28 | 411 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 1 | 1 | 1 |
398 | 15 | 377 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
390 | 18 | 357 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
370 | 22 | 357 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | 0 | 1 |
36 | 24 | 306 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
244 | 10 | 290 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
68 | 22 | 375 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 0 | 1 |
548 | 17 | 332 | 0 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
562 | 14 | 356 | 0 | 255 | 0 | 0 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
149 | 24 | 330 | -1 | 255 | 0 | 254 | 0 | 0 | 254 | 1 | ... | 0 | 0 | 0 | 0 | 0 | 255 | 255 | 0 | 1 | 1 |
139 | 12 | 299 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
310 | 18 | 294 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 | 0 | 1 |
158 | 24 | 302 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
84 | 28 | 376 | -1 | 255 | 0 | 255 | 0 | 0 | 255 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
230 | 30 | 280 | -1 | 0 | 0 | 255 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
50 rows × 44 columns
데이터가 합성되면 이전의 훈련 데이터를 합성 데이터로 채우고, 데이터 세트의 균형을 맞춥니다.
minority_synth_data = synth_data[synth_data["FraudFound_P"] == 1].sample(9502)
X_train_synth_true = pd.concat([X_train_synth, minority_synth_data]).reset_index(drop=True).copy()
X_train_synth_true['FraudFound_P'].value_counts()
0 10148
1 10148
Name: FraudFound_P, dtype: int64
위의 예에서 볼 수 있듯이 이전의 imblanced 데이터 세트와 현재의 합성 데이터를 통해서 균형을 맞출 수 있습니다. balanced 데이터로 모델 성능을 훈련하는 것을 살펴보겠습니다.
model.fit(X_train_synth_true.drop('FraudFound_P', axis =1), X_train_synth_true['FraudFound_P'])
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
precision recall f1-score support
0 0.94 0.98 0.96 4349
1 0.17 0.05 0.08 277
accuracy 0.93 4626
macro avg 0.56 0.52 0.52 4626
weighted avg 0.90 0.93 0.91 4626
원본 데이터와 비교했을 때, balanced 데이터 세트로 모델 성능이 약간 향상되었습니다. features를 제대로 선택하지 않았고, 다른 모델로 실험해보지 않았기 때문에 그다지 성능이 증가하지는 않았습니다. 하지만, 이 간단한 예로 합성 데이터가 fraud 모델링 성능을 높이는 데 도움이 될 수 있음을 증명했습니다.
Conclusion
Fraud는 비즈니스에서 흔히 발생하는 문제이며 해당 사례를 처리하기 위해 적절한 조치가 필요합니다. 우리가 할 수 있는 조치 중 하나는 fraud 모델링을 사용하여 fraud cases를 정확하게 예측하는 것입니다. 그러나 fraud 모델링 개발은 imbalanced 데이터 문제로 인해 자주 지연됩니다.
다양한 연구에서 합성 데이터가 imbalance 문제를 완화하기 위해 훈련 데이터의 balance을 조정함으로써 모델 성능을 향상시킬 수 있음이 입증되었습니다.
fraud 모델을 개발하는 간단한 실험에서 합성 데이터를 포함하는 balanced 데이터 세트는 원본 데이터 세트보다 약간 더 나은 성능을 보였습니다. 이는 합성 데이터가 fraud 모델링 사례에 도움이 될 수 있음을 증명합니다.
댓글남기기