exponenta event banner

cvpartition

Данные секционирования для перекрестной проверки

Описание

cvpartition определяет случайный раздел в наборе данных. Этот раздел используется для определения обучающих и тестовых наборов для проверки статистической модели с использованием перекрестной проверки. Использовать training для извлечения учебных индексов и test для извлечения контрольных индексов для перекрестной проверки. Использовать repartition для определения нового случайного раздела того же типа, что и данный cvpartition объект.

Создание

Описание

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

пример

c = cvpartition(n,'Holdout',p) создает случайный нестратифицированный раздел для проверки удержания на n наблюдения. В этом разделе наблюдения делятся на обучающий набор и тестовый набор, или набор ожидания.

пример

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

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

пример

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

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

пример

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

пример

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

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

Входные аргументы

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

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

Пример: 100

Типы данных: single | double

Число складок в секции, указанное как положительный целочисленный скаляр. k должно быть меньше общего числа наблюдений.

Пример: 5

Типы данных: single | double

Доля или количество наблюдений в тестовом наборе, используемом для проверки удержания, указанное как скаляр в диапазоне (0,1) или целочисленный скаляр в диапазоне [1, n), где n - общее число наблюдений.

  • Если p является скаляром в диапазоне (0,1), то cvpartition случайным образом выбирает приблизительно p*n наблюдения для тестового набора.

  • Если p является целым скаляром в диапазоне [1, n), тоcvpartition случайным образом выбирает p наблюдения для тестового набора.

Пример: 0.2

Пример: 50

Типы данных: single | double

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

Типы данных: single | double | logical | categorical | char | string | cell

Показатель стратификации, указанный как true или false.

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

  • Если первый входной аргумент для cvpartition является n, то cvpartition всегда создает нестратифицированный случайный раздел ('Stratify',false). В этом случае невозможно указать 'Stratify',true.

Типы данных: logical

Свойства

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

Это свойство доступно только для чтения.

Число замечаний, включая замечания с отсутствующими group значения, заданные как положительный целочисленный скаляр.

Типы данных: double

Это свойство доступно только для чтения.

Общее количество тестовых наборов в разделе, указанное как количество складок, если тип раздела 'kfold' или 'leaveout', и 1 когда тип раздела 'holdout' или 'resubstitution'.

Типы данных: double

Это свойство доступно только для чтения.

Размер каждого тестового набора, определяемый как положительный целочисленный вектор, если типом секционирования является 'kfold' или 'leaveout'и положительным целым скаляром, если типом секционирования является 'holdout' или 'resubstitution'.

Типы данных: double

Это свойство доступно только для чтения.

Размер каждого обучающего набора, определяемый как положительный целочисленный вектор, если типом раздела является 'kfold' или 'leaveout'и положительным целым скаляром, если типом секционирования является 'holdout' или 'resubstitution'.

Типы данных: double

Это свойство доступно только для чтения.

Тип раздела проверки, указанный как 'kfold', 'holdout', 'leaveout', или 'resubstitution'.

Функции объекта

repartitionДанные перераспределения для перекрестной проверки
testКонтрольные показатели для перекрестной проверки
trainingУчебные индексы для перекрестной проверки

Примеры

свернуть все

Используйте ошибку ошибочной классификации перекрестной проверки, чтобы оценить, как модель будет работать с новыми данными.

Загрузить ionosphere набор данных. Создание таблицы, содержащей данные предиктора X и переменная ответа Y.

load ionosphere
tbl = array2table(X);
tbl.Y = Y;

Использовать случайный нестратифицированный раздел hpartition для разделения данных на данные обучения (tblTrain) и зарезервированный набор данных (tblNew). Зарезервируйте около 30 процентов данных.

rng('default') % For reproducibility
n = length(tbl.Y);
hpartition = cvpartition(n,'Holdout',0.3); % Nonstratified partition
idxTrain = training(hpartition);
tblTrain = tbl(idxTrain,:);
idxNew = test(hpartition);
tblNew = tbl(idxNew,:);

Обучение модели классификации вспомогательных векторных машин (SVM) с использованием обучающих данных tblTrain. Вычислите ошибку неправильной классификации и точность классификации данных обучения.

Mdl = fitcsvm(tblTrain,'Y');
trainError = resubLoss(Mdl)
trainError = 0.0569
trainAccuracy = 1-trainError
trainAccuracy = 0.9431

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

Создание секционированной модели cvMdl. Вычислите 10-кратную ошибку ошибочной классификации перекрестной проверки и точность классификации. По умолчанию crossval гарантирует, что пропорции класса в каждую складку останутся примерно такими же, как пропорции класса в переменной ответа tblTrain.Y.

cvMdl = crossval(Mdl); % Performs stratified 10-fold cross-validation
cvtrainError = kfoldLoss(cvMdl)
cvtrainError = 0.1220
cvtrainAccuracy = 1-cvtrainError
cvtrainAccuracy = 0.8780

Обратите внимание, что ошибка перекрестной проверки cvtrainError больше, чем ошибка повторного предоставления trainError.

Классифицировать новые данные в tblNew с использованием обученной модели SVM. Сравнение точности классификации новых данных с оценками точности trainAccuracy и cvtrainAccuracy.

newError = loss(Mdl,tblNew,'Y');
newAccuracy = 1-newError
newAccuracy = 0.8700

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

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

Загрузить fisheriris набор данных. Матрица meas содержит измерения цветов для 150 различных цветов. Переменная species перечисляет виды для каждого цветка.

load fisheriris

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

rng('default') % For reproducibility
c = cvpartition(species,'KFold',5);

Создание секционированной модели анализа дискриминантов и секционированной модели дерева классификации с помощью c.

discrCVModel = fitcdiscr(meas,species,'CVPartition',c);
treeCVModel = fitctree(meas,species,'CVPartition',c);

Вычислите коэффициенты неправильной классификации двух секционированных моделей.

discrRate = kfoldLoss(discrCVModel)
discrRate = 0.0200
treeRate = kfoldLoss(treeCVModel)
treeRate = 0.0333

Модель дискриминантного анализа имеет меньшую частоту неправильной классификации перекрестной проверки.

Соблюдать пропорции класса тестового набора (fold) в 5-кратном нестратифицированном разделе fisheriris данные. Пропорции классов различаются по складкам.

Загрузить fisheriris набор данных. species переменная содержит видовое название (класс) для каждого цветка (наблюдение). Новообращенный species в categorical переменная.

load fisheriris
species = categorical(species);

Найдите количество наблюдений в каждом классе. Обратите внимание, что эти три класса расположены в одинаковой пропорции.

C = categories(species) % Class names
C = 3x1 cell
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

numClasses = size(C,1);
n = countcats(species) % Number of observations in each class
n = 3×1

    50
    50
    50

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

rng('default') % For reproducibility
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 для обновления nTestData матрица, чтобы каждая запись nTestData(i,j) соответствует количеству наблюдений в тестовом наборе i и класс C(j). Создание гистограммы на основе данных в nTestData.

numFolds = cv.NumTestSets;
nTestData = zeros(numFolds,numClasses);
for i = 1:numFolds
    testClasses = species(cv.test(i));
    nCounts = countcats(testClasses); % Number of test set observations in each class
    nTestData(i,:) = nCounts';
end

bar(nTestData)
xlabel('Test Set (Fold)')
ylabel('Number of Observations')
title('Nonstratified Partition')
legend(C)

Figure contains an axes. The axes with title Nonstratified Partition contains 3 objects of type bar. These objects represent setosa, versicolor, virginica.

Обратите внимание, что пропорции классов различаются в некоторых наборах тестов. Например, первый тест-набор содержит 8 сетоз, 13 версиколор и 9 цветов virginica, а не 10 цветов на вид. Поскольку cv является случайным нестратифицированным разделом fisheriris данные, пропорции класса в каждом тестовом наборе (кратность) не гарантированно равны пропорциям класса в species. То есть классы не всегда встречаются одинаково в каждом наборе тестов, как это происходит в species.

Создайте нестратифицированный раздел удержания и стратифицированный раздел удержания для массива высокого уровня. Для двух наборов удержаний сравните количество наблюдений в каждом классе.

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

mapreducer(0)

Создание числового вектора из двух классов, где class 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)
tgroup =

  220x1 tall double column vector

     1
     1
     1
     1
     1
     1
     1
     1
     :
     :

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

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 Local MATLAB Session:
- Pass 1 of 1: Completed in 0.45 sec
Evaluation completed in 0.61 sec

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

accumarray(group(testIdx0),1) % Number of observations per class in the holdout set
ans = 2×1

     5
    51

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

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

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

trainIdx0 = gather(CV0.training);
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.18 sec
Evaluation completed in 0.24 sec

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

accumarray(group(trainIdx0),1) % Number of observations per class in the training set
ans = 2×1

    15
   149

Не гарантируется, что занятия в нестратифицированном обучающем наборе будут проходить в том же соотношении, что и в 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 Local MATLAB Session:
- Pass 1 of 1: Completed in 0.12 sec
Evaluation completed in 0.16 sec

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

accumarray(group(testIdx1),1) % Number of observations per class in the holdout set
ans = 2×1

     5
    51

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

Создайте случайный раздел данных для перекрестной проверки при отсутствии. Вычислите и сравните средства обучающего набора. Повторение со значительно другим средним значением предполагает наличие влиятельного наблюдения.

Создание набора данных X содержит одно значение, которое намного больше других.

X = [1 2 3 4 5 6 7 8 9 20]';

Создать cvpartition объект, имеющий 10 наблюдений и 10 повторений учебно-испытательных данных. Для каждого повторения, cvpartition выбирает одно наблюдение для удаления из обучающего набора и резервирует для тестового набора.

c = cvpartition(10,'Leaveout')
c = 
Leave-one-out cross validation partition
   NumObservations: 10
       NumTestSets: 10
         TrainSize: 9  9  9  9  9  9  9  9  9  9
          TestSize: 1  1  1  1  1  1  1  1  1  1

Применить раздел «оставить один» к Xи взять среднее значение обучающих наблюдений для каждого повторения с помощью crossval.

values = crossval(@(Xtrain,Xtest)mean(Xtrain),X,'Partition',c)
values = 10×1

    6.5556
    6.4444
    7.0000
    6.3333
    6.6667
    7.1111
    6.8889
    6.7778
    6.2222
    5.0000

Просмотр распределения средств обучающего набора с помощью диаграммы-рамки (или графика-рамки). На графике отображается одно отклонение.

boxchart(values)

Figure contains an axes. The axes contains an object of type boxchart.

Найдите повторение, соответствующее значению отклонения. Для этого повторения найдите наблюдение в наборе тестов.

[~,repetitionIdx] = min(values)
repetitionIdx = 10
observationIdx = test(c,repetitionIdx);
influentialObservation = X(observationIdx)
influentialObservation = 20

Обучающие наборы, содержащие наблюдение, имеют существенно отличающиеся средства от среднего значения обучающего набора без наблюдения. Это значительное изменение среднего значения предполагает, что значение 20 в X является влиятельным наблюдением.

Совет

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

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

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

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

Представлен в R2008a