このトピックでは、XGBoost モデルをトレーニングし、それを使用して MaxCompute で予測を行う方法について説明します。
主要な概念
XGBoost (eXtreme Gradient Boosting) は、勾配ブースティングフレームワークを使用するアンサンブル学習アルゴリズムです。決定木モデルを繰り返し構築し、2 次導関数を使用して目的関数を最適化し、予測エラーを徐々に修正します。XGBoost は、構造化データに対する分類および回帰タスクの精度を向上させるように設計されています。その中心的な考え方は、複数の決定木モデルの予測結果を組み合わせて加法モデルにすることです。このプロセスは、損失関数を繰り返し最小化して、複雑な非線形関係を効率的にモデル化します。
範囲
このシナリオでは、アップグレードされた MaxFrame エンジンの特徴を使用します。これらの特徴は現在、招待プレビュー中です。このトピックのサンプルコードは参考用です。これらの特徴を試すには、チケットを送信してください。
利点
実際のビジネスシナリオでは、チーム間のコラボレーションが一般的です。アルゴリズムチームは、モデルのトレーニングに Python プログラミング言語を使用することを好むことがよくあります。対照的に、ビジネス分析チームはデータ分析に SQL を使用する傾向があります。MaxCompute を使用すると、MaxFrame エンジンと SQL エンジンが同じモデルオブジェクトを使用できます。これにより、言語や技術スタックの垣根を越えたコラボレーションにおける統合コストが削減されます。また、ユーザーは MaxCompute の AI 機能をビジネス分析に柔軟に適用できます。
データセットの概要
このトピックでは、古典的なボストンの住宅データセットを使用します。このデータセットには、1970 年代のボストン地域の住宅状況に関する情報が含まれています。トレーニングデータセットには 500 個のサンプルが含まれており、12 個の特徴と 1 個のターゲット変数があります。予測データセットには 6 個のサンプルが含まれており、トレーニングデータセットと同じ 12 個の特徴があります。
次の表に、データセットのフィールドを示します。
番号 | フィールド名 | タイプ | 意味 | 説明 |
1 | CRIM | 浮動 | 町ごとの一人当たりの犯罪率 | このフィールドは、各町の一人当たりの犯罪率を示します。犯罪率が高い地域ほど、一般的に住宅価格は低くなります。 |
2 | ZN | 浮動 | 25,000 平方フィートを超える区画に指定された住宅地の割合 | このフィールドは、町内の住宅地のうち、25,000 平方フィートを超える区画に指定された土地の割合を示します。 |
3 | INDUS | 浮動 | 町ごとの非小売業用地の割合 | このフィールドは、町内の土地のうち、工場や倉庫などの非小売業に使用される土地の割合を表します。 |
4 | CHAS | 整数 | 川に隣接 (1=はい, 0=いいえ) | これは、その地域がチャールズ川に隣接しているかどうかを示すバイナリフィールドです。 |
5 | NOX | 浮動 | 一酸化窒素濃度 (ppm) | このフィールドは、空気中の一酸化窒素濃度を百万分率 (ppm) で示します。 |
6 | RM | 浮動 | 住戸あたりの平均部屋数 | このフィールドは、住戸あたりの平均部屋数を表します。部屋数が多い住戸ほど、一般的に高価になります。 |
7 | AGE | 浮動 | 1940 年以前に建てられた持ち家の割合 | このフィールドは、1940 年以前に建てられた持ち家の割合を示します。 |
8 | DIS | 浮動 | ボストンの 5 つの雇用センターまでの加重距離 | このフィールドは、ボストンの 5 つの主要な雇用センターまでの加重距離を示します。これらのセンターに近い地域ほど、一般的に住宅価格は高くなります。 |
9 | RAD | 整数 | 放射状高速道路へのアクセシビリティのインデックス | このフィールドは、高速道路へのアクセシビリティインデックスを示します。インデックスが高いほど、アクセシビリティが良いことを意味します。 |
10 | TAX | 浮動 | 10,000 米ドルあたりの固定資産税率 | このフィールドは、10,000 米ドルあたりの固定資産税額を示します。税率が高いと、住宅価格に悪影響を及ぼす可能性があります。 |
11 | PTRATIO | 浮動 | 町ごとの生徒と教師の比率 | このフィールドは、町内の公立学校における生徒と教師の比率を示します。比率が高いほど、教育リソースが比較的乏しいことを示唆している可能性があります。 |
12 | LSTAT | 浮動 | 低所得者層の人口の割合 | このフィールドは、低所得者層と見なされる人口の割合を示します。低所得者層の割合が高い地域ほど、一般的に住宅価格は低くなります。 |
13 | MEDV | 浮動 | 持ち家の中央値 (千米ドル単位) | ターゲット変数: このフィールドは、その地域の持ち家の中央値を千米ドル単位で示します。これは、モデルが予測する必要がある値です。 |
前提条件
MaxCompute を有効化し、MaxCompute プロジェクトを作成し、プロジェクトでスキーマ構文が有効になっていることを確認します。
ローカルの Python 開発環境に、MaxFrame、scikit-learn、および xgboost パッケージの最新バージョンがインストールされていることを確認します。詳細については、「ローカル環境で MaxFrame を使用する」をご参照ください。
データの準備
必要なテーブルを作成し、データを入力します:
-- トレーニングデータテーブルを作成します。 CREATE TABLE IF NOT EXISTS demo_xgboost_train ( CRIM FLOAT comment '町ごとの一人当たりの犯罪率', ZN FLOAT comment '25,000 平方フィートを超える区画に指定された住宅地の割合', INDUS FLOAT comment '町ごとの非小売業用地の割合', CHAS INT comment '川に隣接 (1=はい, 0=いいえ)', NOX FLOAT comment '一酸化窒素濃度 (ppm)', RM FLOAT comment '住戸あたりの平均部屋数', AGE FLOAT comment '1940 年以前に建てられた持ち家の割合', DIS FLOAT comment 'ボストンの 5 つの雇用センターまでの加重距離', RAD FLOAT comment '放射状高速道路へのアクセシビリティのインデックス', TAX FLOAT comment '10,000 米ドルあたりの固定資産税率', PTRATIO FLOAT comment '町ごとの生徒と教師の比率', LSTAT FLOAT comment '低所得者層の人口の割合', MEDV FLOAT comment '持ち家の中央値 (千米ドル単位)' ); -- SQL と MaxFrame の予測データテーブルを作成します。 CREATE TABLE IF NOT EXISTS demo_xgboost_predict ( CRIM FLOAT comment '町ごとの一人当たりの犯罪率', ZN FLOAT comment '25,000 平方フィートを超える区画に指定された住宅地の割合', INDUS FLOAT comment '町ごとの非小売業用地の割合', CHAS INT comment '川に隣接 (1=はい, 0=いいえ)', NOX FLOAT comment '一酸化窒素濃度 (ppm)', RM FLOAT comment '住戸あたりの平均部屋数', AGE FLOAT comment '1940 年以前に建てられた持ち家の割合', DIS FLOAT comment 'ボストンの 5 つの雇用センターまでの加重距離', RAD FLOAT comment '放射状高速道路へのアクセシビリティのインデックス', TAX FLOAT comment '10,000 米ドルあたりの固定資産税率', PTRATIO FLOAT comment '町ごとの生徒と教師の比率', LSTAT FLOAT comment '低所得者層の人口の割合' ); -- MaxFrame 予測データテーブルを作成します。 CREATE TABLE IF NOT EXISTS demo_xgboost_predict_result ( CRIM DOUBLE comment '町ごとの一人当たりの犯罪率', ZN DOUBLE comment '25,000 平方フィートを超える区画に指定された住宅地の割合', INDUS DOUBLE comment '町ごとの非小売業用地の割合', CHAS BIGINT comment '川に隣接 (1=はい, 0=いいえ)', NOX DOUBLE comment '一酸化窒素濃度 (ppm)', RM DOUBLE comment '住戸あたりの平均部屋数', AGE DOUBLE comment '1940 年以前に建てられた持ち家の割合', DIS DOUBLE comment 'ボストンの 5 つの雇用センターまでの加重距離', RAD DOUBLE comment '放射状高速道路へのアクセシビリティのインデックス', TAX DOUBLE comment '10,000 米ドルあたりの固定資産税率', PTRATIO DOUBLE comment '町ごとの生徒と教師の比率', LSTAT DOUBLE comment '低所得者層の人口の割合', RESULT DOUBLE comment '持ち家の予測値' );Tunnel API を使用してデータをアップロードします:
TUNNEL UPLOAD xgboost_train_data.csv demo_xgboost_train; TUNNEL UPLOAD xgboost_predict.csv demo_xgboost_predict;
モデルのトレーニングと保存
MaxFrame を使用して XGBoost 回帰モデルをトレーニングします。
## セッションの初期化 from odps import ODPS import maxframe from maxframe import options o = ODPS('LT******************', 'Cz************************', 'project_name', 'endpoint', ) ## パラメーター構成 from maxframe.config import options options.sql.enable_mcqa = False # DPI エンジン "DPE" を使用します。 options.dag.settings = { "engine_order" : ["DPE", "MCSQL", "SPE"] } options.dpe.settings = { "odps.catalog_api_endpoint": "catalog_api_endpoint", } options.sql.settings = { "odps.session.image": "common", } options.service_role_arn = "acs:ram::13933481********:role/aliyunodpsdefaultrole" options.object_cache_url = "oss://oss-cn-beijing-internal.aliyuncs.com/models-*******/mfdemo" sess = maxframe.new_session(o) print(sess.get_logview_address()) ## モデルのトレーニングと生成 import numpy as np from sklearn.datasets import make_classification import maxframe.dataframe as md, maxframe.tensor as mt from maxframe.learn.contrib.xgboost import XGBRegressor # テーブル名とフィールドを定義します。 table_name = "demo_xgboost_train" # 特徴列とターゲット列。 features = ['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'lstat'] label = 'medv' # トレーニングデータを読み取ります。 df = md.read_odps_table( table_name, unknown_as_string=True # 非構造化データによるエラーを防ぎます。 ) # 特徴とラベルの処理。 X_train = df[features].fillna(-1) # 欠損値を埋めます。 y_train = df[label] # XGBoost 回帰モデルを初期化してトレーニングします。 model = XGBRegressor( n_estimators=300, learning_rate=0.1, colsample_bytree=0.8, n_jobs=-1, tree_method="hist", enable_categorical=True, objective='reg:squarederror' ) # 生成された XGBoost 回帰モデルを保存します。 model.fit(X_train, y_train).to_odps_model( model_name="demo_model_xgboost_regressor", model_version="v01", ).execute()トレーニング済みモデルを表示します。
DESC model demo_model_xgboost_regressor; +------------------------------------------------------------------------------------+ | Model Information | +------------------------------------------------------------------------------------+ | Owner: ALIYUN$*********************** | | Project: pd_test_model | | Schema: default | | Model Name: demo_model_xgboost_regressor | | Model Type: BOOSTED_TREE_REGRESSOR | | Source Type: INTERNAL_TRAIN | | Default Version: v01 | | CreateTime: 2025-09-12 13:15:16 | | LastModifiedTime: 2025-09-12 13:15:16 | | Model ID: 389c90e355264079923b89********** | +------------------------------------------------------------------------------------+ | Version Information | +------------------------------------------------------------------------------------+ | Owner: ALIYUN$*********************** | | Project: pd_test_model | | Schema: default | | Model Name: demo_model_xgboost_regressor | | Model Type: BOOSTED_TREE_REGRESSOR | | Source Type: INTERNAL_TRAIN | | Version Name: v01 | | Version ID: 99acd6cb93f845c8a4a9977********* | | Path: | | CreateTime: 2025-09-12 13:15:16 | | LastModifiedTime: 2025-09-12 13:15:16 | +------------------------------------------------------------------------------------+ | Input | Type | Comment | +------------------------------------------------------------------------------------+ | crim | float | | | zn | float | | | indus | float | | | chas | int | | | nox | float | | | rm | float | | | age | float | | | dis | float | | | rad | float | | | tax | float | | | ptratio | float | | | lstat | float | | +------------------------------------------------------------------------------------+
MaxFrame を使用したデータ予測
モデルをトレーニングした後、MaxFrame で次のプログラムを実行して、トレーニング済みモデルで予測を行います:
# 予測データテーブルと結果テーブルを定義します。 predict_table = "demo_xgboost_predict_mf" predict_result_table = "demo_xgboost_predict_result" # 予測データを読み取ります。 predict_data = md.read_odps_table( predict_table, unknown_as_string=True ) X_predict = predict_data[features].fillna(-1) y_predict = model.predict(X_predict) # 予測結果の DataFrame を構築します。 df_predict = predict_data[features].copy() df_predict['predicted_medv'] = y_predict.astype(np.float64) # 予測値を追加します。 # 予測結果を ODPS テーブルに書き込みます。 df_predict.to_odps_table( predict_result_table, overwrite=True, index=False, unknown_as_string=True ).execute()結果テーブルを表示します:
SELECT * FROM demo_xgboost_predict_result limit 10; +------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ | crim | zn | indus | chas | nox | rm | age | dis | rad | tax | ptratio | lstat | result | +------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ | 0.22438 | 0.0 | 9.69 | 0 | 0.585 | 6.027 | 79.7 | 2.4982 | 6.0 | 391.0 | 19.2 | 14.33 | 20.03961181640625 | | 0.06263 | 0.0 | 11.93 | 0 | 0.573 | 6.593 | 69.1 | 2.4786 | 1.0 | 273.0 | 21.0 | 9.67 | 24.491479873657227 | | 0.04527 | 0.0 | 11.93 | 0 | 0.573 | 6.12 | 76.7 | 2.2875 | 1.0 | 273.0 | 21.0 | 9.08 | 24.683202743530273 | | 0.06076 | 0.0 | 11.93 | 0 | 0.573 | 6.976 | 91.0 | 2.1675 | 1.0 | 273.0 | 21.0 | 5.64 | 32.33962631225586 | | 0.10959 | 0.0 | 11.93 | 0 | 0.573 | 6.794 | 89.3 | 2.3889 | 1.0 | 273.0 | 21.0 | 6.48 | 28.45917510986328 | | 0.04741 | 0.0 | 11.93 | 0 | 0.573 | 6.03 | 80.8 | 2.505 | 1.0 | 273.0 | 21.0 | 7.88 | 24.43267822265625 | +------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
SQL AI 関数を使用したデータ予測
作成したモデルと ML_PREDICT SQL 関数を使用して、住宅価格を予測します。
SET odps.sql.type.system.odps2=true;
SET odps.task.major.version=sqlml_master;
SET odps.sql.machine.learning.enable=true;
SELECT ML_PREDICT(demo_model_xgboost_regressor,v01,crim,zn,indus,chas,nox,rm,age,dis,rad,tax,ptratio,lstat)
FROM demo_xgboost_predict;
-- The following result is returned:
+------------+
| _c0 |
+------------+
| 20.039612 |
| 24.49148 |
| 24.683203 |
| 32.339626 |
| 28.459175 |
| 24.432678 |
+------------+同じモデルと予測データを使用する場合、MaxFrame エンジンと SQL エンジンからの推論結果は一致します。