재현 데이터(Synthetic Data) 생성 - 라이브러리 (SDV)
안녕하세요, 이번 포스팅에서는 재현 데이터를 생성하는데 사용할 라이브러리를 알려드리려고 합니다.
1. 재현 데이터(Synthetic Data) 생성 - 개념 2. 재현 데이터(Synthetic Data) 생성 - 라이브러리 3. 재현 데이터(Synthetic Data) 생성 - 생성 기법 |
혹시나 재현 데이터가 무엇인지 궁금하신 분은 지난 포스팅글을 읽어보면 좋습니다.
간단하게 설명하자면, 재현 데이터는 실제 데이터를 참고하여 비슷한 구조를 가진 임의 데이터를 생성하는 것입니다.
알고리즘을 이용하여 실제 데이터를 학습하고 임의 데이터를 도출하는 과정이라고 생각하면 됩니다.
재현 데이터 생성 과정
재현 데이터는 실제 데이터를 가져와 모델 학습을 통해 생성한다.
아래 그림은 재현 데이터 생성 과정을 도식화한 것으로 코드 작성하는 순서를 기준으로 표현했다.
- 어떤 데이터를 사용할 것인가?
- 어떤 알고리즘을 선택할 것인가?
데이터를 보면, 불균형 데이터, 균형 데이터, 범주형 데이터, 숫자형 데이터, 범주/숫자 혼합형 데이터 등 여러 유형의 데이터가 있다.
알고리즘은 CART, Gaussian Copula, CTGAN 등 라이브러리를 통해 선택과 학습을 진행할 수 있다.
정형 데이터에서 많이 사용하게 되는 라이브러리로 SDV를 소개하고 실습 예제를 보여드리고자 한다.
SDV(Synthetic Data Vault)
파이썬에서 사용할 수 있는 재현 데이터 생성 라이브러리로, 실제 데이터를 통계적으로 학습하여 새로운 데이터를 생성한다.
SDV에서는 단일 테이블, 단일 테이블(시퀀즈), 다중 테이블(연계) 데이터에 대한 재현 데이터 생성이 가능하다.
➕
단일 테이블은 하나의 정형 데이터, 시퀀즈는 시계열적인 요소가 들어간 데이터, 다중 테이블(연계)는 키값을 기준으로 연결가능한(관계형) 두개의 정형 데이터를 말한다.
알고리즘(학습기)는 FAST ML, Gaussian Copula, CTGAN, PAR, HMA 등을 사용가능하며, Gaussian Copula Synthesizer를 커스텀할 경우, 각 칼럼마다 분포를 다르게 설정할 수 있다.
정규 분포, 베타 분포, 절단 정규 분포, 균등 분포, 감마 분포, 가우시안 커널 밀도 추청으로 모델링이 가능하다.
SDV 도큐먼트에서는 내장된 데이터, 테이블 형식, 알고리즘 등 다양한 실습 코드를 제공하여 사용방법을 알려준다.
아래 표는 SDV 도큐먼트에서 설명한 코드를 간략하게 정리한 표이다.
테이블 형식 | 알고리즘 | 커스텀 |
단일 테이블 | FAST ML | X |
단일 테이블 | Gaussian Copula | O |
단일 테이블 | CTGAN | O |
단일 테이블(시퀀즈) | PAR | O |
다중 테이블(연계) | HMA | O |
단일테이블 실습 예제
자신이 가지고 있는 실제 데이터가 단일테이블로 이뤄져 있다면 Gaussian Copula, CTGAN, TVAE, CopulaGAN을 사용하면 된다.
*DayZ의 경우 라이선스 사용자만 사용 가능하다.
1. SDV 라이브러리 설치
*코랩에서 사용할 경우 설치 후 런타임을 다시 시작해야 한다.
pip install sdv
2. 데이터 불러오기
도큐먼트에서는 sdv에 내장된 데이터인 호텔 고객 데이터를 가져와서 실습을 진행한다.
from sdv.datasets.demo import download_demo
real_data, metadata = download_demo(
modality='single_table', # 단일 테이블
dataset_name='fake_hotel_guests' # 데이터명
)
3. 데이터 확인
데이터에 들어있는 정보는 이메일, 체크인/체크아웃 일자, 주소, 신용카드번호 등이 들어있는 것을 확인할 수 있다.
real_data.head()
4. 메타 데이터 확인
SDV에 내장된 호텔 고객 데이터의 경우 메타데이터가 포함되어있어 만들 필요는 없다.
*각자 보유하고 있는 데이터의 메타 데이터를 만드는 것은 추후 포스팅하고자 한다.
metadata.visualize()
5. synthesizer(신디사이저) 만들기
실제 데이터를 학습하고 모방하여 재현 데이터를 만드는 학습기를 만든다.
FAST_ML
호텔 고객 데이터를 성능좋게 빠르게 써볼 수 있는 fast ml
*프리셋: 특정 데이터 유형이나 특성에 대해 미리 정의된 분포 설정을 활용한다는 것을 의미
from sdv.lite import SingleTablePreset
synthesizer = SingleTablePreset(metadata, name='FAST_ML') # FAST_ML 프리셋 사용(성능이 최적화됨)
synthesizer.fit(data=real_data)
Gaussian Copula(가우시안 코플라)
여러 변수 간의 상관성, 독립성을 고려한 확률 알고리즘
from sdv.single_table import GaussianCopulaSynthesizer
synthesizer = GaussianCopulaSynthesizer(metadata) # 가우시안 코플라
synthesizer.fit(real_data)
CTGAN
재현 데이터 생성을 위해 만든 변형된 GAN
from sdv.single_table import CTGANSynthesizer
synthesizer = CTGANSynthesizer(metadata) # CTGAN
synthesizer.fit(real_data)
6. 재현 데이터 생성
원하는 수만큼 재현 데이터를 생성할 수 있다.
아래 코드는 호텔 고객 재현 데이터를 500개 생성한다.
synthetic_data = synthesizer.sample(num_rows=500)
synthetic_data.head()
7. 익명화 확인
이메일, 주소, 신용카드번호를 실제 데이터와 재현 데이터를 비교하여 익명성이 보장되었는지 확인해 본다.
# 익명이 필요한 칼럼명(이메일, 주소, 신용카드번호)을 만들고, 실데이터에서 조회
sensitive_column_names = ['guest_email', 'billing_address', 'credit_card_number']
real_data[sensitive_column_names].head(3)
synthetic_data[sensitive_column_names].head(3) # 재현 데이터에서 조회
8. 데이터 품질 평가
재현 데이터는 실제 데이터의 특성을 얼마나 유사하게 재현했는지 확인할 필요가 있다.
데이터 품질 평가가 궁금하다면 SDV의 자매품 SDMetrics 도큐먼트에서 내용을 확인 할 수 있다.
- Overall Quality Score: 전체 품질평가점수를 표현
- Column Shapes: 한 칼럼마다 얼마나 유사하게 데이터를 생성했는지에 대한 유용성 비율 지표
- Column Pair Trends: 두 개의 칼럼을 교차해서 봤을 때 얼마나 유사한지 확인하는 유용성 비율 지표
from sdv.evaluation.single_table import evaluate_quality
quality_report = evaluate_quality(
real_data, # 실제 데이터
synthetic_data, # 재현 데이터
metadata # 메타 데이터
)
FAST_ML
Gaussian Copula(가우시안 코플라)
CTGAN
9. 데이터 품질 평가 시각화
유사성 지표를 계산하기 위해서 TVComplement, KSComplement를 이용하여 산출한다.
TVComplement는 범주, 부울(Boolean) 타입의 칼럼을 평가하는데 사용하며, KSComplement는 숫자, 날짜/시간 타입의 칼럼을 평가하는데 사용한다.
수치형은 사선무늬로 표현, 명목형은 민무늬로 표현하여 시각화한다.
quality_report.get_visualization('Column Shapes')
10. 비교 시각화
시각화는 크게 단일 칼럼으로 시각화하는 것(일변량)과 쌍으로 칼럼을 비교해서 시각화하는 것(이변량)으로 나눈다.
또한, 일변량일 때, 이변량일 때 각각 데이터 타입에 맞게 자동적으로 그래프를 만들어낸다.
일변량으로 수치형 칼럼명을 입력하면 히스토그램이 그려지며, 이변량의 경우 수치형*수치형으로 칼럼명을 입력하면 산점도를 출력한다.
Column 분포 | type | 시각화 |
일변량 | 수치형 | 히스토그램 |
일변량 | 명목형 | 막대그래프 |
이변량 | 수치/수치 | 산점도 |
이변량 | 범주/범주 | 매트릭스 |
이변량 | 수치/범주 | 상자그림 |
column plot
수치형 데이터는 히스토그램, 명목형 데이터는 막대그래프로 표현된다.
# 'amenities_fee'변수의 실데이터, 재현데이터, 메타데이터를 넣고 비교 시각화
from sdv.evaluation.single_table import get_column_plot
fig = get_column_plot(
real_data=real_data,
synthetic_data=synthetic_data,
column_name='amenities_fee',
metadata=metadata
)
fig.show()
from sdv.evaluation.single_table import get_column_plot
fig = get_column_plot(
real_data=real_data,
synthetic_data=synthetic_data,
column_name='room_rate',
metadata=metadata
)
fig.show()
from sdv.evaluation.single_table import get_column_plot
fig = get_column_plot(
real_data=real_data,
synthetic_data=synthetic_data,
column_name='room_type',
metadata=metadata
)
fig.show()
column pair plot
수치와 범주에 따라 산점도, 상자그림, 매트릭스 시각화를 표현한다.
# 체크인과 체크아웃의 상관관계 시각화
from sdv.evaluation.single_table import get_column_pair_plot
fig = get_column_pair_plot(
real_data=real_data,
synthetic_data=synthetic_data,
column_names=['checkin_date', 'checkout_date'], # 칼럼명 2개
metadata=metadata
)
fig.show()
from sdv.evaluation.single_table import get_column_pair_plot
fig = get_column_pair_plot(
real_data=real_data,
synthetic_data=synthetic_data,
column_names=['room_rate', 'room_type'],
metadata=metadata
)
fig.show()
from sdv.evaluation.single_table import get_column_pair_plot
fig = get_column_pair_plot(
real_data=real_data,
synthetic_data=synthetic_data,
column_names=['has_rewards', 'room_type'],
metadata=metadata
)
fig.show()
11. synthesizer(신디사이저) 저장 및 불러오기
신디사이저는 저장을 하고 불러오는 것이 가능하여, 같은 구조와 특성을 가진 데이터셋에 활용할 수 있다.
저장은 .save, 불러오기는 SigleTablePreset.load를 통해 진행한다.
synthesizer.save('my_synthesizer.pkl') # 저장
synthesizer = SingleTablePreset.load('my_synthesizer.pkl') # 불러오기
12. 커스텀하기
Gaussian Copula(가우시안 코플라)
일부 컬럼의 분포를 변경하여 사용할 수 있다.
'norm', 'beta', 'truncnorm', 'uniform', 'gamma', 'gaussian_kde' 중에서 사용가능하다.
➕
'norm' 정규 분포, 'beta' 베타 분포, 'truncnorm' 절단 정규 분포, 'uniform' 균일 분포, 'gamma' 감마 분포, 'gaussian_kde' 가우시안 커널 밀도 추정
custom_synthesizer = GaussianCopulaSynthesizer(
metadata,
default_distribution='truncnorm',
numerical_distributions={
'checkin_date': 'uniform',
'checkout_date': 'uniform',
'room_rate': 'gaussian_kde'
}
)
custom_synthesizer.fit(real_data)
CTGAN
CTGAN을 사용할 때 epochs를 사용하여 데이터 품질을 향상할 수 있다.
custom_synthesizer = CTGANSynthesizer(metadata, epochs=1000)
custom_synthesizer.fit(real_data)
끝으로, SDV라이브러리에 대해
A부터 Z까지 하나하나 다 설명하고 싶었지만, 분량조절 실패로 이만 마치려 한다.
단일 테이블을 기준으로 작성한 예제로 이뤄진 글이지만, 단일 테이블(시퀀즈)에 제공되는 알고리즘과 다중 테이블(연계)에 제공되는 알고리즘은 다르며, 추가적으로 알고싶다면 공식 문서를 확인하길 바란다.
또한, SDV는 개발을 진행하고 있어 synthesizer가 추가되고 있으며, 문의를 통해 개발자와 빠르게 답변을 받고 싶다면 슬랙으로 소통이 가능하다.
자신의 실제 데이터를 적용하여 재현 데이터를 생성할 시 메타 데이터를 쉽게 작성할 수 있으며, 메타 데이터 실습 예제의 경우 추후 수정을 통해 내용을 추가할 예정이다.
Reference
저널
Aryan Pathare 외 5명(2023), "Comparison of tabular synthetic data generation techniques using propensity and cluster log metric", ScienceDirect
웹사이트
sdv document, 접근일: 2023-12-24, https://docs.sdv.dev/sdv/
sdv 깃허브, 접근일: 2023-12-24, https://github.com/sdv-dev/SDV
sdmetrics document, 접근일: 2023-12-24, https://docs.sdv.dev/sdmetrics/
scipy document, 접근일: 2023-12-24, https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.truncnorm.html
ctgan document, 접근일: 2023-12-24, https://docs.sdv.dev/sdv/single-table-data/modeling/synthesizers/ctgansynthesizer