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)