xgboost線形回帰出力が正しくありません
-
16-10-2019 - |
質問
私は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]
. 。ここで何が間違っているのですか?
解決
Xgboostは使用しているようです 回帰ツリー デフォルトでは、基本学習者として。 XgBoost(または一般的に勾配ブースト)は、これらの基本学習者の複数を組み合わせて機能します。回帰ツリーは、トレーニングデータのパターンを外挿することができないため、3以下の入力は、場合には正しく予測されません。モデルは、間隔の入力の出力を予測するようにトレーニングされています [1,3]
, 、3を超える入力は3と同じ出力が与えられ、1未満の入力には1と同じ出力が与えられます。
さらに、回帰ツリーはあなたのデータを実際には見ていません 直線 それらはノンパラメトリックモデルであるため、直線よりも複雑な任意の形状に理論的に適合できることを意味します。大まかに、回帰ツリーは、トレーニング中に見たトレーニングデータポイントの一部に新しい入力データを割り当てることで機能し、それに基づいて出力を生成します。
これは、パラメトリックリグレッサーとは対照的です( 線形回帰)データに適合するために、実際にハイパープレーン(場合の直線)の最適なパラメーターを探しています。線形回帰 します データを斜面とインターセプトを備えた直線として見てください。
XGBoostモデルのベース学習者をGLM(一般化された線形モデル)に変更できます。 "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学習 API。また、SCI-Kit Learnには非常に多くの機械学習アルゴリズムの実装があるため、XGBを追加のライブラリとして使用しても、XGBoostのSCI-KITインターフェイスを使用した場合にのみワークフローを妨害しません。