BigQuery- und XGBoost-Integration: Ein Jupyter Notebook-Tutorial zur binären Klassifizierung

WBOY
Freigeben: 2024-08-12 18:51:34
Original
266 Leute haben es durchsucht

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

Einführung

Bei der Auswahl eines binären Klassifizierungsmodells für Tabellendaten habe ich beschlossen, schnell ein schnelles, nicht Deep-Learning-Modell auszuprobieren: Gradient Boosting Decision Trees (GBDT). Dieser Artikel beschreibt den Prozess der Erstellung eines Jupyter Notebook-Skripts mit BigQuery als Datenquelle und dem XGBoost-Algorithmus zur Modellierung.

Vollständiges Skript

Für diejenigen, die es vorziehen, ohne Erklärung direkt in das Drehbuch einzusteigen, ist es hier. Bitte passen Sie den Projektnamen, den Datensatznamen und den Tabellennamen an Ihr Projekt an.

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)
Nach dem Login kopieren

Erläuterung

Laden von Daten aus BigQuery

Früher wurden Daten in Cloud Storage als CSV-Dateien gespeichert, aber das langsame Laden der Daten verringerte die Effizienz unserer Lernprozesse und veranlasste den Wechsel zu BigQuery für eine schnellere Datenverarbeitung.

Einrichten des BigQuery-Clients

from google.cloud import bigquery
client = bigquery.Client()
Nach dem Login kopieren

Dieser Code initialisiert einen BigQuery-Client mit Google Cloud-Anmeldeinformationen, die über Umgebungsvariablen oder das Google Cloud SDK eingerichtet werden können.

Daten abfragen und laden

def load_data_from_bigquery(query):
    query_job = client.query(query)
    df = query_job.to_dataframe()
    return df
Nach dem Login kopieren

Diese Funktion führt eine SQL-Abfrage aus und gibt die Ergebnisse als DataFrame in Pandas zurück, was eine effiziente Datenverarbeitung ermöglicht.

Trainieren des Modells mit XGBoost

XGBoost ist ein leistungsstarker Algorithmus für maschinelles Lernen, der Gradient Boosting nutzt und häufig für Klassifizierungs- und Regressionsprobleme verwendet wird.

https://arxiv.org/pdf/1603.02754

Modellinitialisierung

import xgboost as xgb
model = xgb.XGBClassifier(eval_metric='logloss')
Nach dem Login kopieren

Hier wird die XGBClassifier-Klasse instanziiert, wobei der Protokollverlust als Bewertungsmetrik verwendet wird.

Datenaufteilung

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)
Nach dem Login kopieren

Diese Funktion teilt die Daten in Trainings- und Validierungssätze auf, was entscheidend ist, um die Leistung des Modells zu testen und eine Überanpassung zu vermeiden.

Parameteroptimierung

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)
Nach dem Login kopieren

GridSearchCV führt eine Kreuzvalidierung durch, um die beste Kombination von Parametern für das Modell zu finden.

Modellbewertung

Die Leistung des Modells wird anhand von Präzision, Rückruf, F1-Score und Protokollverlust im Validierungsdatensatz bewertet.

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)
Nach dem Login kopieren

Ergebnisse ausgeben

Wenn Sie das Notebook ausführen, erhalten Sie die folgende Ausgabe mit den besten Parametern und den Modellbewertungsmetriken.

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}
Nach dem Login kopieren

Weitere Informationen

Verwendung von Google Cloud Storage als Datenquelle

In manchen Fällen kann es sinnvoller sein, Daten aus Google Cloud Storage statt aus BigQuery zu laden. Die folgende Funktion liest eine CSV-Datei aus Cloud Storage und gibt sie als DataFrame in Pandas zurück und kann austauschbar mit der Funktion „load_data_from_bigquery“ verwendet werden.

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
Nach dem Login kopieren

Anwendungsbeispiel:

bucket_name = '<bucket-name>'
file_path = '<file-path>'

df = load_data_from_gcs(bucket_name, file_path)
Nach dem Login kopieren

Ein Modell mit LightGBM trainieren

Wenn Sie LightGBM anstelle von XGBoost verwenden möchten, können Sie im selben Setup einfach den XGBClassifier durch LGBMClassifier ersetzen.

import lightgbm as lgb
model = lgb.LGBMClassifier()
Nach dem Login kopieren

Abschluss

Zukünftige Artikel werden die Verwendung von BigQuery ML (BQML) für das Training behandeln.

Das obige ist der detaillierte Inhalt vonBigQuery- und XGBoost-Integration: Ein Jupyter Notebook-Tutorial zur binären Klassifizierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage