1. 개요
이 실습에서는 BigQuery 데이터 세트를 직접 수집하고 Google Cloud AI Platform에서 TensorFlow Enterprise를 사용하여 사기 감지 모델을 학습합니다.
학습 내용
다음 작업을 수행하는 방법을 배우게 됩니다.
- BigQuery에서 데이터 분석
- TensorFlow Enterprise에서 BigQuery 커넥터를 사용하여 데이터 수집
- 불균형 데이터 세트로 사기를 감지하는 딥 러닝 모델 빌드
2. BigQuery에서 데이터 분석
이 Codelab을 실행하려면 결제가 사용 설정된 Google Cloud Platform 프로젝트가 필요합니다. 프로젝트를 만들려면 여기의 안내를 따르세요.
1단계: BigQuery 공개 데이터 세트에 액세스하기
이 링크를 따라 Google Cloud 콘솔에서 BigQuery 공개 데이터 세트에 액세스하세요.
왼쪽 하단의 리소스 트리에는 데이터 세트 목록이 표시됩니다. 사용 가능한 데이터 세트를 탐색하여 ml-datasets를 찾은 다음 그 안에서 ulb-fraud-detection 테이블을 선택합니다.

각 탭을 클릭하여 데이터 세트에 대해 자세히 알아보세요.
- 스키마 탭에는 데이터 유형이 설명되어 있습니다.
- 세부정보 탭에는 284,407개의 거래로 구성된 불균형 데이터 세트이며 그중 492개가 사기 거래라고 설명되어 있습니다.
- 미리보기 탭에는 데이터 세트의 레코드가 표시됩니다.
2단계: 테이블 쿼리
세부정보 탭에는 데이터에 관한 다음 정보가 표시됩니다.
- 시간은 데이터 세트의 첫 번째 트랜잭션과 선택한 트랜잭션의 시간 사이의 초 수입니다.
- V1~V28은 데이터가 익명화된 PCA라는 차원 축소 기법을 통해 변환된 열입니다.
- Amount는 거래 금액입니다.
쿼리 표를 클릭하여 쿼리를 실행하고 자세히 살펴보겠습니다.

모든 열을 표시하도록 문을 업데이트하고 실행을 클릭합니다.
SELECT * FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection` LIMIT 1000
3단계: 데이터 분석하기
BigQuery는 다양한 통계 함수를 제공합니다. 데이터가 타겟 변수 Class와 어떤 상관관계가 있는지 살펴보겠습니다.
SELECT CORR(Time,Class) as TimeCorr, CORR(V1,Class) as V1Corr, CORR(V2,Class) as V2Corr, CORR(Amount,Class) as AmountCorr FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`

상관관계는 -1 (부정적 상관관계)에서 1 (긍정적 상관관계)까지의 범위를 제공하며 0은 독립적입니다.
V1과 V2는 타겟 변수와 약간의 상관관계가 있습니다 (각각 -0.1 및 0 .1 정도).
시간과는 큰 상관관계가 없는 것으로 보입니다. 약간의 음의 상관관계는 데이터 세트에서 시간이 지남에 따라 사기 거래가 줄어들고 있음을 나타낼 수 있습니다.
금액은 상관관계가 더 낮아 거래 금액이 높을수록 허위 거래가 발생할 가능성이 아주 약간 더 높음을 나타냅니다.
4단계: 특성 스케일링의 평균값 계산
특성 값을 정규화하면 신경망이 더 빠르게 수렴될 수 있습니다. 일반적인 방식은 표준편차가 1인 0을 중심으로 값을 배치하는 것입니다. 다음 쿼리는 평균값을 가져옵니다. 결과를 저장할 필요는 없습니다. 나중에 코드 스니펫이 제공될 예정입니다.
쿼리에는 흥미로운 WHERE 절도 포함되어 있습니다. 학습 세트와 테스트 세트 간에 데이터를 분할하는 방법을 설명하는 다음 섹션에서 자세히 알아보겠습니다.
SELECT
AVG(Time), AVG(V1), AVG(V2), AVG(V3), AVG(V4), AVG(V5), AVG(V6), AVG(V7), AVG(V8),
AVG(V9), AVG(V10),AVG(V11), AVG(V12), AVG(V13), AVG(V14), AVG(V15), AVG(V16),
AVG(V17), AVG(V18), AVG(V19), AVG(V20), AVG(V21), AVG(V22), AVG(V23), AVG(V24),
AVG(V25), AVG(V26), AVG(V27),AVG(V28), AVG(Amount)
FROM
`bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE
MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),
SAFE_CAST(Amount AS STRING)))),10) < 8
5단계: 데이터 분할하기
머신러닝 모델을 빌드할 때는 일반적으로 3개의 데이터 세트를 사용합니다.
- 학습: 파라미터를 반복적으로 조정하여 모델을 빌드하는 데 사용됩니다.
- 검증: 학습 과정에서 독립적인 데이터를 검증하여 모델이 과적합되는지 평가하는 데 사용됩니다.
- 테스트: 모델이 생성된 후 정확성을 평가하는 데 사용됩니다.
이 Codelab에서는 80/10/10 학습/검증/테스트 분할을 사용합니다.
각 데이터 세트는 BigQuery의 자체 테이블에 배치됩니다. 첫 번째 단계는 관련 테이블의 컨테이너인 BigQuery '데이터 세트'를 만드는 것입니다. 프로젝트를 선택한 상태에서 데이터 세트 만들기를 선택합니다.

그런 다음 학습, 검증, 테스트 테이블을 포함하는 tfe_codelab이라는 데이터 세트를 만듭니다.

이제 학습, 테스트, 검증을 위한 3개의 쿼리를 실행하고 새 tfe_codelab 데이터 세트 내에 데이터를 저장합니다.
쿼리 편집기에서 쿼리를 실행하여 학습 데이터를 생성합니다.
SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) < 8
쿼리가 완료되면 결과를 BigQuery 테이블에 저장합니다.

방금 만든 tfe_codelab 데이터 세트 내에서 테이블 이름을 ulb_fraud_detection_train으로 지정하고 데이터를 저장합니다.

WHERE 절은 먼저 몇 개의 열에 해시를 계산하여 데이터를 분할합니다. 그런 다음 10으로 나눈 해시의 나머지가 80 미만인 행을 선택하여 80%를 제공합니다.
이제 각각 데이터의 10% 를 선택하는 유사한 쿼리를 사용하여 검증 및 테스트 세트에 대해 동일한 프로세스를 반복해 보겠습니다.
확인
SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) = 8
이 쿼리의 결과를 ulb_fraud_detection_val이라는 테이블에 저장합니다.
테스트
SELECT *
FROM `bigquery-public-data.ml_datasets.ulb_fraud_detection`
WHERE MOD(ABS(FARM_FINGERPRINT(CONCAT(SAFE_CAST(Time AS STRING),SAFE_CAST(Amount AS STRING)))),10) = 9
이 쿼리의 결과를 ulb_fraud_detection_test라는 테이블에 저장합니다.
3. 노트북 환경 설정
데이터에 대한 간략한 소개를 마쳤으니 이제 모델 개발 환경을 설정해 보겠습니다.
1단계: API 사용 설정
BigQuery 커넥터는 BigQuery Storage API를 사용합니다. 콘솔에서 BigQuery Storage API를 검색하고 현재 사용 중지되어 있는 경우 API를 사용 설정합니다.

2단계: AI Platform Notebooks 인스턴스 만들기
Cloud 콘솔의 AI Platform Notebooks 섹션으로 이동하여 새 인스턴스를 클릭합니다. 그런 다음 최신 GPU가 없는 TensorFlow Enterprise 1.x 인스턴스 유형을 선택합니다.
기본 옵션을 사용한 다음 만들기를 클릭합니다. 인스턴스가 생성되면 JupyterLab 열기를 선택합니다.

그런 다음 JupyterLab에서 Python 3 노트북을 만듭니다.

4. BigQuery에서 레코드 수집
1단계: Python 패키지 가져오기
노트북의 첫 번째 셀에 다음 가져오기를 추가하고 셀을 실행합니다. 상단 메뉴에서 오른쪽 화살표 버튼을 누르거나 command-enter를 눌러 실행할 수 있습니다.
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers
from tensorflow_io.bigquery import BigQueryClient
import functools
tf.enable_eager_execution()
2단계: 상수 정의
다음으로 프로젝트에서 사용할 상수를 정의해 보겠습니다. GCP_PROJECT_ID를 실제 사용 중인 프로젝트 ID로 변경합니다. 새 셀을 만들면서 바로 실행하세요.
GCP_PROJECT_ID = '<YOUR_PROJECT_ID>'
DATASET_GCP_PROJECT_ID = GCP_PROJECT_ID # A copy of the data is saved in the user project
DATASET_ID = 'tfe_codelab'
TRAIN_TABLE_ID = 'ulb_fraud_detection_train'
VAL_TABLE_ID = 'ulb_fraud_detection_val'
TEST_TABLE_ID = 'ulb_fraud_detection_test'
FEATURES = ['Time','V1','V2','V3','V4','V5','V6','V7','V8','V9','V10','V11','V12','V13','V14','V15','V16','V17','V18','V19','V20','V21','V22','V23','V24','V25','V26','V27','V28','Amount']
LABEL='Class'
DTYPES=[tf.float64] * len(FEATURES) + [tf.int64]
3단계: 도우미 함수 정의
이제 몇 가지 함수를 정의해 보겠습니다. read_session()은 BigQuery 테이블에서 데이터를 읽습니다. extract_labels()는 나중에 keras.model_fit()에서 예상하는 형식으로 데이터 세트가 되도록 라벨 열을 나머지 열에서 분리하는 도우미 함수입니다.
client = BigQueryClient()
def read_session(TABLE_ID):
return client.read_session(
"projects/" + GCP_PROJECT_ID, DATASET_GCP_PROJECT_ID, TABLE_ID, DATASET_ID,
FEATURES + [LABEL], DTYPES, requested_streams=2
)
def extract_labels(input_dict):
features = dict(input_dict)
label = tf.cast(features.pop(LABEL), tf.float64)
return (features, label)
4단계: 데이터 수집
마지막으로 각 데이터 세트를 만든 다음 학습 데이터 세트의 첫 번째 배치를 출력합니다. BATCH_SIZE를 32로 정의했습니다. 이는 학습 속도와 정확도에 영향을 미치는 중요한 파라미터입니다.
BATCH_SIZE = 32
raw_train_data = read_session(TRAIN_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
raw_val_data = read_session(VAL_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
raw_test_data = read_session(TEST_TABLE_ID).parallel_read_rows().map(extract_labels).batch(BATCH_SIZE)
next(iter(raw_train_data)) # Print first batch
5. 모델 빌드
1단계: 데이터 전처리
데이터 세트의 각 특성에 대한 특성 열을 만들어 보겠습니다. 이 특정 데이터 세트에서는 모든 열이 numeric_column 유형이지만 다른 열 유형 (예: categorical_column)도 있습니다.
앞서 설명한 것처럼 네트워크가 더 빠르게 수렴되도록 데이터를 0을 중심으로 정규화합니다. 이 계산에 사용할 각 기능의 평균을 미리 계산했습니다.
MEANS = [94816.7387536405, 0.0011219465482001268, -0.0021445914636999603, -0.002317402958335562,
-0.002525792169927835, -0.002136576923287782, -3.7586818983702984, 8.135919975738768E-4,
-0.0015535579268265718, 0.001436137140461279, -0.0012193712736681508, -4.5364970422902533E-4,
-4.6175444671576083E-4, 9.92177789685366E-4, 0.002366229151475428, 6.710217226762278E-4,
0.0010325807119864225, 2.557260815835395E-4, -2.0804190062322664E-4, -5.057391100818653E-4,
-3.452114767842334E-6, 1.0145936326270006E-4, 3.839214074518535E-4, 2.2061197469126577E-4,
-1.5601580596677608E-4, -8.235017846415852E-4, -7.298316615408554E-4, -6.898459943652376E-5,
4.724125688297753E-5, 88.73235686453587]
def norm_data(mean, data):
data = tf.cast(data, tf.float32) * 1/(2*mean)
return tf.reshape(data, [-1, 1])
numeric_columns = []
for i, feature in enumerate(FEATURES):
num_col = tf.feature_column.numeric_column(feature, normalizer_fn=functools.partial(norm_data, MEANS[i]))
numeric_columns.append(num_col)
numeric_columns
2단계: 모델 빌드
이제 모델을 만들 준비가 되었습니다. 방금 만든 열을 네트워크에 피드합니다. 그런 다음 모델을 컴파일합니다. 불균형 데이터 세트에 유용한 정밀도/재현율 AUC 측정항목이 포함됩니다.
model = keras.Sequential([
tf.keras.layers.DenseFeatures(numeric_columns),
layers.Dense(64, activation='relu'),
layers.Dense(64, activation='relu'),
layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy', tf.keras.metrics.AUC(curve='PR')])
3단계: 모델 학습
오버샘플링 (소수 클래스에서 새 데이터 생성) 및 언더샘플링 (다수 클래스에서 데이터 감소)을 비롯해 불균형 데이터를 처리하는 다양한 기법이 있습니다.
이 Codelab에서는 소수 클래스를 잘못 분류할 때 손실에 더 많은 가중치를 부여하는 기법을 사용합니다. 사기 사례는 훨씬 적기 때문에 학습 시 class_weight 매개변수를 지정하고 '1' (사기)에 더 높은 가중치를 부여합니다.
이 실습에서는 3개의 에포크 (데이터 통과)를 사용하여 학습 속도를 높입니다. 실제 시나리오에서는 검증 세트의 정확도가 증가하지 않을 때까지 충분히 실행해야 합니다.
CLASS_WEIGHT = {
0: 1,
1: 100
}
EPOCHS = 3
train_data = raw_train_data.shuffle(10000)
val_data = raw_val_data
test_data = raw_test_data
model.fit(train_data, validation_data=val_data, class_weight=CLASS_WEIGHT, epochs=EPOCHS)
4단계: 모델 평가하기
evaluate() 함수는 모델이 본 적이 없는 테스트 데이터에 적용하여 객관적인 평가를 제공할 수 있습니다. 다행히도 이를 위해 테스트 데이터를 따로 마련해 두었습니다.
model.evaluate(test_data)
5단계: 탐색
이 실습에서는 BigQuery의 대규모 데이터 세트를 TensorFlow Keras 모델로 직접 수집하는 방법을 보여드렸습니다. 모델을 빌드하는 모든 단계도 살펴봤습니다. 마지막으로 불균형 분류 문제를 처리하는 방법을 간략하게 알아봤습니다.
다양한 아키텍처와 불균형 데이터 세트 접근 방식을 계속 실험하여 정확도를 개선할 수 있는지 확인해 보세요.
6. 삭제
이 노트북을 계속 사용하려면 사용하지 않을 때 노트북을 끄는 것이 좋습니다. Cloud 콘솔의 Notebooks UI에서 노트북을 선택한 다음 중지를 선택합니다.

이 실습에서 만든 모든 리소스를 삭제하려면 노트북 인스턴스를 중지하는 대신 삭제하면 됩니다.
Cloud 콘솔의 탐색 메뉴를 사용하여 스토리지로 이동하고 모델 애셋을 저장하기 위해 만든 두 버킷을 모두 삭제합니다.
