Output Regresi Linier XGBo salah

10

Saya seorang pemula untuk XGBoost, jadi maafkan ketidaktahuan saya. Berikut adalah kode python:

import pandas as pd
import xgboost as xgb

df = pd.DataFrame({'x':[1,2,3], 'y':[10,20,30]})
X_train = df.drop('y',axis=1)
Y_train = df['y']
T_train_xgb = xgb.DMatrix(X_train, Y_train)

params = {"objective": "reg:linear"}
gbm = xgb.train(dtrain=T_train_xgb,params=params)
Y_pred = gbm.predict(xgb.DMatrix(pd.DataFrame({'x':[4,5]})))
print Y_pred

Output adalah:

[ 24.126194  24.126194]

Seperti yang Anda lihat, input data hanyalah garis lurus. Jadi output yang saya harapkan adalah [40,50]. Apa yang saya lakukan salah di sini?

simplfuzz
sumber
1
Tolong jangan lintas pos
Dawny33
2
@ Dawny33 dihapus dari SO.
simplfuzz

Jawaban:

21

Tampaknya XGBoost menggunakan pohon regresi sebagai pelajar dasar secara default. XGBoost (atau Gradient boost secara umum) bekerja dengan menggabungkan beberapa pelajar dasar ini. Pohon regresi tidak dapat memperkirakan pola dalam data pelatihan, sehingga setiap input di atas 3 atau di bawah 1 tidak akan diprediksi dengan benar dalam kasus Anda. Model Anda dilatih untuk memprediksi output untuk input dalam interval [1,3], input yang lebih tinggi dari 3 akan diberi output yang sama dengan 3, dan input yang kurang dari 1 akan diberi output yang sama dengan 1.

Selain itu, pohon regresi tidak benar-benar melihat data Anda sebagai garis lurus karena mereka adalah model non-parametrik, yang berarti mereka secara teoritis dapat sesuai dengan bentuk apa pun yang lebih rumit daripada garis lurus. Secara kasar, pohon regresi bekerja dengan menugaskan data input baru Anda ke beberapa poin data pelatihan yang telah dilihat selama pelatihan, dan menghasilkan output berdasarkan itu.

Ini berbeda dengan regresi parametrik (seperti regresi linier ) yang sebenarnya mencari parameter terbaik hyperplane (garis lurus dalam kasus Anda) agar sesuai dengan data Anda. Regresi linier memang melihat data Anda sebagai garis lurus dengan kemiringan dan intersep.

Anda dapat mengubah pelajar dasar model XGBoost Anda menjadi GLM (model linier umum) dengan menambahkan "booster":"gblinear"ke model Anda params:

import pandas as pd
import xgboost as xgb

df = pd.DataFrame({'x':[1,2,3], 'y':[10,20,30]})
X_train = df.drop('y',axis=1)
Y_train = df['y']
T_train_xgb = xgb.DMatrix(X_train, Y_train)

params = {"objective": "reg:linear", "booster":"gblinear"}
gbm = xgb.train(dtrain=T_train_xgb,params=params)
Y_pred = gbm.predict(xgb.DMatrix(pd.DataFrame({'x':[4,5]})))
print Y_pred

Secara umum, untuk men-debug mengapa model XGBoost Anda berperilaku dengan cara tertentu, lihat parameter model:

gbm.get_dump()

Jika pelajar dasar Anda adalah model linier, output get_dump adalah:

['bias:\n4.49469\nweight:\n7.85942\n']

Dalam kode Anda di atas, karena Anda tree base pelajar, hasilnya adalah:

['0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=2.85\n\t\t4:leaf=5.85\n\t2:leaf=8.85\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=1.995\n\t\t4:leaf=4.095\n\t2:leaf=6.195\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=1.3965\n\t\t4:leaf=2.8665\n\t2:leaf=4.3365\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.97755\n\t\t4:leaf=2.00655\n\t2:leaf=3.03555\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.684285\n\t\t4:leaf=1.40458\n\t2:leaf=2.12489\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.478999\n\t\t4:leaf=0.983209\n\t2:leaf=1.48742\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.3353\n\t\t4:leaf=0.688247\n\t2:leaf=1.04119\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.23471\n\t\t4:leaf=0.481773\n\t2:leaf=0.728836\n',
 '0:[x<3] yes=1,no=2,missing=1\n\t1:[x<2] yes=3,no=4,missing=3\n\t\t3:leaf=0.164297\n\t\t4:leaf=0.337241\n\t2:leaf=0.510185\n',
 '0:[x<2] yes=1,no=2,missing=1\n\t1:leaf=0.115008\n\t2:[x<3] yes=3,no=4,missing=3\n\t\t3:leaf=0.236069\n\t\t4:leaf=0.357129\n']

Tip: Saya sebenarnya lebih suka menggunakan kelas xgb.XGBRegressor atau xgb.XGBClassifier, karena mereka mengikuti API pembelajaran sci-kit . Dan karena sci-kit learning memiliki banyak implementasi algoritma pembelajaran mesin, menggunakan XGB sebagai pustaka tambahan tidak mengganggu alur kerja saya hanya ketika saya menggunakan antarmuka sci-kit XGBoost.

MohamedEzz
sumber
Bagaimana Anda mengatur "booster":"gblinear"melaluixgb.XGBRegressor
yosemite_k
Apakah lebih baik menjalankan normalisasi fitur saat menggunakan gblinearbooster?
dibumbui