Đầu ra hồi quy tuyến tính XGBoost không chính xác


10

Tôi là người mới sử dụng XGBoost vì vậy hãy tha thứ cho sự thiếu hiểu biết của tôi. Đây là mã trăn:

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

Đầu ra là:

[ 24.126194  24.126194]

Như bạn có thể thấy dữ liệu đầu vào chỉ đơn giản là một đường thẳng. Vì vậy, đầu ra tôi mong đợi là [40,50]. Tôi làm gì sai ở đây?


1
Xin đừng đăng chéo
Dawny33

2
@ Dawny33 đã bị xóa khỏi SO.
Simplfuzz

Câu trả lời:


21

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.


Làm thế nào để bạn thiết lập "booster":"gblinear"thông quaxgb.XGBRegressor
yosemite_k

Có tốt hơn để chạy bình thường hóa tính năng khi sử dụng gblinearbooster?
tiêu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.