cvpartition

Класс: cvpartition

Создайте раздел перекрестной проверки для данных

Синтаксис

c = cvpartition(n,'KFold',k)
c = cvpartition(n,'HoldOut',p)
c = cvpartition(group,'KFold',k)
c = cvpartition(group,'KFold',k,'Stratify',stratifyOption)
c = cvpartition(group,'HoldOut',p)
c = cvpartition(group,'HoldOut',p,'Stratify',stratifyOption)
c = cvpartition(n,'LeaveOut')
c = cvpartition(n,'resubstitution')

Описание

c = cvpartition(n,'KFold',k) создает объект c класса cvpartition, задающего случайный нестратифицированный раздел для k - перекрестная проверка сгиба на наблюдениях n. Раздел делит наблюдения на k непересекающиеся подвыборки (или folds), выбранный случайным образом, но примерно с равным размером. Значением по умолчанию k является 10.

c = cvpartition(n,'HoldOut',p) создает случайный нестратифицированный раздел для валидации затяжки на наблюдениях n. Этот раздел делит наблюдения на набор обучающих данных и тест (или holdout) набор. Параметр p должен быть скаляром. Когда 0 <p <1, cvpartition случайным образом выбирает приблизительно наблюдения p*n для набора тестов. Когда p является целым числом, cvpartition случайным образом выбирает наблюдения p для набора тестов. Значением по умолчанию p является 1/10.

пример

c = cvpartition(group,'KFold',k) создает случайный раздел для стратифицированного k - перекрестная проверка сгиба. group является числовым вектором, категориальным массивом, символьным массивом, массивом строк или массивом ячеек из символьных векторов, указывающим на класс каждого наблюдения. Каждая подвыборка имеет примерно равный размер и примерно те же пропорции класса как в group.

Когда вы предоставляете group как первый входной параметр к cvpartition, функция создает разделы перекрестной проверки, которые не включают строки наблюдений, соответствующих отсутствующим значениям в group.

пример

c = cvpartition(group,'KFold',k,'Stratify',stratifyOption) возвращает объект c, задающий случайный раздел для k - перекрестная проверка сгиба. Когда вы предоставляете group как первый входной параметр к cvpartition, затем функция реализует стратификацию по умолчанию. Если вы также задаете 'Stratify',false, то функция создает нерасслоенные случайные разделы.

Можно задать 'Stratify',true, только если первым входным параметром к cvpartition является group.

c = cvpartition(group,'HoldOut',p) случайным образом наблюдения разделов в набор обучающих данных и затяжку (или тест) набор со стратификацией, с помощью информации о классе в group. И наборы обучающих данных и наборы тестов имеют примерно те же пропорции класса как в group.

пример

c = cvpartition(group,'HoldOut',p,'Stratify',stratifyOption) возвращает объект c, задающий случайный раздел в набор обучающих данных и затяжку (или тест) набор. Когда вы предоставляете group как первый входной параметр к cvpartition, затем функция реализует стратификацию по умолчанию. Если вы также задаете 'Stratify',false, то функция создает нерасслоенные случайные разделы.

c = cvpartition(n,'LeaveOut') создает случайный раздел для перекрестной проверки, "пропускают один" на наблюдениях n. "Пропустите один", особый случай 'KFold', в котором количество сгибов равняется количеству наблюдений.

c = cvpartition(n,'resubstitution') создает объект c, который не делит данные. И набор обучающих данных и набор тестов содержат все исходные наблюдения n.

Примеры

развернуть все

Используйте расслоенную 10-кратную перекрестную проверку, чтобы вычислить misclassification уровень.

Загрузите ирисовый набор данных Фишера.

load fisheriris;
y = species;
X = meas;

Создайте случайный раздел для стратифицированного 10 - перекрестная проверка сгиба.

c = cvpartition(y,'KFold',10);

Создайте функцию, которая вычисляет количество неправильно классифицированных тестовых выборок.

fun = @(xTrain,yTrain,xTest,yTest)(sum(~strcmp(yTest,...
    classify(xTest,xTrain,yTrain)))); 

Возвратите предполагаемый misclassification уровень с помощью перекрестной проверки.

rate = sum(crossval(fun,X,y,'partition',c))...
           /sum(c.TestSize)
rate = 0.0200

Найдите пропорцию каждого класса в 5-кратном нестратифицированном разделе данных fisheriris.

Загрузите ирисовый набор данных Фишера.

load fisheriris;

Найдите количество экземпляров каждого класса в данных.

[C,~,idx] = unique(species);
C % Unique classes
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

n = accumarray(idx(:),1) % Number of instances for each class in species
n = 3×1

    50
    50
    50

Эти три класса происходят в равной пропорции.

Создайте случайное, не расслоил 5-кратный раздел.

cv = cvpartition(species,'KFold',5,'Stratify',false) 
cv = 
K-fold cross validation partition
   NumObservations: 150
       NumTestSets: 5
         TrainSize: 120  120  120  120  120
          TestSize: 30  30  30  30  30

Покажите, что эти три класса не происходят в равной пропорции для каждого сгиба набора данных.

for i = 1:cv.NumTestSets
    disp(['Fold ',num2str(i)])
    testClasses = species(cv.test(i));
    [C,~,idx] = unique(testClasses);
    C % Unique classes
    nCount = accumarray(idx(:),1) % Number of instances for each class in a fold
end
Fold 1
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

     8
    13
     9

Fold 2
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

    10
    11
     9

Fold 3
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

    10
     8
    12

Fold 4
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

    12
     8
    10

Fold 5
C = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

    10
    10
    10

Поскольку cv является случайным нестратифицированным разделом данных fisheriris, пропорции класса в каждом из пяти сгибов, как гарантируют, не будут равны пропорциям класса в species. Таким образом, классы не происходят одинаково в каждом сгибе, как они делают в species. Перекрестная проверка производит случайность в результатах, таким образом, ваше количество экземпляров для каждого класса в сгибе может отличаться от показанных.

Сравните количество экземпляров для каждого класса в нестратифицированном наборе затяжки со стратифицированным набором затяжки длинного массива.

Создайте числовой вектор двух классов, где класс 1 и класс 2 происходит в отношении 1:10.

group = [ones(20,1);2*ones(200,1)]
group = 220×1

     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
      ⋮

Создайте длинный массив из group.

tgroup = tall(group)
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 12).

tgroup =

  220x1 tall double column vector

     1
     1
     1
     1
     1
     1
     1
     1
     :
     :

Holdout является единственной опцией cvpartition, которая поддерживается для длинных массивов. Создайте случайный, нестратифицированный раздел затяжки.

CV0 = cvpartition(tgroup,'Holdout',1/4,'Stratify',false)  
CV0 = 
Hold-out cross validation partition
   NumObservations: [1x1 tall]
       NumTestSets: 1
         TrainSize: [1x1 tall]
          TestSize: [1x1 tall]

Возвратите результат CV0.test к памяти при помощи функции gather.

testIdx0 = gather(CV0.test);
Evaluating tall expression using the Parallel Pool 'local':
Evaluation completed in 0.21 sec

Найдите число раз, каждый класс происходит в наборе затяжки.

accumarray(group(testIdx0),1) % Number of instances for each class in the holdout set
ans = 2×1

     5
    50

cvpartition производит случайность в результатах, таким образом, ваше количество экземпляров для каждого класса может отличаться от показанных.

Поскольку CV0 является нестратифицированным разделом, класс 1 и класс, 2 в наборе затяжки, как гарантируют, не произойдет в том же отношении, которое они делают в tgroup. Однако из-за свойственной случайности в cvpartition, можно иногда получать набор затяжки, для которого классы происходят в том же отношении, которое они делают в tgroup даже при том, что вы задаете 'Stratify',false. Подобный результат может быть проиллюстрирован для набора обучающих данных.

Возвратите результат CV0.training к памяти.

trainIdx0 = gather(CV0.training);
Evaluating tall expression using the Parallel Pool 'local':
Evaluation completed in 0.05 sec

Найдите число раз, каждый класс происходит в наборе обучающих данных.

accumarray(group(trainIdx0),1) % Number of instances for each class in the training set
ans = 2×1

    15
   150

Классы в нестратифицированном наборе обучающих данных, как гарантируют, не произойдут в том же отношении, которое они делают в tgroup.

Создайте случайный, стратифицированный раздел затяжки.

CV1 = cvpartition(tgroup,'Holdout',1/4)  
CV1 = 
Hold-out cross validation partition
   NumObservations: [1x1 tall]
       NumTestSets: 1
         TrainSize: [1x1 tall]
          TestSize: [1x1 tall]

Возвратите результат CV1.test к памяти.

testIdx1 = gather(CV1.test);
Evaluating tall expression using the Parallel Pool 'local':
Evaluation completed in 0.068 sec

Найдите число раз, каждый класс происходит в наборе затяжки.

accumarray(group(testIdx1),1) % Number of instances for each class in the holdout set
ans = 2×1

     5
    50

В случае стратифицированного раздела затяжки отношением класса в наборе затяжки и отношением класса в tgroup является тот же (1:10).

Алгоритмы

  • Если вы предоставляете group как первый входной параметр к cvpartition, функция создает разделы перекрестной проверки, которые не включают строки наблюдений, соответствующих отсутствующим значениям в group.

  • Когда вы предоставляете group как первый входной параметр к cvpartition, затем функция реализует стратификацию по умолчанию. Можно задать 'Stratify',false, чтобы создать нерасслоенные случайные разделы.

  • Можно задать 'Stratify',true, только если первым входным параметром к cvpartition является group.

Расширенные возможности

Введенный в R2008a