Рандомизированная стратифицированная 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's: решена малая матрица, но требуются плотные данные
  • Проблемы при использовании реализации нейронной сети ScikitLearn
  • Как найти документы, которые находятся в одном кластере с KMeans
  • Tensorflow Precision / Recall / оценка F1 и матрица Confusion
  • Преобразование функции решения LinearSVC к вероятностям (Scikit learn python)
  • sci-kit learn: измените свои данные либо с помощью X.reshape (-1, 1)
  • Кластеризация на основе матрицы расстояний
  • sklearn LogisticRegression без регуляризации
  • Загрузка собственного текстового набора данных в scikit-learn
  • Выполнение оценки гиперпараметра для оценщика в каждом сводке рекурсивной функции Устранение
  • Лучший способ объединить вероятностные классификаторы в scikit-learn
  •  
    Interesting Posts for Van-Lav

    pip install -r requirements.txt от марионетки?

    Как node.js может быть быстрее c и java? Сравнительный пример: node.js, c, java и python

    Эквивалент команды вставки R для вектора чисел в Python

    Как преобразовать двоичную строку в строку ascii в python?

    Поиск в строках всех элементов как нулей в матрице с numpy

    Измените тензор TensorFlow внутри функции потери Keras?

    Как переопределить delete () на модели и работать с соответствующими удалениями

    Почему должен быть вызван QApplication.processEvents () до завершения QNetworkRequest при использовании QWebView?

    Максимальное время выполнения для функции в python (колба)

    Сельдерей: как проигнорировать задачу в аккорде или цепочке?

    scrapy, как сделать свой собственный графический планировщик

    Могу ли я писать целые строки в Google Spreadsheets, используя gspread в python?

    Использование только части DB Django

    Как построить рамку данных pandas с помощью andrew_curves?

    Преобразование объекта SRE_Match в строку

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