>백엔드 개발 >파이썬 튜토리얼 >BigQuery 및 XGBoost 통합: 이진 분류를 위한 Jupyter Notebook 튜토리얼

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

WBOY
WBOY원래의
2024-08-12 18:51:34268검색

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 `<project_name>.<dataset_name>.<table_name>`
"""

# 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 = '<bucket-name>'
file_path = '<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)을 사용하는 방법을 다룰 예정입니다.

위 내용은 BigQuery 및 XGBoost 통합: 이진 분류를 위한 Jupyter Notebook 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.