#python #machine-learning #scikit-learn #regression
Вопрос:
Я работаю над обучением регрессионной модели с использованием StackingRegressor и обнаружил, что прогноз этой модели не согласуется, пока я использую одно и то же random_state.
Вот мой код:
random_seed = 42
mdl_lgbm = lightgbm.LGBMRegressor(colsample_bytree=0.6,
learning_rate=0.05,
max_depth=6,
min_child_samples=227,
min_child_weight=10,
n_estimators=1800,
num_leaves=45,
reg_alpha=0,
reg_lambda=1,
subsample=0.6,
n_jobs=-1,
random_state=random_seed)
mdl_xgb = xgb.XGBRegressor(subsample=0.5,
n_estimators=900,
min_child_weight=8,
max_depth=6,
learning_rate=0.03,
colsample_bytree=0.8,
n_jobs=-1,
reg_alpha=2,
reg_lambda=50,
objective='reg:squarederror',
random_state=random_seed)
mdl_rf = RandomForestRegressor(bootstrap=True,
max_depth=110,
max_features='auto',
min_samples_leaf=5,
min_samples_split=5,
n_estimators=1430,
n_jobs=-1,
random_state=random_seed)
# Base models
base_mdl_names = {
'XGB': mdl_xgb,
'LGBM': mdl_lgbm,
'RF': mdl_rf,
}
final_estimator = xgb.XGBRegressor(subsample=0.3,
n_estimators=1200,
min_child_weight=2,
max_depth=5,
learning_rate=0.06,
colsample_bytree=0.8,
n_jobs=-1,
reg_alpha=1,
reg_lambda=0.1,
objective='reg:squarederror',
random_state=random_seed)
base_estimators = list()
for name, mdl in base_mdl_names.items():
base_estimators.append((name, mdl))
stacked_mdl = StackingRegressor(estimators=base_estimators,
final_estimator=final_estimator,
cv=5,
passthrough=True)
stacked_mdl.fit(X_train, y_train)
Пожалуйста, обратите внимание, что я не изменяю X_train. Когда я использую обученную модель для прогнозирования, результаты не воспроизводимы. Я имею в виду, что если я переобучу модель, результаты будут разными, в то время как все входные данные будут одинаковыми. Есть какие-нибудь догадки, почему это происходит?
Ответ №1:
StackingRegressor
использование cv
(перекрестная проверка). Поэтому вам также необходимо установить его random_state
, чтобы при каждом запуске было точно такое же разделение перекрестной проверки.
Вы должны поступить следующим образом:
from sklearn.model_selection import KFold
kfold = KFold(n_splits=5, random_state=random_seed, shuffle=True)
stacked_mdl = StackingRegressor(estimators=base_estimators,
final_estimator=final_estimator,
cv=kfold,
passthrough=True)
Комментарии:
1. установка
random_state
времениshuffle=False
приведет к возникновению ошибки. Тоже наборshuffle=True
.