TensorFlow Enterprise 및 BigQuery로 Cloud AI Platform에서 사기 감지 모델 빌드

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 테이블을 선택합니다.

d5e78261514a90ef.png

각 탭을 클릭하여 데이터 세트에 관해 자세히 알아보세요.

  • 스키마 탭에는 데이터 유형이 설명되어 있습니다.
  • Details 탭에는 이 데이터가 284,407건의 거래로 구성된 불균형 데이터 세트이며 이 중 492건은 사기라고 설명되어 있습니다.
  • 미리보기 탭에는 데이터 세트의 레코드가 표시됩니다.

2단계: 테이블 쿼리

세부정보 탭에는 다음과 같은 데이터가 표시됩니다.

  • 시간은 데이터 세트의 첫 번째 트랜잭션과 선택한 트랜잭션의 시간 사이의 시간(초)입니다.
  • V1-V28은 데이터를 익명처리한 PCA라는 차원 축소 기법을 통해 변환된 열입니다.
  • Amount는 거래 금액입니다.

쿼리 테이블을 클릭하여 쿼리를 실행하여 자세히 살펴보겠습니다.

581e596426a98383.png

모든 열을 보려면 * 를 추가하도록 문을 업데이트하고 실행을 클릭합니다.

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`

e1e98a8315b62e9e.png

상관관계는 -1 (음의 상관관계)에서 1 (양의 상관관계)까지의 범위를 제공하며 0은 독립적입니다.

V1V2는 타겟 변수 (각각 약 -0.1 및 .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 '데이터 세트'를 만드는 것입니다. - 관련 테이블의 컨테이너입니다. 프로젝트를 선택한 상태에서 데이터 세트 만들기를 선택합니다.

1084d9f5edbf760b.png

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

e5b8646ebdf5f272.png

이제 학습, 테스트, 검증을 위해 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 테이블에 저장합니다.

49d20c9b4b62f6a7.png

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

6d83cf113a0682e1.png

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가 현재 사용 중지되어 있으면 사용 설정합니다.

9895a2fd3cdf8f8c.png

2단계: AI Platform Notebooks 인스턴스 만들기

Cloud 콘솔의 AI Platform Notebooks 섹션으로 이동하여 새 인스턴스를 클릭합니다. 그런 다음 GPU를 사용하지 않는 최신 TensorFlow Enterprise 1.x 인스턴스 유형을 선택합니다.

35301141e9fd3f44.png

기본 옵션을 사용한 다음 만들기를 클릭합니다. 인스턴스가 생성되면 JupyterLab 열기를 선택합니다.

3b801f8ff3db0f2f.png

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

58523671a252b95a.png

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단계: 모델 평가하기

Assessment() 함수는 모델이 본 적 없는 테스트 데이터에 적용하여 객관적인 평가를 제공할 수 있습니다. 다행히 이 작업을 위한 테스트 데이터는 따로 보관해 두었습니다.

model.evaluate(test_data)

5단계: 탐색 분석

이 실습에서는 대규모 데이터 세트를 BigQuery에서 TensorFlow Keras 모델로 직접 수집하는 방법을 살펴보았습니다. 또한 모델을 빌드하는 모든 단계를 살펴보았습니다. 마지막으로, 불균형한 분류 문제를 처리하는 방법에 관해 알아봤습니다.

불균형 데이터 세트에 대한 다양한 아키텍처와 접근 방식을 자유롭게 사용하면서 정확성을 개선할 수 있는지 확인해 보세요.

6. 삭제

이 노트북을 계속 사용하려면 사용하지 않을 때 노트북을 끄는 것이 좋습니다. Cloud 콘솔의 Notebooks UI에서 노트북을 선택한 다음 중지를 선택합니다.

57213ef2edad9257.png

이 실습에서 만든 모든 리소스를 삭제하려면 노트북 인스턴스를 중지하는 대신 삭제하면 됩니다.

Cloud 콘솔의 탐색 메뉴를 사용하여 Storage로 이동하고 모델 애셋을 저장하기 위해 만든 두 버킷을 모두 삭제합니다.