cvpartition

Класс: cvpartition

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

Описание

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
    {'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
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

nCount = 3×1

     8
    13
     9

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

nCount = 3×1

    10
    11
     9

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

nCount = 3×1

    10
     8
    12

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

nCount = 3×1

    12
     8
    10

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

nCount = 3×1

    10
    10
    10

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

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

Когда вы выполняете вычисления на длинных массивах, MATLAB® использует любого параллельный пул (значение по умолчанию, если у вас есть Parallel Computing Toolbox™), или локальный сеанс работы с MATLAB. Если вы хотите запустить пример с помощью локального сеанса работы с MATLAB, когда у вас есть Parallel Computing Toolbox, можно изменить глобальную среду выполнения при помощи mapreducer функция.

Создайте числовой вектор двух классов, где класс 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':
- Pass 1 of 1: Completed in 4.5 sec
Evaluation completed in 4.7 sec

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

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

     5
    52

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

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

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

trainIdx0 = gather(CV0.training);
Evaluating tall expression using the Parallel Pool 'local':
- Pass 1 of 1: Completed in 1.3 sec
Evaluation completed in 1.3 sec

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

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

    15
   148

Классы в нестратифицированном наборе обучающих данных, как гарантируют, не произойдут в том же отношении, которое они делают в 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':
- Pass 1 of 1: Completed in 0.89 sec
Evaluation completed in 0.99 sec

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

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

     5
    49

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

Алгоритмы

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

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

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

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

Введенный в R2008a