XGBoost線形回帰の出力が正しくない


10

私はXGBoostの初心者なので、無知です。これが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

出力は:

[ 24.126194  24.126194]

ご覧のとおり、入力データは単純な直線です。だから私が期待する出力は[40,50]です。ここで何が悪いのですか?



2
@ Dawny33がSOから削除されました。
simplfuzz

回答:


21

XGBoostはデフォルトで基本学習者として回帰木を使用しているようです。XGBoost(または一般にGradient boosting)は、これらの基本学習者を複数組み合わせることで機能します。回帰木はトレーニングデータのパターンを推定できないため、3以上または1未満の入力は、この場合正しく予測されません。モデルは、区間内の入力の出力を予測するようにトレーニングされています[1,3]。3より大きい入力には3と同じ出力が与えられ、1未満の入力には1と同じ出力が与えられます。

さらに、回帰木はノンパラメトリックモデルであるため、実際にはデータを直線として認識しません。つまり、直線よりも複雑な任意の形状に理論的に適合することができます。大まかに言うと、回帰ツリーは、新しい入力データをトレーニング中に見たトレーニングデータポイントの一部に割り当て、それに基づいて出力を生成することで機能します。

これは、データにフィットするために超平面(この場合は直線)の最適なパラメーターを実際に探すパラメトリックリグレッサ(線形回帰など)とは対照的です。線形回帰で、データが傾きと切片のある直線として表示されます。

XGBoostモデルの基本学習者をモデルに追加"booster":"gblinear"することで、GLM(一般化線形モデル)に変更できます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学習 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.