在Cloud ML Engine上部署XGBoost模型实现在线预测
本文将详细介绍如何在Google Cloud ML Engine平台上部署XGBoost模型并实现在线预测功能。我们将使用美国人口普查收入数据集作为示例,完整演示从模型训练到在线预测的整个流程。
准备工作
在开始之前,我们需要完成以下准备工作:
- 创建GCP项目:在Google Cloud Platform上创建一个新项目
- 设置GCS存储桶:创建用于存储模型文件的Google Cloud Storage存储桶
- 启用API服务:启用AI Platform Training and Prediction和Compute Engine API
- 安装必要工具:
- Cloud SDK:用于与Google Cloud产品交互
- XGBoost:用于构建和训练模型
- scikit-learn:用于数据预处理
- NumPy和pandas:用于数据处理
- Google API Python Client:用于调用Google API
环境变量设置
在开始实际工作前,我们需要设置一些环境变量:
PROJECT_ID = "your-project-id" # 替换为你的GCP项目ID
BUCKET_ID = "your-bucket-id" # 替换为你的GCS存储桶ID
MODEL_NAME = "census" # 模型名称
VERSION_NAME = "v1" # 版本名称
REGION = "us-central1" # 部署区域
INPUT_DATA_FILE = "data.json" # 输入数据文件
数据集准备
我们使用美国人口普查收入数据集,该数据集包含以下文件:
- 训练数据:
adult.data
- 测试数据:
adult.test
数据集包含以下特征列:
age, workclass, fnlwgt, education, education-num, marital-status,
occupation, relationship, race, sex, capital-gain, capital-loss,
hours-per-week, native-country, income-level
其中income-level
是我们的预测目标(是否收入超过50K美元)。
模型训练与保存
1. 数据预处理
首先,我们需要加载数据并进行预处理:
import xgboost as xgb
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# 加载数据
raw_training_data = pd.read_csv('census_data/adult.data', header=None, names=COLUMNS)
raw_testing_data = pd.read_csv('census_data/adult.test', names=COLUMNS, skiprows=1)
# 分离特征和标签
train_features = raw_training_data.drop('income-level', axis=1)
train_labels = (raw_training_data['income-level'] == ' >50K')
test_features = raw_testing_data.drop('income-level', axis=1)
test_labels = (raw_testing_data['income-level'] == ' >50K.')
# 对分类特征进行编码
CATEGORICAL_COLUMNS = ('workclass', 'education', 'marital-status',
'occupation', 'relationship', 'race', 'sex', 'native-country')
encoders = {col:LabelEncoder() for col in CATEGORICAL_COLUMNS}
for col in CATEGORICAL_COLUMNS:
train_features[col] = encoders[col].fit_transform(train_features[col])
test_features[col] = encoders[col].fit_transform(test_features[col])
2. 训练XGBoost模型
将数据转换为XGBoost的DMatrix格式并训练模型:
# 转换为DMatrix格式
dtrain = xgb.DMatrix(train_features, train_labels)
dtest = xgb.DMatrix(test_features)
# 训练模型
bst = xgb.train({}, dtrain, 20)
# 保存模型
bst.save_model('model.bst')
模型部署到AI Platform
1. 上传模型到GCS
将训练好的模型文件上传到Google Cloud Storage:
gsutil cp ./model.bst gs://$BUCKET_ID/model.bst
注意:上传的模型文件名必须为model.bst
(对于XGBoost模型),这是AI Platform的要求。
2. 创建模型资源
在AI Platform上创建一个模型容器:
gcloud ml-engine models create $MODEL_NAME --regions $REGION
3. 创建模型版本
创建模型版本并关联我们上传的模型文件:
curl -X POST -H "Content-Type: application/json" \
-d '{"name": "'$VERSION_NAME'", "deploymentUri": "gs://'$BUCKET_ID'/", "runtimeVersion": "1.4", "framework": "XGBOOST"}' \
-H "Authorization: Bearer `gcloud auth print-access-token`" \
https://ml.googleapis.com/v1/projects/$PROJECT_ID/models/$MODEL_NAME/versions
关键参数说明:
runtimeVersion
: 设置为"1.4"(使用XGBoost 0.6)framework
: 设置为"XGBOOST"
在线预测
1. 准备预测数据
我们需要将测试数据转换为JSON格式,以便用于在线预测:
import json
import numpy as np
data = []
for i in range(len(test_features)):
data.append([])
for col in COLUMNS[:-1]: # 忽略'income-level'列
# 将numpy整数转换为标准整数
data[i].append(int(np.uint64(test_features[col][i]).item()))
# 保存为JSON文件
with open('data.json', 'w') as outfile:
json.dump(data, outfile)
2. 执行在线预测
使用gcloud命令进行预测:
gcloud ml-engine predict --model $MODEL_NAME --version $VERSION_NAME --json-instances $INPUT_DATA_FILE
预测结果将显示每个人收入是否超过50K的概率。
总结
通过本文,我们完整演示了如何在Cloud ML Engine上部署XGBoost模型并实现在线预测的流程,包括:
- 数据准备和预处理
- XGBoost模型训练
- 模型上传到Google Cloud Storage
- 在AI Platform上创建模型和版本
- 执行在线预测
这种方法可以轻松地将机器学习模型部署为可扩展的Web服务,无需担心基础设施管理问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考