"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > BigQuery 및 XGBoost 통합: 이진 분류를 위한 Jupyter Notebook 튜토리얼

BigQuery 및 XGBoost 통합: 이진 분류를 위한 Jupyter Notebook 튜토리얼

2024-11-01에 게시됨
검색:490

BigQuery and XGBoost Integration: A Jupyter Notebook Tutorial for Binary Classification

소개

표 형식 데이터에 대한 이진 분류 모델을 선택하면서 저는 빠르고 비딥 러닝 모델인 GBDT(Gradient Boosting Decision Trees)를 빠르게 시험해 보기로 결정했습니다. 이 문서에서는 BigQuery를 데이터 소스로 사용하고 모델링을 위해 XGBoost 알고리즘을 사용하여 Jupyter Notebook 스크립트를 만드는 과정을 설명합니다.

완전한 스크립트

설명 없이 바로 스크립트로 넘어가고 싶은 분들을 위해 여기 있습니다. 프로젝트에 맞게 project_name,dataset_name, table_name을 조정해주세요.

import xgboost as xgb
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import precision_score, recall_score, f1_score, log_loss
from google.cloud import bigquery

# Function to load data from BigQuery
def load_data_from_bigquery(query):
    client = bigquery.Client()
    query_job = client.query(query)
    df = query_job.to_dataframe()
    return df

def compute_metrics(labels, predictions, prediction_probs):
    precision = precision_score(labels, predictions, average='macro')
    recall = recall_score(labels, predictions, average='macro')
    f1 = f1_score(labels, predictions, average='macro')
    loss = log_loss(labels, prediction_probs)
    return {
        'precision': precision,
        'recall': recall,
        'f1': f1,
        'loss': loss
    }

# Query in BigQuery
query = """
SELECT *
FROM `..`
"""

# Loading data
df = load_data_from_bigquery(query)

# Target data
y = df["reaction"]

# Input data
X = df.drop(columns=["reaction"], axis=1)

# Splitting data into training and validation sets
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=1)

# Training the XGBoost model
model = xgb.XGBClassifier(eval_metric='logloss')

# Setting the parameter grid
param_grid = {
    'max_depth': [3, 4, 5],
    'learning_rate': [0.01, 0.1, 0.2],
    'n_estimators': [100, 200, 300],
    'subsample': [0.8, 0.9, 1.0]
}

# Initializing GridSearchCV
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, scoring='accuracy', verbose=1, n_jobs=-1)

# Executing the grid search
grid_search.fit(X_train, y_train)

# Displaying the best parameters
print("Best parameters:", grid_search.best_params_)

# Model with the best parameters
best_model = grid_search.best_estimator_

# Predictions on validation data
val_predictions = best_model.predict(X_val)
val_prediction_probs = best_model.predict_proba(X_val)

# Predictions on training data
train_predictions = best_model.predict(X_train)
train_prediction_probs = best_model.predict_proba(X_train)

# Evaluating the model (validation data)
val_metrics = compute_metrics(y_val, val_predictions, val_prediction_probs)
print("Optimized Validation Metrics:", val_metrics)

# Evaluating the model (training data)
train_metrics = compute_metrics(y_train, train_predictions, train_prediction_probs)
print("Optimized Training Metrics:", train_metrics)

설명

BigQuery에서 데이터 로드

이전에는 데이터가 CSV 파일로 Cloud Storage에 저장되었지만 느린 데이터 로드로 인해 학습 프로세스의 효율성이 저하되어 더 빠른 데이터 처리를 위해 BigQuery로 전환하게 되었습니다.

BigQuery 클라이언트 설정

from google.cloud import bigquery
client = bigquery.Client()

이 코드는 환경 변수 또는 Google Cloud SDK를 통해 설정할 수 있는 Google Cloud 사용자 인증 정보를 사용하여 BigQuery 클라이언트를 초기화합니다.

데이터 쿼리 및 로드

def load_data_from_bigquery(query):
    query_job = client.query(query)
    df = query_job.to_dataframe()
    return df

이 함수는 SQL 쿼리를 실행하고 그 결과를 Pandas의 DataFrame으로 반환하므로 효율적인 데이터 처리가 가능합니다.

XGBoost를 사용하여 모델 훈련

XGBoost는 경사 부스팅을 활용한 고성능 기계 학습 알고리즘으로 분류 및 회귀 문제에 널리 사용됩니다.

https://arxiv.org/pdf/1603.02754

모델 초기화

import xgboost as xgb
model = xgb.XGBClassifier(eval_metric='logloss')

여기서 XGBClassifier 클래스는 로그 손실을 평가 지표로 사용하여 인스턴스화됩니다.

데이터 분할

from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=1)

이 기능은 데이터를 훈련 세트와 검증 세트로 분할하는데, 이는 모델 성능을 테스트하고 과적합을 방지하는 데 중요합니다.

매개변수 최적화

from sklearn.model_selection import GridSearchCV
param_grid = {
    'max_depth': [3, 4, 5],
    'learning_rate': [0.01, 0.1, 0.2],
    'n_estimators': [100, 200, 300],
    'subsample': [0.8, 0.9, 1.0]
}
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, scoring='accuracy', verbose=1, n_jobs=-1)
grid_search.fit(X_train, y_train)

GridSearchCV는 모델에 가장 적합한 매개변수 조합을 찾기 위해 교차 검증을 수행합니다.

모델 평가

모델의 성능은 검증 데이터세트의 정밀도, 재현율, F1 점수, 로그 손실을 사용하여 평가됩니다.

def compute_metrics(labels, predictions, prediction_probs):
    from sklearn.metrics import precision_score, recall_score, f1_score, log_loss
    return {
        'precision': precision_score(labels, predictions, average='macro'),
        'recall': recall_score(labels, predictions, average='macro'),
        'f1': f1_score(labels, predictions, average='macro'),
        'loss': log_loss(labels, prediction_probs)
    }
val_metrics = compute_metrics(y_val, val_predictions, val_prediction_probs)
print("Optimized Validation Metrics:", val_metrics)

출력 결과

노트북을 실행하면 최상의 매개변수와 모델 평가 측정항목을 보여주는 다음 출력을 얻게 됩니다.

Best parameters: {'learning_rate': 0.2, 'max_depth': 5, 'n_estimators': 300, 'subsample': 0.9}
Optimized Validation Metrics: {'precision': 0.8919952583956949, 'recall': 0.753797304483842, 'f1': 0.8078981867164722, 'loss': 0.014006406471894417}
Optimized Training Metrics: {'precision': 0.8969556573175115, 'recall': 0.7681976753444204, 'f1': 0.8199353049298048, 'loss': 0.012475375680566196}

추가 정보

Google Cloud Storage를 데이터 소스로 사용

어떤 경우에는 BigQuery보다 Google Cloud Storage에서 데이터를 로드하는 것이 더 적절할 수 있습니다. 다음 함수는 Cloud Storage에서 CSV 파일을 읽고 이를 Pandas의 DataFrame으로 반환하며, load_data_from_bigquery 함수와 상호 교환적으로 사용할 수 있습니다.

from google.cloud import storage

def load_data_from_gcs(bucket_name, file_path):
    client = storage.Client()
    bucket = client.get_bucket(bucket_name)
    blob = bucket.blob(file_path)
    data = blob.download_as_text()
    df = pd.read_csv(io.StringIO(data), encoding='utf-8')
    return df

사용 예:

bucket_name = ''
file_path = ''

df = load_data_from_gcs(bucket_name, file_path)

LightGBM으로 모델 훈련

XGBoost 대신 LightGBM을 사용하려면 동일한 설정에서 XGBClassifier를 LGBMClassifier로 간단히 교체하면 됩니다.

import lightgbm as lgb
model = lgb.LGBMClassifier()

결론

향후 기사에서는 학습에 BigQuery ML(BQML)을 사용하는 방법을 다룰 예정입니다.

릴리스 선언문 이 기사는 https://dev.to/suzuki0430/bigquery-and-xgboost-integration-a-jupyter-notebook-tutorial-for-binary-classification-1ocb?1에서 복제됩니다.1 침해가 있는 경우에는 Study_golang에 문의하세요. @163.com 삭제
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3