すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:MaxCompute を使用して XGBoost モデルでトレーニングと予測を行う

最終更新日:Nov 09, 2025

このトピックでは、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

浮動

持ち家の中央値 (千米ドル単位)

ターゲット変数: このフィールドは、その地域の持ち家の中央値を千米ドル単位で示します。これは、モデルが予測する必要がある値です。

前提条件

データの準備

  1. 必要なテーブルを作成し、データを入力します:

    -- トレーニングデータテーブルを作成します。
    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 '持ち家の予測値'
    );
  2. Tunnel API を使用してデータをアップロードします:

    xgboost_train_data.csv

    xgboost_predict.csv

    TUNNEL UPLOAD xgboost_train_data.csv demo_xgboost_train;
    TUNNEL UPLOAD xgboost_predict.csv demo_xgboost_predict;

モデルのトレーニングと保存

  1. 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()
  2. トレーニング済みモデルを表示します。

    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 を使用したデータ予測

  1. モデルをトレーニングした後、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()
  2. 結果テーブルを表示します:

    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 エンジンからの推論結果は一致します。