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]ดังนั้นการส่งออกที่ผมคาดหวัง ฉันทำอะไรผิดที่นี่


1
โปรดอย่าข้ามโพสต์
Dawny33

2
@ Dawny33 ลบออกจาก SO
simplfuzz

คำตอบ:


22

ดูเหมือนว่า XGBoost ใช้ต้นไม้การถดถอยเป็นผู้เรียนพื้นฐานโดยค่าเริ่มต้น XGBoost (หรือการไล่ระดับสีโดยทั่วไปจะเพิ่มประสิทธิภาพ) โดยการรวมผู้เรียนพื้นฐานเหล่านี้หลายคนเข้าด้วยกัน ต้นไม้การถดถอยไม่สามารถคาดการณ์รูปแบบในข้อมูลการฝึกอบรมดังนั้นการป้อนข้อมูลใด ๆ ที่สูงกว่า 3 หรือต่ำกว่า 1 จะไม่สามารถทำนายได้อย่างถูกต้องในกรณีของคุณ แบบจำลองของคุณได้รับการฝึกฝนเพื่อทำนายเอาต์พุตสำหรับอินพุตในช่วงเวลา[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 มีการใช้งานอัลกอริทึมการเรียนรู้ของเครื่องจำนวนมากการใช้ XGB เป็นห้องสมุดเพิ่มเติมไม่รบกวนกระบวนการทำงานของฉันเฉพาะเมื่อฉันใช้อินเตอร์เฟส sci-kit ของ XGBoost


คุณจะตั้งค่าอย่างไร"booster":"gblinear"ผ่านxgb.XGBRegressor
yosemite_k

จะดีกว่าหรือไม่ที่จะใช้งานการปรับสภาพคุณลักษณะเมื่อใช้gblinearบูสเตอร์?
peppered
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.