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?
python
linear-regression
xgboost
simplfuzz
sumber
sumber
Jawaban:
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 Andaparams
:Secara umum, untuk men-debug mengapa model XGBoost Anda berperilaku dengan cara tertentu, lihat parameter model:
Jika pelajar dasar Anda adalah model linier, output get_dump adalah:
Dalam kode Anda di atas, karena Anda tree base pelajar, hasilnya adalah:
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.
sumber
"booster":"gblinear"
melaluixgb.XGBRegressor
gblinear
booster?