для регрессии. Смотрите заголовок: «Параметры задачи обучения»

ичок в XGBoost в Python, поэтому я прошу прощения, если ответ здесь очевиден, но я пытаюсь взять panda dataframe и получить XGBoost в Python, чтобы дать мне те же прогнозы, которые я получаю, когда использую оболочку Scikit-Learn для того же упражнение. До сих пор я не мог этого сделать. Просто в качестве примера, здесь я беру набор данных из Бостона, преобразую его в кадр данных panda, обучаюсь первым 500 наблюдениям набора данных, а затем прогнозирую последние 6. Сначала я делаю это с XGBoost, а затем с оболочкой Scikit-Learn и Я получаю разные прогнозы, хотя я установил параметры модели одинаковыми. В частности, предсказания массивов сильно отличаются от предсказаний массивов2 (см. Код ниже). Любая помощь приветствуется!

from sklearn import datasets
import pandas as pd
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from xgboost.sklearn import XGBRegressor

### Use the boston data as an example, train on first 500, predict last 6 
boston_data = datasets.load_boston()
df_boston = pd.DataFrame(boston_data.data,columns=boston_data.feature_names)
df_boston['target'] = pd.Series(boston_data.target)


#### Code using XGBoost
Sub_train = df_boston.head(500)
target = Sub_train["target"]
Sub_train = Sub_train.drop('target', axis=1) 

Sub_predict = df_boston.tail(6)
Sub_predict = Sub_predict.drop('target', axis=1)  

xgtrain = xgb.DMatrix(Sub_train.as_matrix(), label=target.tolist())
xgtest = xgb.DMatrix(Sub_predict.as_matrix())

params = {'booster': 'gblinear', 'objective': 'reg:linear', 
      'max_depth': 2, 'learning_rate': .1, 'n_estimators': 500,    'min_child_weight': 3, 'colsample_bytree': .7,
      'subsample': .8, 'gamma': 0, 'reg_alpha': 1}

model = xgb.train(dtrain=xgtrain, params=params)

predictions = model.predict(xgtest)

#### Code using Sk learn Wrapper for XGBoost
model = XGBRegressor(learning_rate =.1, n_estimators=500,
max_depth=2, min_child_weight=3, gamma=0, 
subsample=.8, colsample_bytree=.7, reg_alpha=1, 
objective= 'reg:linear')

target = "target"

Sub_train = df_boston.head(500)
Sub_predict = df_boston.tail(6)
Sub_predict = Sub_predict.drop('target', axis=1)

Ex_List = ['target']

predictors = [i for i in Sub_train.columns if i not in Ex_List]

model = model.fit(Sub_train[predictors],Sub_train[target])

predictions2 = model.predict(Sub_predict)

Ответы на вопрос(1)

Решение Вопроса

этот ответ здесь

xgboost.train будет игнорировать параметр n_estimators, в то время какxgboost.XGBRegressor принимает. В xgboost.train повышение итераций (то есть n_estimators) контролируется num_boost_round (по умолчанию: 10)

Предлагает удалитьn_estimators из параметров, переданных вxgb.train и заменить его наnum_boost_round.

Так что измените свои параметры следующим образом:

params = {'objective': 'reg:linear', 
      'max_depth': 2, 'learning_rate': .1,    
      'min_child_weight': 3, 'colsample_bytree': .7,
      'subsample': .8, 'gamma': 0, 'alpha': 1}

И тренируй xgb.train так:

model = xgb.train(dtrain=xgtrain, params=params,num_boost_round=500)

И вы получите те же результаты.

В качестве альтернативы, сохраните xgb.train как есть и измените XGBRegressor следующим образом:

model = XGBRegressor(learning_rate =.1, n_estimators=10,
                     max_depth=2, min_child_weight=3, gamma=0, 
                     subsample=.8, colsample_bytree=.7, reg_alpha=1, 
                     objective= 'reg:linear')

Тогда и вы получите те же результаты.

 Vivek Kumar01 июн. 2018 г., 16:11
@AndoJurai Проверьте здесь:xgboost.readthedocs.io/en/latest/..., Если вы все еще не удовлетворены, начните новый вопрос с соответствующей информацией.
 Joseph E26 окт. 2017 г., 08:36
Спасибо вам большое! Я перезапустил код с первым набором изменений, которые вы предложили, и теперь массивы (предсказания и предсказания2) идеально совпадают.
 Vivek Kumar01 июн. 2018 г., 15:50
@AndoJurai Для этого нужно использовать n_estimators = 500. Но я не получаю вторую часть вашего вопроса. Пожалуйста, объясните более подробно, что вы хотите?
 Vivek Kumar01 июн. 2018 г., 16:27
@AndoJurai DId вы смотрите объективный параметр на связанной странице. Все варианты там действительны."reg:linear" для регрессии. Смотрите заголовок: «Параметры задачи обучения»
 Ando Jurai01 июн. 2018 г., 15:46
@VivekKumar: Пожалуйста, как вы воспроизводите num_boost_round = 500 из xgb.train в XGBRepressor? То же самое, как вам указать в xgb.train тот факт, что вы будете использовать либо классификатор, либо регрессор? целевая функция могла бы сделать это, но так как вы можете указать любую комбинацию, такую ​​как двоичная: логистика в XGBregressor, я думаю, это не параметр, используемый для этого. Благодарю.

Ваш ответ на вопрос