cvpartition

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

Описание

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

Создание

Описание

c = cvpartition(n,'KFold',k) возвращает cvpartition объект c это задает случайный нестратифицированный раздел для k- сверните перекрестную проверку на 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.

Типы данных: логический

Свойства

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

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

Количество наблюдений, включая наблюдения с пропавшими без вести 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Учебные индексы для перекрестной проверки

Примеры

свернуть все

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

Загрузите 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. Вычислите misclassification ошибку и точность классификации на обучающих данных.

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

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

Создайте разделенную модель cvMdl. Вычислите 10-кратную перекрестную проверку misclassification точность классификации и ошибка. По умолчанию, 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-кратной перекрестной проверки, чтобы вычислить misclassification уровни двух моделей.

Загрузите 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);

Вычислите misclassification уровни двух разделенных моделей.

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

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

Наблюдайте набор тестов (сгиб) пропорции класса в 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 setosa, 13 versicolor, и 9 virginica цветов, а не 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

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

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