cvpartition

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

Описание

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

Создание

Описание

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

пример

c = cvpartition(n,'Holdout',p) создает случайный нонерализованный раздел для валидации удержания на n наблюдения. Этот разбиение делит наблюдения на набор обучающих данных и набор тестов, или holdout.

пример

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) случайным образом разбивает наблюдения на набор обучающих данных и тест, или holdout, установленный с расслоением, используя информацию о классе в group. И обучающий, и тестовый наборы имеют примерно те же пропорции классов, что и в group.

пример

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

пример

c = cvpartition(n,'Leaveout') создает случайный раздел для кросс-валидации с одним выходом на n наблюдения. Leave-one-out является частным случаем '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

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

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

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

load fisheriris

Создайте случайный раздел для стратифицированной 5-кратной перекрестной проверки. Обучающие и тестовые наборы имеют примерно такие же пропорции видов цветов, как 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

Дискриминантная модель анализа имеет меньшую степень искажения перекрестной валидации.

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

Загрузите fisheriris набор данных. The 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-loop, чтобы обновить 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 цветков виргиники, а не 10 цветов на вид. Потому что cv является случайным нонерализованным разбиением fisheriris данные, пропорции классов в каждом тестовом наборе (складке) не гарантировано равны пропорциям классов в species. То есть классы не всегда происходят одинаково в каждом тестовом наборе, как это делается в species.

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

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

mapreducer(0)

Создайте числовой вектор из двух классов, где 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 опция, поддерживаемая для длинных массивов. Создайте случайный нертифицированный раздел с ограничением.

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

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

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

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

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

     5
    51

В случае стратифицированного holdout-разбиения отношение классов в holdout-наборе и отношение классов в 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