"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Integração BigQuery e XGBoost: um tutorial do Jupyter Notebook para classificação binária

Integração BigQuery e XGBoost: um tutorial do Jupyter Notebook para classificação binária

Publicado em 01/11/2024
Navegar:965

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

Introdução

Ao selecionar um modelo de classificação binária para dados tabulares, decidi experimentar rapidamente um modelo de aprendizado rápido e não profundo: Gradient Boosting Decision Trees (GBDT). Este artigo descreve o processo de criação de um script do Jupyter Notebook usando o BigQuery como fonte de dados e o algoritmo XGBoost para modelagem.

Roteiro Completo

Para quem prefere ir direto para o roteiro sem explicação, aqui está. Ajuste project_name, dataset_name e table_name para se adequar ao seu projeto.

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)

Explicação

Carregando dados do BigQuery

Anteriormente, os dados eram armazenados no Cloud Storage como arquivos CSV, mas o carregamento lento dos dados reduzia a eficiência dos nossos processos de aprendizagem, o que levou à mudança para o BigQuery para um processamento de dados mais rápido.

Configurando o cliente BigQuery

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

Esse código inicializa um cliente do BigQuery usando credenciais do Google Cloud, que podem ser configuradas por meio de variáveis ​​de ambiente ou do SDK do Google Cloud.

Consultando e carregando dados

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

Esta função executa uma consulta SQL e retorna os resultados como um DataFrame no Pandas, permitindo um processamento de dados eficiente.

Treinando o modelo com XGBoost

XGBoost é um algoritmo de aprendizado de máquina de alto desempenho que utiliza aumento de gradiente, amplamente utilizado para problemas de classificação e regressão.

https://arxiv.org/pdf/1603.02754

Inicialização do modelo

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

Aqui, a classe XGBClassifier é instanciada, usando perda de log como métrica de avaliação.

Divisão de dados

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)

Esta função divide os dados em conjuntos de treinamento e validação, o que é crucial para testar o desempenho do modelo e evitar overfitting.

Otimização de parâmetros

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 realiza validação cruzada para encontrar a melhor combinação de parâmetros para o modelo.

Avaliação do modelo

O desempenho do modelo é avaliado usando precisão, recall, pontuação F1 e perda de log no conjunto de dados de validação.

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)

Resultados de saída

Ao executar o notebook, você obterá a seguinte saída mostrando os melhores parâmetros e as métricas de avaliação do modelo.

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}

Informações adicionais

Usando o Google Cloud Storage como fonte de dados

Em alguns casos, pode ser mais apropriado carregar dados do Google Cloud Storage em vez do BigQuery. A função a seguir lê um arquivo CSV do Cloud Storage e o retorna como um DataFrame no Pandas e pode ser usada de forma intercambiável com a função 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

Exemplo de uso:

bucket_name = ''
file_path = ''

df = load_data_from_gcs(bucket_name, file_path)

Treinando um modelo com LightGBM

Se você quiser usar LightGBM em vez de XGBoost, você pode simplesmente substituir o XGBClassifier por LGBMClassifier na mesma configuração.

import lightgbm as lgb
model = lgb.LGBMClassifier()

Conclusão

Os artigos futuros abordarão o uso do BigQuery ML (BQML) para treinamento.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/suzuki0430/bigquery-and-xgboost-integration-a-jupyter-notebook-tutorial-for-binary-classification-1ocb?1 Se houver alguma violação, entre em contato com study_golang @163.com excluir
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3