Рандомизированная стратифицированная k-кратная перекрестная проверка в scikit-learn?

Есть ли какой-либо встроенный способ получить scikit-learn для выполнения перетасованной стратифицированной кросс-валидации k-fold? Это один из самых распространенных методов CV, и я удивлен, что не смог найти встроенный метод для этого.

Я видел, что cross_validation.KFold() имеет флаг перетасовки, но он не стратифицирован. К сожалению cross_validation.StratifiedKFold() не имеет такой опции, а cross_validation.StratifiedShuffleSplit() не создает непересекающиеся складки.

Я что-то упускаю? Планируется ли это?

(очевидно, я могу реализовать это сам)

4 Solutions collect form web for “Рандомизированная стратифицированная k-кратная перекрестная проверка в scikit-learn?”

Флаг cross_validation.StratifiedKFold для cross_validation.StratifiedKFold был введен в текущей версии 0.15:

http://scikit-learn.org/0.15/modules/generated/sklearn.cross_validation.StratifiedKFold.html

Это можно найти в списке изменений:

http://scikit-learn.org/stable/whats_new.html#new-features

Параметр Shuffle для cross_validation.StratifiedKFold. Джеффри Блэкберн.

Я думал, что отправлю свое решение в случае, если это будет полезно кому-либо еще.

 from collections import defaultdict import random def strat_map(y): """ Returns permuted indices that maintain class """ smap = defaultdict(list) for i,v in enumerate(y): smap[v].append(i) for values in smap.values(): random.shuffle(values) y_map = np.zeros_like(y) for i,v in enumerate(y): y_map[i] = smap[v].pop() return y_map ########## #Example Use ########## skf = StratifiedKFold(y, nfolds) sm = strat_map(y) for test, train in skf: test,train = sm[test], sm[train] #then cv as usual ####### #tests# ####### import numpy.random as rnd for _ in range(100): y = np.array( [0]*10 + [1]*20 + [3] * 10) rnd.shuffle(y) sm = strat_map(y) shuffled = y[sm] assert (sm != range(len(y))).any() , "did not shuffle" assert (shuffled == y).all(), "classes not in right position" assert (set(sm) == set(range(len(y)))), "missing indices" for _ in range(100): nfolds = 10 skf = StratifiedKFold(y, nfolds) sm = strat_map(y) for test, train in skf: assert (sm[test] != test).any(), "did not shuffle" assert (y[sm[test]] == y[test]).all(), "classes not in right position" 

Вот моя реализация раздробленного перетасования в набор для обучения и тестирования:

 import numpy as np def get_train_test_inds(y,train_proportion=0.7): '''Generates indices, making random stratified split into training set and testing sets with proportions train_proportion and (1-train_proportion) of initial sample. y is any iterable indicating classes of each observation in the sample. Initial proportions of classes inside training and test sets are preserved (stratified sampling). ''' y=np.array(y) train_inds = np.zeros(len(y),dtype=bool) test_inds = np.zeros(len(y),dtype=bool) values = np.unique(y) for value in values: value_inds = np.nonzero(y==value)[0] np.random.shuffle(value_inds) n = int(train_proportion*len(value_inds)) train_inds[value_inds[:n]]=True test_inds[value_inds[n:]]=True return train_inds,test_inds y = np.array([1,1,2,2,3,3]) train_inds,test_inds = get_train_test_inds(y,train_proportion=0.5) print y[train_inds] print y[test_inds] 

Этот код выводит:

 [1 2 3] [1 2 3] 

Насколько я знаю, это действительно реализовано в scikit-learn.

"" "Инициализатор перекрестной проверки переадресации ShuffleSplit

Предоставляет данные поезда / теста для разделения данных в наборах для тестирования поездов.

Этот объект перекрестной проверки является слиянием StratifiedKFold и ShuffleSplit, который возвращает стратифицированные рандомизированные складки. Складки делаются путем сохранения процента образцов для каждого класса.

Примечание. Подобно стратегии ShuffleSplit, стратифицированные случайные расщепления не гарантируют, что все складки будут разными, хотя это все еще очень вероятно для значительных наборов данных. «»»

  • Стратифицированный поезд / тест-раскол в scikit-learn
  • Контролируемое снижение размерности для текстовых данных в scikit-learn
  • Прогнозирование с использованием ядра chi для многослойных изображений с использованием sklearn
  • Масштабирование цели приводит к тому, что Scikit-learn регрессия SVM разбивается
  • k-средство с выбранными начальными центрами
  • Как получить наиболее информативные функции для scikit-learn classifier для разных классов?
  • scikit-learn SVM.SVC () чрезвычайно медленный
  • MemoryError в Python, но не IPython
  •  
    Interesting Posts for Van-Lav

    matplotlib: соотношение сторон в подзаголовках с различными y-осями

    Функция Python с множеством аргументов

    Как найти все файлы в текущем каталоге с именами файлов, которые соответствуют определенному шаблону в python?

    Это нормально использовать MRO, чтобы переопределить mixin?

    Ошибка ключа Python при установке переменной среды в супервизор

    Перезагрузка сервера Django занимает слишком много времени

    numpy – оценивать функцию на сетке точек

    Как повторить фрагмент кода определенное количество раз в python

    Как проверить, построена ли библиотека на 32 бит / 64 бит на Mac OS X?

    открытый python и утечки памяти

    Как применять нарезку на пандах Серия строк

    Mayavi: интерполировать цвета лица в triangular_mesh

    Передача пути к Labview DLL в Python

    Наследование модели Django: создать вспомогательный экземпляр существующего экземпляра (downcast)?

    внедрение генераторов python с закрытием

    Python - лучший язык программирования в мире.