全部产品
Search
文档中心

MaxCompute:Melatih dan memprediksi dengan model XGBoost menggunakan MaxCompute

更新时间:Nov 10, 2025

Topik ini menjelaskan cara melatih model XGBoost dan menggunakannya untuk melakukan prediksi dengan MaxCompute.

Konsep utama

XGBoost (eXtreme Gradient Boosting) adalah algoritma pembelajaran ensemble berbasis kerangka kerja gradient boosting. Algoritma ini secara iteratif membangun model pohon keputusan dengan memanfaatkan turunan orde kedua untuk mengoptimalkan fungsi objektif serta memperbaiki kesalahan prediksi secara bertahap. XGBoost dirancang untuk meningkatkan akurasi pada tugas klasifikasi dan regresi dengan data terstruktur. Inti dari pendekatan ini adalah menggabungkan prediksi dari beberapa pohon keputusan menjadi model aditif yang secara iteratif meminimalkan fungsi loss guna memodelkan hubungan non-linear yang kompleks secara efisien.

Lingkup

Skenario ini memanfaatkan fitur-fitur dari mesin MaxFrame yang telah ditingkatkan. Fitur-fitur tersebut saat ini berada dalam pratinjau undangan. Kode contoh dalam topik ini hanya bersifat referensi. Untuk mencoba fitur-fitur tersebut, Anda dapat mengajukan tiket.

Manfaat

Dalam skenario bisnis dunia nyata, kolaborasi lintas tim sangat umum. Tim algoritma umumnya lebih memilih menggunakan bahasa pemrograman Python untuk pelatihan model, sedangkan tim analitik bisnis cenderung menggunakan SQL untuk analitik data. MaxCompute memungkinkan mesin MaxFrame dan SQL menggunakan objek model yang sama, sehingga mengurangi biaya integrasi dalam kolaborasi lintas bahasa dan lintas tumpukan teknologi. Selain itu, pengguna juga dapat menerapkan kemampuan AI MaxCompute secara fleksibel dalam analitik bisnis.

Ikhtisar set data

Topik ini menggunakan set data Boston housing klasik, yang berisi informasi mengenai kondisi perumahan di wilayah Boston pada 1970-an. Set data pelatihan terdiri atas 500 sampel dengan 12 fitur dan satu variabel target, sedangkan set data prediksi berisi 6 sampel dengan 12 fitur yang sama seperti pada set data pelatihan.

Tabel berikut menjelaskan bidang-bidang dalam set data tersebut.

No.

Nama bidang

Tipe

Makna

Deskripsi

1

CRIM

Float

Tingkat kejahatan per kapita menurut kota

Bidang ini menunjukkan tingkat kejahatan per kapita untuk setiap kota. Wilayah dengan tingkat kejahatan lebih tinggi umumnya memiliki harga rumah lebih rendah.

2

ZN

Float

Proporsi lahan perumahan yang dikhususkan untuk lahan >25.000 kaki persegi

Bidang ini menunjukkan proporsi lahan perumahan di suatu kota yang dikhususkan untuk lahan lebih besar dari 25.000 kaki persegi.

3

INDUS

Float

Proporsi lahan bisnis non-ritel per kota

Bidang ini merepresentasikan proporsi lahan di suatu kota yang digunakan untuk bisnis non-ritel, seperti pabrik dan gudang.

4

CHAS

Integer

Berbatasan dengan sungai (1=ya, 0=tidak)

Ini adalah bidang biner yang menunjukkan apakah wilayah tersebut berdekatan dengan Sungai Charles.

5

NOX

Float

Konsentrasi oksida nitrat (ppm)

Bidang ini menunjukkan konsentrasi oksida nitrat di udara, diukur dalam satuan bagian per juta (ppm).

6

RM

Float

Rata-rata jumlah kamar per hunian

Bidang ini merepresentasikan rata-rata jumlah kamar dalam sebuah hunian. Hunian dengan lebih banyak kamar umumnya lebih mahal.

7

AGE

Float

Proporsi unit hunian milik sendiri yang dibangun sebelum tahun 1940

Bidang ini menunjukkan proporsi rumah milik sendiri yang dibangun sebelum tahun 1940.

8

DIS

Float

Jarak tertimbang ke lima pusat pekerjaan di Boston

Bidang ini menunjukkan jarak tertimbang ke lima pusat pekerjaan utama di Boston. Wilayah yang lebih dekat ke pusat-pusat tersebut umumnya memiliki harga rumah lebih tinggi.

9

RAD

Integer

Indeks aksesibilitas ke jalan raya radial

Bidang ini menunjukkan indeks aksesibilitas untuk jalan raya. Indeks yang lebih tinggi berarti aksesibilitas yang lebih baik.

10

TAX

Float

Tarif pajak properti nilai penuh per USD 10.000

Bidang ini menunjukkan jumlah pajak per USD 10.000 nilai properti. Tarif pajak yang lebih tinggi dapat berdampak negatif terhadap harga rumah.

11

PTRATIO

Float

Rasio murid-guru menurut kota

Bidang ini menunjukkan rasio jumlah siswa terhadap guru di sekolah negeri di suatu kota. Rasio yang lebih tinggi dapat mengindikasikan kelangkaan relatif sumber daya pendidikan.

12

LSTAT

Float

Persentase populasi berstatus rendah

Bidang ini menunjukkan persentase populasi yang dianggap berstatus rendah. Wilayah dengan persentase populasi berstatus rendah yang lebih tinggi umumnya memiliki harga rumah lebih rendah.

13

MEDV

Float

Nilai median rumah milik sendiri dalam ribuan USD

Variabel target: Bidang ini menunjukkan nilai median rumah milik sendiri di wilayah tersebut, dalam satuan ribuan USD. Nilai inilah yang harus diprediksi oleh model.

Prasyarat

Menyiapkan data

  1. Buat tabel yang diperlukan dan isi dengan data:

    -- Buat tabel data pelatihan.
    CREATE TABLE IF NOT EXISTS demo_xgboost_train
    (
     CRIM         FLOAT comment 'Tingkat kejahatan per kapita menurut kota',
     ZN           FLOAT comment 'Proporsi lahan perumahan yang dikhususkan untuk lahan >25.000 kaki persegi',
     INDUS        FLOAT comment 'Proporsi lahan bisnis non-ritel per kota',
     CHAS         INT   comment 'Berbatasan dengan sungai (1=ya, 0=tidak)',
     NOX          FLOAT comment 'Konsentrasi oksida nitrat (ppm)',
     RM           FLOAT comment 'Rata-rata jumlah kamar per hunian',
     AGE          FLOAT comment 'Proporsi unit hunian milik sendiri yang dibangun sebelum tahun 1940',
     DIS          FLOAT comment 'Jarak tertimbang ke lima pusat pekerjaan di Boston',
     RAD          FLOAT comment 'Indeks aksesibilitas ke jalan raya radial',
     TAX          FLOAT comment 'Tarif pajak properti nilai penuh per USD 10.000',
     PTRATIO      FLOAT comment 'Rasio murid-guru menurut kota',
     LSTAT        FLOAT comment 'Persentase populasi berstatus rendah',
     MEDV         FLOAT comment 'Nilai median rumah milik sendiri dalam ribuan USD'
    );
    
    -- Buat tabel data prediksi untuk SQL dan MaxFrame.
    CREATE TABLE IF NOT EXISTS demo_xgboost_predict
    (
     CRIM         FLOAT comment 'Tingkat kejahatan per kapita menurut kota',
     ZN           FLOAT comment 'Proporsi lahan perumahan yang dikhususkan untuk lahan >25.000 kaki persegi',
     INDUS        FLOAT comment 'Proporsi lahan bisnis non-ritel per kota',
     CHAS         INT   comment 'Berbatasan dengan sungai (1=ya, 0=tidak)',
     NOX          FLOAT comment 'Konsentrasi oksida nitrat (ppm)',
     RM           FLOAT comment 'Rata-rata jumlah kamar per hunian',
     AGE          FLOAT comment 'Proporsi unit hunian milik sendiri yang dibangun sebelum tahun 1940',
     DIS          FLOAT comment 'Jarak tertimbang ke lima pusat pekerjaan di Boston',
     RAD          FLOAT comment 'Indeks aksesibilitas ke jalan raya radial',
     TAX          FLOAT comment 'Tarif pajak properti nilai penuh per USD 10.000',
     PTRATIO      FLOAT comment 'Rasio murid-guru menurut kota',
     LSTAT        FLOAT comment 'Persentase populasi berstatus rendah'
    );
    
    
    
    -- Buat tabel data prediksi MaxFrame.
    CREATE TABLE IF NOT EXISTS demo_xgboost_predict_result
    (
     CRIM         DOUBLE comment 'Tingkat kejahatan per kapita menurut kota',
     ZN           DOUBLE comment 'Proporsi lahan perumahan yang dikhususkan untuk lahan >25.000 kaki persegi',
     INDUS        DOUBLE comment 'Proporsi lahan bisnis non-ritel per kota',
     CHAS         BIGINT comment 'Berbatasan dengan sungai (1=ya, 0=tidak)',
     NOX          DOUBLE comment 'Konsentrasi oksida nitrat (ppm)',
     RM           DOUBLE comment 'Rata-rata jumlah kamar per hunian',
     AGE          DOUBLE comment 'Proporsi unit hunian milik sendiri yang dibangun sebelum tahun 1940',
     DIS          DOUBLE comment 'Jarak tertimbang ke lima pusat pekerjaan di Boston',
     RAD          DOUBLE comment 'Indeks aksesibilitas ke jalan raya radial',
     TAX          DOUBLE comment 'Tarif pajak properti nilai penuh per USD 10.000',
     PTRATIO      DOUBLE comment 'Rasio murid-guru menurut kota',
     LSTAT        DOUBLE comment 'Persentase populasi berstatus rendah',
     RESULT       DOUBLE comment 'Nilai prediksi rumah milik sendiri'
    );
  2. Unggah data menggunakan API Tunnel:

    xgboost_train_data.csv

    xgboost_predict.csv

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

Melatih dan menyimpan model

  1. Latih model regresi XGBoost menggunakan MaxFrame.

    ## Inisialisasi sesi
    from odps import ODPS
    import maxframe
    from maxframe import options
    
    o = ODPS('LT******************',
             'Cz************************',
             'project_name',
             'endpoint',
            )
    
    ## Konfigurasi parameter
    from maxframe.config import options
    options.sql.enable_mcqa = False
    # Gunakan mesin 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())
    
    ## Pelatihan dan pembuatan model
    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
    
    # Definisikan nama tabel dan bidang.
    table_name = "demo_xgboost_train"
    # Kolom fitur dan kolom target.
    features = ['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'lstat']
    label = 'medv'
    # Baca data pelatihan.
    df = md.read_odps_table(
        table_name,
        unknown_as_string=True  # Mencegah kesalahan yang disebabkan oleh data tidak terstruktur.
    )
    # Pemrosesan fitur dan label.
    X_train = df[features].fillna(-1)  # Isi nilai yang hilang.
    y_train = df[label]
    # Inisialisasi dan latih model regresi 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'
    )
    # Simpan model regresi XGBoost yang dihasilkan.
    model.fit(X_train, y_train).to_odps_model(
        model_name="demo_model_xgboost_regressor",
        model_version="v01",
    ).execute()
  2. Lihat model yang telah dilatih.

    DESC model demo_model_xgboost_regressor;
    
    +------------------------------------------------------------------------------------+
    |                  Informasi Model                                                   |
    +------------------------------------------------------------------------------------+
    | Pemilik:                  ALIYUN$***********************                           |
    | Proyek:                   pd_test_model                                            |
    | Skema:                    default                                                  |
    | Nama Model:               demo_model_xgboost_regressor                                   |
    | Tipe Model:               BOOSTED_TREE_REGRESSOR                                   |
    | Tipe Sumber:              INTERNAL_TRAIN                                           |
    | Versi Default:            v01                                                      |
    | Waktu Pembuatan:          2025-09-12 13:15:16                                      |
    | Waktu Modifikasi Terakhir:2025-09-12 13:15:16                                      |
    | ID Model:                 389c90e355264079923b89**********                         |
    +------------------------------------------------------------------------------------+
    |                Informasi Versi                                                     |
    +------------------------------------------------------------------------------------+
    | Pemilik:                  ALIYUN$***********************                           |
    | Proyek:                   pd_test_model                                            |
    | Skema:                    default                                                  |
    | Nama Model:               demo_model_xgboost_regressor                                    |
    | Tipe Model:               BOOSTED_TREE_REGRESSOR                                   |
    | Tipe Sumber:              INTERNAL_TRAIN                                           |
    | Nama Versi:               v01                                                      |
    | ID Versi:                 99acd6cb93f845c8a4a9977*********                         |
    | Jalur:                                                                              |
    | Waktu Pembuatan:          2025-09-12 13:15:16                                      |
    | Waktu Modifikasi Terakhir:2025-09-12 13:15:16                                      |
    +------------------------------------------------------------------------------------+
    | Input           | Tipe       | Komentar                                             |
    +------------------------------------------------------------------------------------+
    | crim            | float      |                                                     |
    | zn              | float      |                                                     |
    | indus           | float      |                                                     |
    | chas            | int        |                                                     |
    | nox             | float      |                                                     |
    | rm              | float      |                                                     |
    | age             | float      |                                                     |
    | dis             | float      |                                                     |
    | rad             | float      |                                                     |
    | tax             | float      |                                                     |
    | ptratio         | float      |                                                     |
    | lstat           | float      |                                                     |
    +------------------------------------------------------------------------------------+

Memprediksi data menggunakan MaxFrame

  1. Setelah model dilatih, jalankan program berikut di MaxFrame untuk melakukan prediksi dengan model yang telah dilatih:

    # Definisikan tabel data prediksi dan tabel sink.
    predict_table = "demo_xgboost_predict_mf"
    predict_result_table = "demo_xgboost_predict_result"
    
    # Baca data prediksi.
    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)
    
    # Bangun DataFrame hasil prediksi.
    df_predict = predict_data[features].copy()  
    df_predict['predicted_medv'] = y_predict.astype(np.float64)  # Tambahkan nilai prediksi.
    
    # Tulis hasil prediksi ke tabel ODPS.
    df_predict.to_odps_table(
        predict_result_table,
        overwrite=True,
        index=False,
        unknown_as_string=True
    ).execute()
  2. Lihat tabel sink:

    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 | 
    +------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+

Memprediksi data menggunakan fungsi AI SQL

Gunakan model yang telah dibuat dan fungsi SQL ML_PREDICT untuk memprediksi harga rumah.

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;

-- Hasil berikut dikembalikan:
+------------+
| _c0        | 
+------------+
| 20.039612  | 
| 24.49148   | 
| 24.683203  | 
| 32.339626  | 
| 28.459175  | 
| 24.432678  | 
+------------+

Ketika Anda menggunakan model dan data prediksi yang sama, hasil inferensi dari mesin MaxFrame dan SQL konsisten.