Помощь по модели с использованием Scikit-learn при использовании GridSearch

В рамках проекта Enron, построенного прилагаемой модели, ниже приводится краткое описание шагов,

Ниже модель дает отличные оценки

cv = StratifiedShuffleSplit(n_splits = 100, test_size = 0.2, random_state = 42)
gcv = GridSearchCV(pipe, clf_params,cv=cv)

gcv.fit(features,labels) ---> with the full dataset

for train_ind, test_ind in cv.split(features,labels):
    x_train, x_test = features[train_ind], features[test_ind]
    y_train, y_test = labels[train_ind],labels[test_ind]

    gcv.best_estimator_.predict(x_test)

Ниже модель дает более разумные, но низкие оценки

cv = StratifiedShuffleSplit(n_splits = 100, test_size = 0.2, random_state = 42)
gcv = GridSearchCV(pipe, clf_params,cv=cv)

gcv.fit(features,labels) ---> with the full dataset

for train_ind, test_ind in cv.split(features,labels):
     x_train, x_test = features[train_ind], features[test_ind]
     y_train, y_test = labels[train_ind],labels[test_ind]

     gcv.best_estimator_.fit(x_train,y_train)
     gcv.best_estimator_.predict(x_test)
  1. Использовал Kbest, чтобы узнать оценки и отсортировать функции, а также попробовать комбинацию более высоких и более низких оценок.

  2. Использовал SVM с GridSearch, используя StratifiedShuffle

  3. Использовал best_estimator_ для прогнозирования и вычисления точности и отзыва.

Проблема в том, что оценщик выплевывает идеальные оценки, в некоторых случаях 1

Но когда я устанавливаю лучший классификатор на тренировочных данных, затем запускаю тест, он дает разумные оценки.

Мое сомнение / вопрос заключался в том, что именно GridSearch делает с тестовыми данными после разделения, используя объект разделения Shuffle, который мы отправляем в него. Я предположил, что это не будет соответствовать чему-либо на тестовых данных, если это правда, то когда я прогнозирую, используя те же тестовые данные, это не должно давать правильные результаты. Так как я использовал значение random_state, shufflesplit должен был создать ту же копию для подгонки к сетке, а также для прогнозирования.

Таким образом, использование одного и того же Shufflesplit для двух неправильно?

2 ответа

Решение

В основном поиск по сетке будет:

  • Попробуйте каждую комбинацию вашей сетки параметров
  • Для каждого из них будет проведена перекрестная проверка в K-кратном размере.
  • Выберите лучшее из доступных.

Итак, ваш второй случай - хороший. В противном случае вы на самом деле прогнозируете данные, с которыми вы тренировались (что не так во втором варианте, там вы сохраняете только лучшие параметры из вашего gridsearch)

GridSearchCV, как сказал @Gauthier Feuillen, используется для поиска наилучших параметров оценки заданных данных. Описание GridSearchCV:-

  1. gcv = GridSearchCV(pipe, clf_params,cv=cv)
  2. gcv.fit(features,labels)
  3. clf_params будет расширен, чтобы получить все возможные комбинации отдельно с помощью ParameterGrid.
  4. features теперь будет разделен на features_train а также features_test с помощью cv, То же самое для labels
  5. Теперь оценщик gridSearch (труба) будет обучаться с использованием features_train а также labels_inner и забил с помощью features_test а также labels_test,
  6. Для каждой возможной комбинации параметров в шаге 3 шаги 4 и 5 будут повторяться для cv_iterations, Будет рассчитано среднее количество баллов по итерациям cv, которое будет присвоено этой комбинации параметров. Это можно получить с помощью cv_results_ атрибут gridSearch.
  7. Для параметров, которые дают лучший результат, внутренний оценщик будет повторно инициализирован с использованием этих параметров и перефразирован для всех данных, введенных в него (признаки и метки).

Благодаря последнему шагу вы получаете разные оценки при первом и втором подходе. Потому что при первом подходе все данные используются для обучения, а вы прогнозируете только эти данные. Второй подход имеет прогнозирование на ранее неизвестных данных.

Другие вопросы по тегам