XGBRegressor: изменить random_state без эффекта

xgboost.XGBRegressor кажется, дает те же результаты, несмотря на то, что дается новое случайное семя.

Согласно xgboost документация xgboost.XGBRegressor:

seed: int Случайное число seed. (Устарело, используйте random_state)

random_state: int Случайное число семян. (заменяет семя)

random_state это тот, который будет использоваться, несмотря ни на что random_state или же seed Я использую, модель дает те же результаты. Жук?

from xgboost import XGBRegressor
from sklearn.datasets import load_boston
import numpy as np
from itertools import product

def xgb_train_predict(random_state=0, seed=None):
    X, y = load_boston(return_X_y=True)
    xgb = XGBRegressor(random_state=random_state, seed=seed)
    xgb.fit(X, y)
    y_ = xgb.predict(X)
    return y_

check = xgb_train_predict()

random_state = [1, 42, 58, 69, 72]
seed = [None, 2, 24, 85, 96]

for r, s in product(random_state, seed):
    y_ = xgb_train_predict(r, s)
    assert np.equal(y_, check).all()
    print('CHECK! \t random_state: {} \t seed: {}'.format(r, s))

[Out]:
    CHECK!   random_state: 1     seed: None
    CHECK!   random_state: 1     seed: 2
    CHECK!   random_state: 1     seed: 24
    CHECK!   random_state: 1     seed: 85
    CHECK!   random_state: 1     seed: 96
    CHECK!   random_state: 42    seed: None
    CHECK!   random_state: 42    seed: 2
    CHECK!   random_state: 42    seed: 24
    CHECK!   random_state: 42    seed: 85
    CHECK!   random_state: 42    seed: 96
    CHECK!   random_state: 58    seed: None
    CHECK!   random_state: 58    seed: 2
    CHECK!   random_state: 58    seed: 24
    CHECK!   random_state: 58    seed: 85
    CHECK!   random_state: 58    seed: 96
    CHECK!   random_state: 69    seed: None
    CHECK!   random_state: 69    seed: 2
    CHECK!   random_state: 69    seed: 24
    CHECK!   random_state: 69    seed: 85
    CHECK!   random_state: 69    seed: 96
    CHECK!   random_state: 72    seed: None
    CHECK!   random_state: 72    seed: 2
    CHECK!   random_state: 72    seed: 24
    CHECK!   random_state: 72    seed: 85
    CHECK!   random_state: 72    seed: 96

2 ответа

Решение

Кажется (я сам этого не знал, прежде чем начать искать ответ:)), что xgboost использует генератор случайных чисел только для подвыборки, см . Комментарий Лоры по аналогичной проблеме github. А в остальном поведение является детерминированным.

Если бы вы использовали выборку, есть проблема в seed/random_state обработка текущим API sklearn в xgboost. seed действительно считается устаревшим, но кажется, что если его предоставить, он все равно будет использоваться более random_state, как можно увидеть здесь в коде. Этот комментарий актуален только тогда, когда у вас есть seed not None

Протестировано только с настройкой xgboost-1.6.1random_stateработал.

При чтенииXиyиз источника данных. Убедитесь, что они расположены в том же порядке и с одинаковыми десятичными значениями.

В следующем примере используетсяpd.DataFrame

      round_value = ..
my_seed = ...

X = round(X, round_value)
X = X[sorted(X)]

y = round(y, round_value)
y = y[sorted(y)]

X_train = X....
y_train = y....

X_test = X....

xgb_model = XGBRegressor(random_state=my_seed)
xgb_model.fit(X_train, y_train)
xgb_pred = xgb_model.predict(X_test)
Другие вопросы по тегам