”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > BigQuery 和 XGBoost 集成:用于二元分类的 Jupyter Notebook 教程

BigQuery 和 XGBoost 集成:用于二元分类的 Jupyter Notebook 教程

发布于2024-11-01
浏览:223

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

介绍

在为表格数据选择二元分类模型时,我决定快速尝试一种快速的非深度学习模型:梯度提升决策树(GBDT)。本文介绍了使用 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 凭据初始化 BigQuery 客户端,该凭据可以通过环境变量或 Google Cloud SDK 设置。

查询和加载数据

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云存储作为数据源

在某些情况下,从 Google Cloud Storage 而不是 BigQuery 加载数据可能更合适。以下函数从 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 训练模型

如果您想使用 LightGBM 而不是 XGBoost,您只需在同一设置中将 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如有侵犯,请联系[email protected]删除
最新教程 更多>
  • uick Wins 加速您的网站并增强性能
    uick Wins 加速您的网站并增强性能
    页面加载时间的定义 页面加载时间是指网页完全显示其内容所需的持续时间,从用户单击链接或输入 URL 的那一刻起,直到所有内容完全加载。它包括所有文本、图像、视频和其他元素在页面上变得可见和可用所需的时间。较短的加载时间意味着为用户提供更流畅、更无缝的体验,而较长的加载时间可能会导致...
    编程 发布于2024-11-08
  • Web Worker 与 Service Worker
    Web Worker 与 Service Worker
    介绍 当我第一次听到这些术语时,我想,好吧,他们正在用单独的线程做同样的事情。那么为什么我们需要这两个术语? 但说实话,这两个术语及其行为方式之间存在巨大差异。 会尝试详细解释。 这两个之间的共同点是 它们在单独的线程中运行,不会阻塞 Javascript 的主单线程。 Web W...
    编程 发布于2024-11-08
  • OpenCV 图像压缩完整指南
    OpenCV 图像压缩完整指南
    图像压缩是计算机视觉中的一项关键技术,它使我们能够更有效地存储和传输图像,同时保持视觉质量。理想情况下,我们希望拥有最佳质量的小文件。然而,我们必须做出权衡并决定哪个更重要。 本教程将教授使用 OpenCV 进行图像压缩,涵盖理论和实际应用。最后,您将了解如何为计算机视觉项目(或您可能拥有的任何其...
    编程 发布于2024-11-08
  • 何时应在 Python 中使用多个 if 与 If-elif 语句以获得最佳性能?
    何时应在 Python 中使用多个 if 与 If-elif 语句以获得最佳性能?
    Python 中的多个 If 与 Elif 语句在 Python 中,在评估条件语句时,可以使用多个 if 语句或单个 if -elif 声明。虽然两种方法可以实现相同的结果,但存在一些可能影响代码效率的关键差异。在您提出的场景中:if text == 'sometext': print(t...
    编程 发布于2024-11-08
  • 为什么应该始终向环境变量添加类型安全?
    为什么应该始终向环境变量添加类型安全?
    一点背景 如果您已经编码了一段时间,您就会知道环境变量的重要性及其所扮演的角色,以及找出由于项目中未设置该死的环境变量而导致的错误的痛苦, 哈哈! 今年早些时候,我在一家基于产品的初创公司担任全栈开发人员实习生。随着项目的增长,环境变量的数量也随之增加。而且,每个人都在不同的分支上...
    编程 发布于2024-11-08
  • Java 编程语言的历史
    Java 编程语言的历史
    Java 是世界上最流行的编程语言之一,以其多功能性、可靠性和效率而闻名。它多年来的发展和成长塑造了我们今天使用的大部分技术。回顾一下 Java 的历史。 1。 Java 的起源 Java 由 James Gosling 与 Mike Sheridan 和 Patrick Naughton 一起开发...
    编程 发布于2024-11-08
  • React 库简介:)
    React 库简介:)
    It is a popular open-source JavaScript library used for building user interfaces, particularly single-page applications (SPA). Isomorphic Tech...
    编程 发布于2024-11-08
  • 如何使用链接打开本地文件夹?
    如何使用链接打开本地文件夹?
    通过链接打开本地文件夹通过链接打开本地文件夹进行了多次尝试,例如: 打开文件夹</a>
    编程 发布于2024-11-08
  • 如何在 JavaScript 和 jQuery 中无缝访问 PHP 变量?
    如何在 JavaScript 和 jQuery 中无缝访问 PHP 变量?
    在 JavaScript 或 jQuery 中访问 PHP 变量:避免 Echo 过载许多开发人员遇到在 JavaScript 和 jQuery 中访问 PHP 变量的挑战。传统方法涉及回显 PHP 标签内的变量,例如:<?php echo $variable1; ?> <?php...
    编程 发布于2024-11-08
  • 为什么我的 `` 元素不继承其父元素的字体样式?
    为什么我的 `` 元素不继承其父元素的字体样式?
    字体继承不兼容在CSS中,元素继承其父元素的字体属性,例如元素。但是, 元素并不总是遵循此规则。在提供的示例中, 和 元素共享 Verdana 字体,但 元素显示为“MS壳牌Dlg”。这是因为表单元素(包括 )具有默认字体设置,该设置会覆盖继承的字体属性。覆盖默认字体确保所有字体继承一致元素时,...
    编程 发布于2024-11-08
  • 集成与端到端(E 测试:了解它们的差异以及何时使用它们
    集成与端到端(E 测试:了解它们的差异以及何时使用它们
    在软件开发中,测试在确保应用程序到达最终用户之前的可靠性和性能方面发挥着至关重要的作用。由于可用的测试方法多种多样,因此了解哪种方法适合您的需求非常重要。两种广泛使用的测试方法是集成测试和端到端(E2E)测试。两者都旨在验证系统是否正常工作,但他们从不同的角度进行验证。在这篇文章中,我们将探讨集成...
    编程 发布于2024-11-08
  • 初级后端开发人员寻求无偿工作以获得经验
    初级后端开发人员寻求无偿工作以获得经验
    大家好, 我叫 Harith,是一名初级后端开发人员。我对使用 Python 和 Django 框架进行 Web 开发非常感兴趣。我希望通过为开源项目做出贡献来获得更多实践经验。 我提供什么: 愿意在没有任何报酬的情况下参与项目,因为我的主要目标是提高我的技能和拓宽我的知识。 了解 Django 和...
    编程 发布于2024-11-08
  • 如何在 Python 中检查列表是否共享任何项目?
    如何在 Python 中检查列表是否共享任何项目?
    在 Python 中测试列表是否共享任何项目简介在 Python 中处理多个列表时,通常需要确定是否有元素重叠在这些列表之间。这是各种数据分析和操作任务的基本操作。简答在 Python 中测试列表重叠的推荐方法是利用 not set(a).isdisjoint(b ) 表达。它为此任务提供了一种普遍...
    编程 发布于2024-11-08
  • Node.js 中与 WebSockets 和 Socket.IO 的实时通信
    Node.js 中与 WebSockets 和 Socket.IO 的实时通信
    现代 Web 应用程序通常需要实时通信,无论是聊天系统、实时更新、协作编辑还是通知。传统的 HTTP 通信不足以满足实时应用程序的需要,因为它依赖于请求-响应模式。这就是 WebSockets 发挥作用的地方,它允许服务器和客户端之间进行全双工通信。 在本文中,我们将探讨: WebSocket 是什...
    编程 发布于2024-11-08
  • 如何解决使用 JavaScript 更改 iframe src 的问题
    如何解决使用 JavaScript 更改 iframe src 的问题
    使用 JavaScript 更改 iframe src:疑难解答单击单选按钮时更改 iframe 的 src 属性时遇到问题。要纠正此问题,必须检查代码以确定确切的原因。一个可能的问题是括号的错误使用。在您的代码中,该行:document.getElementById['calendar'].src...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3