GridSearchCV и cross_val_score дают разные результаты в случае дерева решений - PullRequest
0 голосов
/ 18 января 2020

Используя GridSearchCV best_score_ и помещая best_params_ из GridSearchCV в cross_val_score, я получил другой результат. И это происходит только в случае дерева решений и случайного леса. Хотя в случае «SVM», «KNN», «LR», результат тот же.
Вот код, который я использую:

def dtree_param_selection(X,y):
    #create a dictionary of all values we want to test
    param_grid = { 'criterion':['gini','entropy'],'max_features':["auto", "sqrt", "log2"],'max_depth': np.arange(2, 20)}
    # decision tree model
    dtree_model=DecisionTreeClassifier()
    #use gridsearch to test all values
    dtree_gscv = GridSearchCV(dtree_model, param_grid, cv=10)
    #fit model to data
    dtree_gscv.fit(X, y)
    print(dtree_gscv.best_score_)
    return dtree_gscv.best_params_

dtree_param_selection(good_feature,label)

cross_val_score:

clf = DecisionTreeClassifier(dtree_gscv.best_params_)
acc = cross_val_score(clf,good_feature,label,cv=10)

Ответы [ 2 ]

1 голос
/ 18 января 2020

Проблема может быть связана с тем, что модели дерева, используемые GridSearchCV и cross_val_score, создаются с разными случайными начальными числами. Если бы это было так, вы должны быть в состоянии исправить это, установив случайное состояние явно. Если вы хотите создать clf из GridSearchCV.best_params_, то вам следует включить random_state в сетку параметров, ie.:

...
param_grid = { 'random_state': [0], ... }
...

Другой способ решения этой проблемы - использование лучшая модель GridSearchCV непосредственно в функции Cross Val, чтобы убедиться, что вы не пропустите ни одного гиперпараметра:

acc = cross_val_score(dtree_gscv.best_model_, good_feature,label, cv=10)
1 голос
/ 18 января 2020

В случае моделей на основе дерева, вы должны установить параметр random_state перед тренировкой. По умолчанию None. Это обеспечит одинаковые результаты.

Из documentation:

random_state int or RandomState, default=None

Если int, random_state является начальное число, используемое генератором случайных чисел; Если экземпляр RandomState, random_state является генератором случайных чисел; Если None, генератор случайных чисел - это экземпляр RandomState, используемый np.random

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...