XGBoost Doğrusal Regresyon çıkışı yanlış


11

Ben XGBoost'a yeni başladım, bu yüzden cehaletimi affedin. İşte python kodu:

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

Çıktı:

[ 24.126194  24.126194]

Gördüğünüz gibi, girdi verileri basit bir çizgidir. Yani beklediğim çıktı [40,50]. Burada neyi yanlış yapıyorum?



2
@ Dawny33 SO'dan silindi.
simplfuzz

Yanıtlar:


22

Görünüşe göre XGBoost, varsayılan olarak temel öğrenciler olarak regresyon ağaçlarını kullanıyor . XGBoost (veya genel olarak Gradient boost), bu temel öğrencilerin çoğunu birleştirerek çalışır. Regresyon ağaçları egzersiz verilerindeki kalıpları tahmin edemez, bu nedenle 3'ün üzerinde veya 1'in altında herhangi bir girdi sizin durumunuzda doğru tahmin edilmeyecektir. Modeliniz aralıktaki girişler için çıkışları tahmin etmek üzere eğitilir [1,3], 3'ten yüksek bir giriş 3 ile aynı çıkışa ve 1'den küçük bir giriş 1 ile aynı çıkışa verilir.

Ek olarak, regresyon ağaçları verilerinizi parametrik olmayan modeller olduğu için gerçekten düz bir çizgi olarak görmez , yani teorik olarak düz bir çizgiden daha karmaşık herhangi bir şekle uyabilirler. Kabaca bir regresyon ağacı, eğitim sırasında gördüğü bazı egzersiz veri noktalarına yeni giriş verilerinizi atayarak çalışır ve buna göre çıktı üretir.

Bu, verilerinize uyacak şekilde bir hiper düzlemin en iyi parametrelerini (sizin durumunuzda düz çizgi) arayan parametrik regresörlerin ( doğrusal regresyon gibi ) aksine . Doğrusal regresyon , verilerinizi eğimli ve kesişen düz bir çizgi olarak görür.

Modelinize ekleyerek XGBoost modelinizin temel öğrenicisini bir GLM'ye (genelleştirilmiş doğrusal model) "booster":"gblinear"değiştirebilirsiniz 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

Genel olarak, XGBoost modelinizin neden belirli bir şekilde davrandığını hata ayıklamak için model parametrelerine bakın:

gbm.get_dump()

Temel öğreniciniz doğrusal modelse, get_dump çıktısı:

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

Yukarıdaki kodunuzda, ağaç tabanı öğrenenlerini ağaçlandırdığınız için çıktı şu şekilde olacaktır:

['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']

İpucu: Aslında xgb.XGBRegressor veya xgb.XGBClassifier sınıflarını kullanmayı tercih ediyorum, çünkü sci-kit learn API'sini takip ediyorlar . Ve sci-kit öğrenmenin çok fazla makine öğrenme algoritması uygulaması olduğundan, XGB'yi ek bir kütüphane olarak kullanmak, iş akışımı yalnızca XGBoost'un sci-kit arayüzünü kullandığımda rahatsız etmiyor.


Eğer nasıl ayarlarım "booster":"gblinear"aracılığıylaxgb.XGBRegressor
yosemite_k

gblinearGüçlendirici kullanırken özellik normalleştirmeyi çalıştırmak daha mı iyi ?
biber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.