Có vẻ như XGBoost sử dụng cây hồi quy làm người học cơ sở theo mặc định. XGBoost (hay tăng cường Gradient nói chung) hoạt động bằng cách kết hợp nhiều người học cơ sở này. Cây hồi quy không thể ngoại suy các mẫu trong dữ liệu huấn luyện, do đó, bất kỳ đầu vào nào trên 3 hoặc dưới 1 sẽ không được dự đoán chính xác trong trường hợp của bạn. Mô hình của bạn được đào tạo để dự đoán đầu ra cho các đầu vào trong khoảng [1,3]
, đầu vào cao hơn 3 sẽ được cung cấp cùng một đầu ra là 3 và đầu vào nhỏ hơn 1 sẽ được cung cấp cùng một đầu ra là 1.
Ngoài ra, cây hồi quy không thực sự xem dữ liệu của bạn là một đường thẳng vì chúng là các mô hình không tham số, có nghĩa là về mặt lý thuyết chúng có thể phù hợp với bất kỳ hình dạng nào phức tạp hơn một đường thẳng. Một cách thô sơ, cây hồi quy hoạt động bằng cách gán dữ liệu đầu vào mới của bạn cho một số điểm dữ liệu huấn luyện mà nó đã thấy trong quá trình đào tạo và tạo đầu ra dựa trên đó.
Điều này trái ngược với các hồi quy tham số (như hồi quy tuyến tính ) thực sự tìm kiếm các tham số tốt nhất của siêu phẳng (đường thẳng trong trường hợp của bạn) để phù hợp với dữ liệu của bạn. Hồi quy tuyến tính không nhìn thấy dữ liệu của bạn như một đường thẳng có độ dốc và đánh chặn.
Bạn có thể thay đổi người học cơ sở của mô hình XGBoost của bạn thành GLM (mô hình tuyến tính tổng quát) bằng cách thêm "booster":"gblinear"
vào mô hình của bạn 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
Nói chung, để gỡ lỗi tại sao mô hình XGBoost của bạn hoạt động theo một cách cụ thể, hãy xem các tham số mô hình:
gbm.get_dump()
Nếu người học cơ sở của bạn là mô hình tuyến tính, đầu ra get_dump là:
['bias:\n4.49469\nweight:\n7.85942\n']
Trong mã của bạn ở trên, vì bạn học cây cơ sở, đầu ra sẽ là:
['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']
Mẹo: Tôi thực sự thích sử dụng các lớp xgb.XGBRegressor hoặc xgb.XGBClassifier, vì chúng tuân theo API học sci-kit . Và bởi vì sci-kit learn có rất nhiều triển khai thuật toán học máy, sử dụng XGB làm thư viện bổ sung không làm phiền quy trình làm việc của tôi chỉ khi tôi sử dụng giao diện sci-kit của XGBoost.