Разные результаты из случайного леса после исправления случайного состояния

#python #machine-learning #scikit-learn #random-forest #gridsearchcv

#python #машинное обучение #scikit-учиться #случайный лес #поиск сетки cv

Вопрос:

У меня есть следующий код. Я уже установил случайное состояние. Каждый раз, когда я провожу перекрестную проверку, это дает мне новый набор оптимальных параметров. Для меня это просто не имеет смысла. Почему это происходит?

 rs = 5
param_range = np.arange(1,150,10,dtype=int)
param_range2 = np.arange(5,20,5,dtype=int)
pipe_steps = [('rfc',RandomForestClassifier())]
check_params = {
    'rfc__n_estimators':param_range,
    'rfc__max_depth':param_range2
}


pipeline = Pipeline(pipe_steps)

print('-------------------------- CV Start - Fitting training data --------------------------')
for K in [5,8,10]:
    create_grid = GridSearchCV(pipeline,param_grid=check_params,cv=KFold(n_splits=K, random_state=rs, shuffle=True))
    create_grid.fit(X_train,y_train)
    print('********************* Pipeline %d fold CV *********************' % (K))
    print(create_grid.best_params_)
    print("test score:= %3.2f" % (create_grid.score(X_test,y_test)))
print("CV End")
 

В первый раз, когда я запустил код, он дал бы мне следующее

 -------------------------- CV Start - Fitting training data --------------------------
********************* Pipeline 5 fold CV *********************
{'rfc__max_depth': 10, 'rfc__n_estimators': 21}
test score:= 0.53
********************* Pipeline 8 fold CV *********************
{'rfc__max_depth': 10, 'rfc__n_estimators': 101}
test score:= 0.61
********************* Pipeline 10 fold CV *********************
{'rfc__max_depth': 5, 'rfc__n_estimators': 81}
test score:= 0.68
CV End
 

Во второй раз, когда я запустил код, оптимальные параметры изменились.

 -------------------------- CV Start - Fitting training data --------------------------
********************* Pipeline 5 fold CV *********************
{'rfc__max_depth': 10, 'rfc__n_estimators': 81}
test score:= 0.55
********************* Pipeline 8 fold CV *********************
{'rfc__max_depth': 15, 'rfc__n_estimators': 71}
test score:= 0.53
********************* Pipeline 10 fold CV *********************
{'rfc__max_depth': 15, 'rfc__n_estimators': 81}
test score:= 0.63
CV End
 

Ответ №1:

Чтобы получить воспроизводимые результаты, вы должны установить начальное значение для каждого действия в коде, которое включает случайность. Здесь вы делаете это для GridSearchCV и KFold , но не для вашего RandomForestClassifier ; вы должны инициализировать его как

 pipe_steps = [('rfc',RandomForestClassifier(random_state=rs))]