2016-11-03 2 views
1

Я работаю над проблемой двоичной классификации и хотел бы выполнить вложенную перекрестную проверку для оценки ошибки классификации. Причина, по которой я делаю вложенное CV, объясняется небольшим размером выборки (N_0 = 20, N_1 = 10), где N_0, N_1 - количество экземпляров в 0 и 1 классах соответственно.Вложенная перекрестная проверка с помощью StratifiedShuffleSplit в sklearn

Мой код довольно прост:

>> pipe_logistic = Pipeline([('scl', StandardScaler()),('clf', LogisticRegression(penalty='l1'))]) 
>> parameters = {'clf__C': logspace(-4,1,50)} 
>> grid_search = GridSearchCV(estimator=pipe_logistic, param_grid=parameters, verbose=1, scoring='f1', cv=5) 
>> cross_val_score(grid_search, X, y, cv=5) 

До сих пор, так хорошо. Если я хочу изменить схему CV (от случайного расщепления до StratifiedShuffleSplit в обоих, внутренних и внутренних циклах CV, я столкнулся с проблемой: как я могу передать вектор класса y, как это требуется функцией StratifiedShuffleSplit?

Наивно:

>> grid_search = GridSearchCV(estimator=pipe_logistic, param_grid=parameters, verbose=1, scoring='f1', cv=StratifiedShuffleSplit(y_inner_loop, 5, test_size=0.5, random_state=0)) 
>> cross_val_score(grid_search, X, y, cv=StratifiedShuffleSplit(y, 5, test_size=0.5, random_state=0)) 

Таким образом, проблема заключается в том, чтобы указать y_inner_loop

** Мой набор данных немного несбалансированным (20/10), и я хотел бы сохранить это соотношение расщепления для обучения? и оценки модели.

+0

Отчасти не в тему, но @ arnold-klein, я изо всех сил пытаюсь понять, как это реализует вложенный CV - могли бы вы дать мне какие-либо указания, чтобы понять этот код? – ScottEdwards2000

+0

@ ScottEdwards2000, пожалуйста, см. Мой ответ для полного фрагмента кода. Вложенное CV состоит из двух этапов: внешнего и внутреннего. Внешний цикл (в моем случае это «sss_outer»), разбивает весь ваш набор данных на 5 кусков (BTW, не обязательно вы должны использовать «StratifiedShuffleSplit»), тогда внутренний цикл разбивает КАЖДЫЙ кусок на 3 куска, который он итерации тренировочные и тестовые наборы (как обычно, CV). Вложенное CV в моем коде реализовано в одной строке: '>> cross_val_score (grid_search, X, y, cv = sss_outer)', оно _оценивает нашу модель 5 раз (как sss_outer ~ 5). –

+0

гиперпараметр C (сила обратной регуляризации) настраивается на проверку внутреннего пересечения, которая определяется через «sss_inner» и передается как параметр в функции «grid_search»: '' >> grid_search = GridSearchCV (оценка = pipe_logistic, param_grid = параметры, verbose = 1, scoring = 'f1', cv = sss_inner) '' Таким образом, «cross_val_score» оценивает 5 моделей (5 суррогатных моделей), которые настроены на внутренний цикл CV в '' grid_search '. –

ответ

1

До сих пор я решил эту проблему, которая может заинтересовать некоторых новичков ML. В новейшей версии scikit-learn 0.18 перекрестные проверенные показатели переместились в модуль sklearn.model_selection и изменили (слегка) их API. Создание Короче говоря:

>> from sklearn.model_selection  import StratifiedShuffleSplit 
>> sss_outer = StratifiedShuffleSplit(n_splits=5, test_size=0.4, random_state=15) 
>> sss_inner = StratifiedShuffleSplit(n_splits=3, test_size=0.2, random_state=16) 
>> pipe_logistic = Pipeline([('scl', StandardScaler()),('clf', LogisticRegression(penalty='l1'))]) 
>> parameters = {'clf__C': logspace(-4,1,50)} 
>> grid_search = GridSearchCV(estimator=pipe_logistic, param_grid=parameters, verbose=1, scoring='f1', cv=sss_inner) 
>> cross_val_score(grid_search, X, y, cv=sss_outer) 

UPD в новейшей версии, нам не нужно явно указать вектор цели («у», которая была моя проблема изначально), а только количество требуемых разделений ,

+0

Да, это было невозможно в старой версии, поэтому мы его изменили;) –

+0

Удивительно! Благодарю. Еще один быстрый вопрос: как использовать разные показатели с «cross_val_score»?Я могу использовать метрики, которые производят одно число (точность, f1 и т. Д.). Мне интересно, можно ли выводить матричную метрику, такую ​​как матрица путаницы? –

+0

Существует аналогичная проблема с аргументом 'groups' в' GroupKFold' (вам нужно указать внутренние группы). Я делаю это вручную. – user86895

Смежные вопросы