XGBoost 선형 회귀 출력이 잘못되었습니다


11

나는 XGBoost의 초보자이므로 내 무지를 용서하십시오. 파이썬 코드는 다음과 같습니다.

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

출력 :

[ 24.126194  24.126194]

보시다시피 입력 데이터는 직선입니다. 그래서 내가 기대하는 결과는 [40,50]입니다. 내가 여기서 뭘 잘못하고 있니?



2
@ Dawny33이 SO에서 삭제되었습니다.
simplfuzz

답변:


22

XGBoost는 기본적으로 회귀 트리 를 기본 학습자로 사용하는 것으로 보입니다 . XGBoost (또는 일반적으로 그라디언트 부스팅)는 여러 기본 학습자를 결합하여 작동합니다. 회귀 트리는 훈련 데이터의 패턴을 추정 할 수 없으므로 3보다 크거나 1보다 작은 입력은 정확하게 예측할 수 없습니다. 모델은 구간에서 입력에 대한 출력을 예측하도록 훈련되었으며 [1,3], 3보다 높은 입력에는 3과 동일한 출력이 제공되고 1보다 작은 입력에는 1과 동일한 출력이 제공됩니다.

또한 회귀 트리는 데이터 가 비모수 적 모델이므로 데이터를 직선 으로 간주하지 않으므로 이론적으로 직선보다 복잡한 모양에 적합 할 수 있습니다. 대략적으로, 회귀 트리는 새로운 입력 데이터를 훈련하는 동안 본 훈련 데이터 포인트 중 일부에 할당하고 그에 따라 결과를 생성함으로써 작동합니다.

이는 실제로 데이터에 맞는 초평면 (최상의 직선 )의 최상의 매개 변수를 찾는 파라 메트릭 회귀 (예 : 선형 회귀 ) 와 대조적 입니다. 선형 회귀 데이터를 기울기와 절편이있는 직선으로 간주합니다.

당신은 추가하여 GLM (일반화 선형 모델)에 XGBoost 모델의 기본 학습자를 변경할 수 있습니다 "booster":"gblinear"모델에 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

일반적으로 XGBoost 모델이 특정 방식으로 동작하는 이유를 디버그하려면 모델 매개 변수를 참조하십시오.

gbm.get_dump()

기본 학습자가 선형 모델 인 경우 get_dump 출력은 다음과 같습니다.

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

위 코드에서 기본 학습자를 트리 화하므로 출력은 다음과 같습니다.

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

팁 : 실제로 xgb.XGBRegressor 또는 xgb.XGBClassifier 클래스는 sci-kit learn API를 따르기 때문에 선호합니다 . sci-kit learn에는 많은 머신 러닝 알고리즘 구현이 있기 때문에 XGB를 추가 라이브러리로 사용하면 XGBoost의 sci-kit 인터페이스를 사용할 때만 워크 플로를 방해하지 않습니다.


"booster":"gblinear"xgb.XGBRegressor
yosemite_k을

gblinear부스터를 사용할 때 기능 정규화를 실행하는 것이 더 낫 습니까?
후추
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.