将机器学习和 AI 与 BigQuery DataFrames 搭配使用

BigQuery DataFrames 使用 bigframes.ml 库为 BigQuery DataFrames 提供机器学习和 AI 功能。

您可以在 BigQuery DataFrames 中预处理数据创建用于训练模型的 Estimator创建机器学习流水线,以及拆分训练数据集和测试数据集

所需的角色

如需获得完成本文档中的任务所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

机器学习位置

bigframes.ml 库支持与 BigQuery ML 相同的位置。所有 BigQuery 区域都支持 BigQuery ML 模型预测和其他机器学习函数。对模型训练的支持因区域而异。如需了解详情,请参阅 BigQuery ML 位置

预处理数据

使用 bigframes.ml.preprocessing 模块bigframes.ml.compose 模块创建转换器,以便准备好数据以用于估计器(模型)。BigQuery DataFrames 提供以下转换:

  • 如需将连续数据按间隔分箱,请使用 bigframes.ml.preprocessing 模块中的 KBinsDiscretizer

  • 如需将目标标签标准化为整数值,请使用 bigframes.ml.preprocessing 模块中的 LabelEncoder

  • 如需将每个特征按其最大绝对值缩放到 [-1, 1] 范围,请使用 bigframes.ml.preprocessing 模块中的 MaxAbsScaler

  • 如需通过将每个特征缩放到 [0, 1] 范围来标准化特征,请使用 bigframes.ml.preprocessing 模块中的 MinMaxScaler

  • 如需通过移除平均值并伸缩到单位方差来标准化特征,请使用 bigframes.ml.preprocessing 模块中的 StandardScaler

  • 如需将分类值转换为数字格式,请使用 bigframes.ml.preprocessing 模块中的 OneHotEncoder

  • 如需将 Transformer 应用于 DataFrame 列,请使用 bigframes.ml.compose 模块中的 ColumnTransformer

训练模型

您可以创建Estimator以在 BigQuery DataFrames 中训练模型。

聚类模型

您可以使用 bigframes.ml.cluster 模块为聚类模型创建 Estimator。 如需创建 K-means 聚类模型,请使用 KMeans。使用这些模型进行数据细分。例如,标识客户细分。K-means 是一种非监督式学习技术,因此模型训练不需要标签,也不需要为训练或评估拆分数据。

您可以使用 bigframes.ml.cluster 模块为聚类模型创建 Estimator。

以下代码示例展示如何使用 bigframes.ml.cluster KMeans 类创建用于数据细分的 k-means 聚类模型:

from bigframes.ml.cluster import KMeans
import bigframes.pandas as bpd

# Load data from BigQuery
query_or_table = "bigquery-public-data.ml_datasets.penguins"
bq_df = bpd.read_gbq(query_or_table)

# Create the KMeans model
cluster_model = KMeans(n_clusters=10)
cluster_model.fit(bq_df["culmen_length_mm"], bq_df["sex"])

# Predict using the model
result = cluster_model.predict(bq_df)
# Score the model
score = cluster_model.score(bq_df)

分解模型

您可以使用 bigframes.ml.decomposition 模块为分解模型创建 Estimator。 如需创建主成分分析 (PCA) 模型,请使用 PCA。使用这些模型计算主成分并使用主成分对数据执行基变换。使用 PCA 类可实现降维,具体方法是将每个数据点仅投影到前几个主成分上,以获得维度较低的数据,并保留尽可能多的数据差异性。

集成学习模型

您可以使用 bigframes.ml.ensemble 模块为集成学习模型创建 Estimator。

  • 如需创建随机森林分类器模型,请使用 RandomForestClassifier。使用这些模型构建多个学习方法决策树以用于分类。

  • 如需创建随机森林回归模型,请使用 RandomForestRegressor。使用这些模型构建多个学习方法决策树以用于回归。

  • 如需创建梯度提升树分类器模型,请使用 XGBClassifier。使用这些模型以累加方式构建多个学习方法决策树以用于分类。

  • 如需创建梯度提升树回归模型,请使用 XGBRegressor。使用这些模型以累加方式构建多个学习方法决策树以用于回归。

预测模型

您可以使用 bigframes.ml.forecasting 模块为预测模型创建 Estimator。 如需创建时序预测模型,请使用 ARIMAPlus

导入的模型

您可以使用 bigframes.ml.imported 模块为导入的模型创建 Estimator。

线性模型

使用 bigframes.ml.linear_model 模块为线性模型创建 Estimator。

  • 如需创建线性回归模型,请使用 LinearRegression。使用这些模型进行预测,例如预测给定日期的商品销售额。

  • 如需创建逻辑回归模型,请使用 LogisticRegression。使用这些模型对两个或多个可能值进行分类,例如输入是 low-valuemedium-value 还是 high-value

以下代码示例展示如何使用 bigframes.ml 执行以下操作:

from bigframes.ml.linear_model import LinearRegression
import bigframes.pandas as bpd

# Load data from BigQuery
query_or_table = "bigquery-public-data.ml_datasets.penguins"
bq_df = bpd.read_gbq(query_or_table)

# Filter down to the data to the Adelie Penguin species
adelie_data = bq_df[bq_df.species == "Adelie Penguin (Pygoscelis adeliae)"]

# Drop the species column
adelie_data = adelie_data.drop(columns=["species"])

# Drop rows with nulls to get training data
training_data = adelie_data.dropna()

# Specify your feature (or input) columns and the label (or output) column:
feature_columns = training_data[
    ["island", "culmen_length_mm", "culmen_depth_mm", "flipper_length_mm", "sex"]
]
label_columns = training_data[["body_mass_g"]]

test_data = adelie_data[adelie_data.body_mass_g.isnull()]

# Create the linear model
model = LinearRegression()
model.fit(feature_columns, label_columns)

# Score the model
score = model.score(feature_columns, label_columns)

# Predict using the model
result = model.predict(test_data)

大语言模型

您可以使用 bigframes.ml.llm 模块为 LLM 创建 Estimator。

  • 如需创建 Gemini 文本生成器模型,请使用 GeminiTextGenerator。使用这些模型可执行文本生成任务。

  • 如需为远程大语言模型 (LLM) 创建 Estimator,请使用 bigframes.ml.llm 模块。

以下代码示例展示如何使用 bigframes.ml.llm GeminiTextGenerator 类创建用于生成代码的 Gemini 模型:

from bigframes.ml.llm import GeminiTextGenerator
import bigframes.pandas as bpd

# Create the Gemini LLM model
session = bpd.get_global_session()
connection = f"{PROJECT_ID}.{REGION}.{CONN_NAME}"
model = GeminiTextGenerator(
    session=session, connection_name=connection, model_name="gemini-2.0-flash-001"
)

df_api = bpd.read_csv("gs://cloud-samples-data/vertex-ai/bigframe/df.csv")

# Prepare the prompts and send them to the LLM model for prediction
df_prompt_prefix = "Generate Pandas sample code for DataFrame."
df_prompt = df_prompt_prefix + df_api["API"]

# Predict using the model
df_pred = model.predict(df_prompt.to_frame(), max_output_tokens=1024)

远程模型

如需使用 BigQuery DataFrames 机器学习远程模型(bigframes.ml.remotebigframes.ml.llm),您必须启用以下 API:

使用 BigQuery DataFrames ML 远程模型时,如果您使用的是默认 BigQuery 连接,则需要Project IAM Admin 角色 (roles/resourcemanager.projectIamAdmin);如果您使用的是预配置连接,则需要Browser 角色 (roles/browser)。您可以通过将 bigframes.pandas.options.bigquery.skip_bq_connection_check 选项设置为 True 来避免此要求,在这种情况下,连接(默认连接或预配置连接)会按原样使用,而不会进行任何存在或权限检查。如果您使用的是预配置连接并跳过连接检查,请验证以下各项:

  • 连接是在正确的位置创建的。
  • 如果您使用的是 BigQuery DataFrames ML 远程模型,则服务账号在项目中具有 Vertex AI User 角色 (roles/aiplatform.user)。

在 BigQuery DataFrames 中创建远程模型会创建 BigQuery 连接。默认情况下,系统会使用名为 bigframes-default-connection 的连接。 如果您愿意,可以使用预配置的 BigQuery 连接,在这种情况下会跳过连接创建。系统会向默认连接的服务账号授予项目中的 Vertex AI User 角色 (roles/aiplatform.user)。

创建流水线

您可以使用 bigframes.ml.pipeline 模块创建机器学习流水线。借助流水线,您可以在设置不同的参数时组合多个要进行交叉验证的机器学习步骤。这样可简化代码,并且允许您一起部署数据预处理步骤和 Estimator。

如需创建具有最终 Estimator 的转换流水线,请使用 Pipeline

选择模型

如需拆分训练数据集和测试数据集并选择最佳模型,请使用 bigframes.ml.model_selection 模块

  • 如以下代码示例所示,使用 train_test_split 函数将数据拆分为训练集和测试(评估)集:

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    
  • 如需创建多折训练集和测试集以训练和评估模型,请使用 KFoldKFold.split 方法,如以下代码示例所示。此功能对于小型数据集非常有用。

    kf = KFold(n_splits=5)
    for i, (X_train, X_test, y_train, y_test) in enumerate(kf.split(X, y)):
    # Train and evaluate models with training and testing sets
    
  • 如需自动创建多折训练集和测试集,训练和评估模型,并获取每个折叠的结果,请使用 cross_validate 函数,如以下代码示例所示:

    scores = cross_validate(model, X, y, cv=5)
    

后续步骤