이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

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)n개 관측값에 대한 k겹 교차 검증에 사용할 층화되지 않은 임의 분할을 정의하는 cvpartition 클래스의 객체 c를 생성합니다. 이 분할은 관측값을 무작위로 선택되었지만 크기가 대략적으로 같은 k개의 서로 겹치지 않는 부표본으로 분할합니다(즉, ). k의 디폴트 값은 10입니다.

c = cvpartition(n,'HoldOut',p)n개 관측값에 대한 홀드아웃 검증에 사용할 층화되지 않은 임의 분할을 생성합니다. 이 분할은 관측값을 하나의 훈련 세트와 하나의 검정(즉, 홀드아웃) 세트로 분할합니다. 모수 p는 스칼라여야 합니다. 0 < p < 1인 경우 cvpartition은 검정 세트에 대해 대략 p*n개의 관측값을 무작위로 선택합니다. p가 정수이면 cvpartition은 검정 세트에 대해 p개의 관측값을 무작위로 선택합니다. p의 디폴트 값은 1/10입니다.

예제

c = cvpartition(group,'KFold',k)는 층화된 k겹 교차 검증에 사용할 임의 분할을 생성합니다. group은 숫자형 벡터, categorical형 배열, 문자형 배열, string형 배열 또는 문자형 벡터로 구성된 셀형 배열이며 관측값의 클래스를 나타냅니다. 각 부표본은 크기가 대략 같으며 그 클래스 비율도 group에서의 클래스 비율과 대략 같습니다.

groupcvpartition에 대한 첫 번째 입력 인수로 지정하면 group의 결측값에 대응되는 관측값 행을 포함하지 않는 교차 검증 분할이 생성됩니다.

예제

c = cvpartition(group,'KFold',k,'Stratify',stratifyOption)k겹 교차 검증에 사용할 임의 분할을 정의하는 객체 c를 반환합니다. groupcvpartition에 대한 첫 번째 입력 인수로 제공하면 기본적으로 층화가 구현됩니다. 'Stratify',false를 지정하면 층화되지 않은 임의 분할이 생성됩니다.

'Stratify',truecvpartition에 대한 첫 번째 입력 인수가 group인 경우에만 지정할 수 있습니다.

c = cvpartition(group,'HoldOut',p)group의 클래스 정보를 사용하여 관측값을 층화된 훈련 세트 하나와 홀드아웃(즉, 검정) 세트 하나로 임의로 분할합니다. 훈련 세트와 검정 세트 모두 클래스 비율이 group에서의 클래스 비율과 대략 같습니다.

예제

c = cvpartition(group,'HoldOut',p,'Stratify',stratifyOption)은 훈련 세트 및 홀드아웃(즉, 검정) 세트에 대한 임의 분할을 정의하는 객체 c를 반환합니다. groupcvpartition에 대한 첫 번째 입력 인수로 제공하면 기본적으로 층화가 구현됩니다. 'Stratify',false를 지정하면 층화되지 않은 임의 분할이 생성됩니다.

c = cvpartition(n,'LeaveOut')n개 관측값에 대한 리브-원-아웃 교차 검증에 사용할 임의 분할을 생성합니다. 리브-원-아웃은 'KFold'의 특수한 사례로, 겹의 개수가 관측값 개수와 같습니다.

c = cvpartition(n,'resubstitution')은 데이터를 분할하지 않는 객체 c를 생성합니다. 훈련 세트와 검정 세트 모두 n개의 원래 관측값 전체를 포함합니다.

예제

모두 확장

층화된 10겹 교차 검증을 사용하여 오분류율을 계산합니다.

피셔(Fisher)의 붓꽃 데이터 세트를 불러옵니다.

load fisheriris;
y = species;
X = meas;

층화된 10겹 교차 검증에 사용할 임의 분할을 생성합니다.

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

오분류된 검정 표본의 개수를 계산하는 함수를 생성합니다.

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

교차 검증을 사용하여 추정된 오분류율을 반환합니다.

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

fisheriris 데이터의 층화되지 않은 5겹 분할에 포함된 각 클래스의 비율을 구합니다.

피셔(Fisher)의 붓꽃 데이터 세트를 불러옵니다.

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

cvfisheriris 데이터의 층화되지 않은 임의 분할이기 때문에 5겹 각각마다 클래스 비율이 species의 클래스 비율과 같다는 보장이 없습니다. 즉, 각각의 겹에서는 species에서처럼 클래스가 동일하게 나타나지 않습니다. 교차 검증을 수행하면 결과가 임의성을 띠게 되므로 겹에서 각 클래스의 인스턴스 개수가 여기에 표시된 결과와 다를 수 있습니다.

층화되지 않은 홀드아웃 세트에 있는 각 클래스의 인스턴스 개수를 tall형 배열의 층화된 홀드아웃 세트와 비교합니다.

두 개의 클래스로 구성된 숫자형 벡터를 생성합니다. 여기서 클래스 1과 클래스 21:10 비율로 나타납니다.

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

     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
      ⋮

group에서 tall형 배열을 생성합니다.

tgroup = tall(group)
Starting parallel pool (parpool) using the 'local' profile ...
connected to 4 workers.

tgroup =

  220x1 tall double column vector

     1
     1
     1
     1
     1
     1
     1
     1
     :
     :

Holdout은 tall형 배열에 지원되는 유일한 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]

gather 함수를 사용하여 CV0.test의 결과를 메모리에 반환합니다.

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

각 클래스가 홀드아웃 세트에 나타나는 횟수를 구합니다.

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

     3
    52

cvpartition을 사용하면 결과가 임의성을 띠게 되므로 각 클래스의 인스턴스가 여기에 표시된 결과와 다를 수 있습니다.

CV0은 층화되지 않은 분할이기 때문에 홀드아웃 세트에서 클래스 1과 클래스 2tgroup에서와 같은 비율로 나타난다는 보장이 없습니다. 하지만 cvpartition의 내재된 임의성으로 인해, 'Stratify',false를 지정하더라도 홀드아웃 세트에서 클래스가 tgroup에서와 같은 비율로 나타나는 경우가 있습니다. 훈련 세트에 대해서도 유사한 결과가 나타날 수 있습니다.

CV0.training의 결과를 메모리에 반환합니다.

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

훈련 세트에서 각 클래스가 나타나는 횟수를 구합니다.

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

    17
   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':
Evaluation completed in 0.091 sec

각 클래스가 홀드아웃 세트에 나타나는 횟수를 구합니다.

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

     5
    50

층화된 홀드아웃 분할의 경우 홀드아웃 세트의 클래스 비율과 tgroup의 클래스 비율은 동일하게 (1:10).입니다.

알고리즘

  • groupcvpartition에 대한 첫 번째 입력 인수로 제공하면 함수가 group의 결측값에 대응되는 관측값 행을 포함하지 않는 교차 검증 분할을 생성합니다.

  • groupcvpartition에 대한 첫 번째 입력 인수로 제공하면 기본적으로 층화가 구현됩니다. 'Stratify',false를 지정하면 층화되지 않은 임의 분할을 생성할 수 있습니다.

  • 'Stratify',truecvpartition에 대한 첫 번째 입력 인수가 group인 경우에만 지정할 수 있습니다.

확장 기능

참고 항목

|

도움말 항목

R2008a에 개발됨