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]। मुझसे यहां क्या गलत हो रहा है?



2
@ Dawny33 SO से हटा दिया गया।
सरल

जवाबों:


22

ऐसा लगता है कि XGBoost डिफ़ॉल्ट रूप से आधार शिक्षार्थियों के रूप में प्रतिगमन पेड़ों का उपयोग करता है । इन बेस शिक्षार्थियों में से कई को मिलाकर XGBoost (या सामान्य रूप से वृद्धि) काम करते हैं। प्रतिगमन पेड़ प्रशिक्षण डेटा में पैटर्न को एक्सट्रपलेशन नहीं कर सकते हैं, इसलिए 3 या 1 से ऊपर किसी भी इनपुट को आपके मामले में सही ढंग से भविष्यवाणी नहीं की जाएगी। आपके मॉडल को अंतराल में इनपुट के लिए आउटपुट की भविष्यवाणी करने के लिए प्रशिक्षित किया गया है [1,3], 3 से अधिक इनपुट को 3 के समान आउटपुट दिया जाएगा, और 1 से कम इनपुट को 1 के समान आउटपुट दिया जाएगा।

इसके अतिरिक्त, प्रतिगमन पेड़ वास्तव में एक सीधी रेखा के रूप में आपके डेटा को नहीं देखते हैं क्योंकि वे गैर-पैरामीट्रिक मॉडल हैं, जिसका अर्थ है कि वे सैद्धांतिक रूप से किसी भी आकार को फिट कर सकते हैं जो एक सीधी रेखा से अधिक जटिल है। मोटे तौर पर, एक प्रतिगमन वृक्ष प्रशिक्षण के दौरान देखे गए कुछ प्रशिक्षण डेटा बिंदुओं पर आपके नए इनपुट डेटा को असाइन करके काम करता है, और उसी के आधार पर आउटपुट का उत्पादन करता है।

यह पैरामीट्रिक रजिस्ट्रार (जैसे रैखिक प्रतिगमन ) के विपरीत है जो वास्तव में आपके डेटा को फिट करने के लिए हाइपरप्लेन (आपके मामले में सीधी रेखा) के सर्वोत्तम मापदंडों की तलाश करते हैं। रेखीय प्रतीपगमन करता है एक ढलान और एक अवरोधन साथ एक सीधी रेखा के रूप में अपने डेटा को देखते हैं।

आप को जोड़कर एक GLM (सामान्यीकृत रेखीय मॉडल) के लिए अपने XGBoost मॉडल के आधार शिक्षार्थी को बदल सकते हैं "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-किट सीखने में बहुत सारे मशीन लर्निंग एल्गोरिदम कार्यान्वयन हैं, अतिरिक्त लाइब्रेरी के रूप में XGB का उपयोग करना मेरे वर्कफ़्लो को केवल तभी परेशान नहीं करता है जब मैं XGBoost के Sci-kit इंटरफ़ेस का उपयोग करता हूं।


तुम कैसे सेट करूँ "booster":"gblinear"के माध्यम सेxgb.XGBRegressor
yosemite_k

gblinearबूस्टर का उपयोग करते समय सुविधा सामान्यीकरण को चलाने के लिए बेहतर है ?
peppered
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.