Помощь по модели с использованием 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)
Использовал Kbest, чтобы узнать оценки и отсортировать функции, а также попробовать комбинацию более высоких и более низких оценок.
Использовал SVM с GridSearch, используя StratifiedShuffle
Использовал best_estimator_ для прогнозирования и вычисления точности и отзыва.
Проблема в том, что оценщик выплевывает идеальные оценки, в некоторых случаях 1
Но когда я устанавливаю лучший классификатор на тренировочных данных, затем запускаю тест, он дает разумные оценки.
Мое сомнение / вопрос заключался в том, что именно GridSearch делает с тестовыми данными после разделения, используя объект разделения Shuffle, который мы отправляем в него. Я предположил, что это не будет соответствовать чему-либо на тестовых данных, если это правда, то когда я прогнозирую, используя те же тестовые данные, это не должно давать правильные результаты. Так как я использовал значение random_state, shufflesplit должен был создать ту же копию для подгонки к сетке, а также для прогнозирования.
Таким образом, использование одного и того же Shufflesplit для двух неправильно?
2 ответа
В основном поиск по сетке будет:
- Попробуйте каждую комбинацию вашей сетки параметров
- Для каждого из них будет проведена перекрестная проверка в K-кратном размере.
- Выберите лучшее из доступных.
Итак, ваш второй случай - хороший. В противном случае вы на самом деле прогнозируете данные, с которыми вы тренировались (что не так во втором варианте, там вы сохраняете только лучшие параметры из вашего gridsearch)
GridSearchCV, как сказал @Gauthier Feuillen, используется для поиска наилучших параметров оценки заданных данных. Описание GridSearchCV:-
gcv = GridSearchCV(pipe, clf_params,cv=cv)
gcv.fit(features,labels)
clf_params
будет расширен, чтобы получить все возможные комбинации отдельно с помощью ParameterGrid.features
теперь будет разделен наfeatures_train
а такжеfeatures_test
с помощьюcv
, То же самое дляlabels
- Теперь оценщик gridSearch (труба) будет обучаться с использованием
features_train
а такжеlabels_inner
и забил с помощьюfeatures_test
а такжеlabels_test
, - Для каждой возможной комбинации параметров в шаге 3 шаги 4 и 5 будут повторяться для
cv_iterations
, Будет рассчитано среднее количество баллов по итерациям cv, которое будет присвоено этой комбинации параметров. Это можно получить с помощьюcv_results_
атрибут gridSearch. - Для параметров, которые дают лучший результат, внутренний оценщик будет повторно инициализирован с использованием этих параметров и перефразирован для всех данных, введенных в него (признаки и метки).
Благодаря последнему шагу вы получаете разные оценки при первом и втором подходе. Потому что при первом подходе все данные используются для обучения, а вы прогнозируете только эти данные. Второй подход имеет прогнозирование на ранее неизвестных данных.