перекрестная валидация в Sklearn с использованием пользовательского резюме - PullRequest
0 голосов
/ 07 июня 2019

Я имею дело с проблемой двоичной классификации.

У меня есть 2 списка индексов listTrain и listTest, , которые являются разделами обучающего набора (будет использоваться фактический тестовый набор)только позже) .Я хотел бы использовать выборки, связанные с listTrain, для оценки параметров, и выборки, связанные с listTest, для оценки ошибки в процессе перекрестной проверки (подход с заданным набором).

Однако яЯ не могу найти правильный способ передать это в sklearn GridSearchCV.

В документации сказано, что я должен создать «Итеративные уступающие (обучающие, тестовые) разбиения как массивы индексов».Однако я не знаю, как это создать.

grid_search = GridSearchCV(estimator = model, param_grid = param_grid,cv = custom_cv, n_jobs = -1, verbose = 0,scoring=errorType)

Итак, мой вопрос заключается в том, как создать custom_cv на основе этих индексов для использования в этом методе?

X и y - соответственно матрица признаков, а y - вектор меток.

Пример: Предположим, у меня есть только один гиперпараметр альфа, который принадлежит набору {1,2,3}.Я хотел бы установить альфа = 1, оценить параметры модели (например, коэффициенты регрессии), используя выборки, связанные с listTrain, и оценить ошибку, используя выборки, связанные с listTest.Затем я повторяю процесс для альфа = 2 и, наконец, для альфа = 3.Затем я выбираю альфу, которая минимизирует ошибку.

1 Ответ

1 голос
/ 07 июня 2019

РЕДАКТИРОВАТЬ: фактический ответ на вопрос.Попробуйте передать cv команду генератору индексов:

def index_gen(listTrain, listTest):
    yield listTrain, listTest

grid_search = GridSearchCV(estimator = model, param_grid = 
    param_grid,cv = index_gen(listTrain, listTest), n_jobs = -1, 
    verbose = 0,scoring=errorType)

РЕДАКТИРОВАТЬ: До редактирования:

Как уже упоминалось в комментарии пустынного, то, что вы пытаетесь сделать, это плохая практика MLи в итоге вы получите предвзятую оценку производительности обобщения окончательной модели.Использование набора тестов так, как вы предлагаете, эффективно утечет информацию о наборе тестов на этапе обучения и даст вам переоценку способности модели классифицировать невидимые данные.Что я предлагаю в вашем случае:

grid_search = GridSearchCV(estimator = model, param_grid = param_grid,cv = 5, 
    n_jobs = -1, verbose = 0,scoring=errorType)

grid_search.fit(x[listTrain], y[listTrain]

Теперь ваш тренировочный набор будет разбит на 5 (вы можете выбрать количество здесь) сгибов, обученных с использованием 4 из этих сгибов на определенном наборе гиперпараметров, ипроверил сгиб, который был опущен.Это повторяется 5 раз, пока все ваши тренировочные примеры не станут частью пропущенного набора.Вся эта процедура выполняется для каждого параметра гиперпараметра, который вы тестируете (в данном случае 5x3)

grid_search.best_params_ даст вам словарь параметров, которые показали наилучшие результаты за все 5 сгибов.Вот параметры, которые вы используете для обучения вашего окончательного классификатора, снова используя только обучающий набор:

clf = LogisticRegression(**grid_search.best_params_).fit(x[listTrain], 
    y[listTrain])

Теперь, наконец, ваш классификатор проверяется на тестовом наборе и дается объективная оценка эффективности обобщения:

predictions = clf.predict(x[listTest])
...