Main Content

predict

서포트 벡터 머신(SVM) 분류기를 사용하여 관측값 분류

설명

예제

label = predict(SVMModel,X)는 훈련된 서포트 벡터 머신(SVM) 분류 모델 SVMModel을 기반으로, 테이블 또는 행렬 X에 있는 예측 변수 데이터의 클래스 레이블을 예측하여 벡터로 반환합니다. 훈련된 SVM 모델은 전체 모델 또는 간소 모델일 수 있습니다.

예제

[label,score] = predict(SVMModel,X)는 레이블이 특정 클래스에서 온 것일 확률을 나타내는 점수(score)로 구성된 행렬도 반환합니다. SVM의 경우, 가능도 측정값은 분류 점수 또는 클래스 사후 확률일 수 있습니다. X의 각 관측값에 대해 예측된 클래스 레이블은 모든 클래스 중에서 최대 점수에 대응됩니다.

예제

모두 축소

ionosphere 데이터 세트를 불러옵니다.

load ionosphere
rng(1); % For reproducibility

SVM 분류기를 훈련시킵니다. 검정을 위해 15% 홀드아웃 표본을 지정하고, 데이터를 표준화하고, 'g'가 양성 클래스라고 지정합니다.

CVSVMModel = fitcsvm(X,Y,'Holdout',0.15,'ClassNames',{'b','g'},...
    'Standardize',true);
CompactSVMModel = CVSVMModel.Trained{1}; % Extract trained, compact classifier
testInds = test(CVSVMModel.Partition);   % Extract the test indices
XTest = X(testInds,:);
YTest = Y(testInds,:);

CVSVMModelClassificationPartitionedModel 분류기입니다. 이 모델에는 속성 Trained가 포함됩니다. 이 속성에는 훈련 세트를 사용하여 훈련된 CompactClassificationSVM 분류기가 1×1 셀형 배열로 포함됩니다.

검정 표본 관측값에 레이블을 지정합니다. 검정 표본의 처음 10개 관측값에 대해 결과를 표시합니다.

[label,score] = predict(CompactSVMModel,XTest);
table(YTest(1:10),label(1:10),score(1:10,2),'VariableNames',...
    {'TrueLabel','PredictedLabel','Score'})
ans=10×3 table
    TrueLabel    PredictedLabel     Score  
    _________    ______________    ________

      {'b'}          {'b'}          -1.7175
      {'g'}          {'g'}           2.0003
      {'b'}          {'b'}          -9.6836
      {'g'}          {'g'}           2.5616
      {'b'}          {'b'}           -1.548
      {'g'}          {'g'}           2.0983
      {'b'}          {'b'}          -2.7016
      {'b'}          {'b'}         -0.66331
      {'g'}          {'g'}           1.6047
      {'g'}          {'g'}            1.773

SVM 분류기를 사용하여 새 관측값에 레이블을 지정합니다.

ionosphere 데이터 세트를 불러옵니다. 마지막 10개 관측값은 SVM 분류기를 훈련시킨 후에 사용 가능해진다고 가정합니다.

load ionosphere
rng(1); % For reproducibility
n = size(X,1);       % Training sample size 
isInds = 1:(n-10);   % In-sample indices 
oosInds = (n-9):n;   % Out-of-sample indices

SVM 분류기를 훈련시킵니다. 데이터를 표준화하고 'g'가 양성 클래스라고 지정합니다. 훈련된 SVM 분류기의 크기를 줄여서 메모리를 절약합니다.

SVMModel = fitcsvm(X(isInds,:),Y(isInds),'Standardize',true,...
    'ClassNames',{'b','g'});
CompactSVMModel = compact(SVMModel);
whos('SVMModel','CompactSVMModel')
  Name                 Size             Bytes  Class                                                 Attributes

  CompactSVMModel      1x1              30651  classreg.learning.classif.CompactClassificationSVM              
  SVMModel             1x1             137751  ClassificationSVM                                               

CompactClassificationSVM 분류기(CompactSVMModel)는 ClassificationSVM 분류기(SVMModel)보다 적은 공간을 사용합니다. SVMModel은 데이터도 저장합니다.

점수를 사후 확률로 변환하는 최적의 함수를 추정합니다.

CompactSVMModel = fitPosterior(CompactSVMModel,...
    X(isInds,:),Y(isInds))
CompactSVMModel = 
  CompactClassificationSVM
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'b'  'g'}
           ScoreTransform: '@(S)sigmoid(S,-1.968336e+00,3.121821e-01)'
                    Alpha: [88x1 double]
                     Bias: -0.2142
         KernelParameters: [1x1 struct]
                       Mu: [0.8886 0 0.6365 0.0457 0.5933 0.1200 0.5414 0.1217 0.5020 0.1872 0.4659 0.1596 0.3889 0.0970 0.3308 0.0723 0.3685 -0.0039 0.3453 -0.0256 0.3231 0.0097 0.3490 -0.0596 0.3839 -0.0731 0.5343 -0.0718 0.3659 ... ] (1x34 double)
                    Sigma: [0.3151 0 0.5032 0.4476 0.5251 0.4668 0.4966 0.5275 0.5107 0.4896 0.5681 0.5011 0.6267 0.5009 0.6569 0.4639 0.6214 0.5035 0.6296 0.5265 0.6128 0.5250 0.6067 0.5349 0.5817 0.5157 0.5212 0.5577 0.5787 0.5151 ... ] (1x34 double)
           SupportVectors: [88x34 double]
      SupportVectorLabels: [88x1 double]


클래스는 분리 불가능하기 때문에 최적의 점수 변환 함수(CompactSVMModel.ScoreTransform)는 시그모이드 함수입니다.

표본외 레이블과 양성 클래스 사후 확률을 예측합니다. 실제 레이블이 있으므로 실제 레이블과 예측된 레이블을 비교합니다.

[labels,PostProbs] = predict(CompactSVMModel,X(oosInds,:));
table(Y(oosInds),labels,PostProbs(:,2),'VariableNames',...
    {'TrueLabels','PredictedLabels','PosClassPosterior'})
ans=10×3 table
    TrueLabels    PredictedLabels    PosClassPosterior
    __________    _______________    _________________

      {'g'}            {'g'}              0.98419     
      {'g'}            {'g'}              0.95545     
      {'g'}            {'g'}              0.67792     
      {'g'}            {'g'}              0.94448     
      {'g'}            {'g'}              0.98745     
      {'g'}            {'g'}              0.92481     
      {'g'}            {'g'}              0.97111     
      {'g'}            {'g'}              0.96986     
      {'g'}            {'g'}              0.97803     
      {'g'}            {'g'}              0.94361     

PostProbs는 10×2 행렬입니다. 여기서 첫 번째 열은 음성 클래스 사후 확률이고 두 번째 열은 새 관측값에 대응되는 양성 클래스 사후 확률입니다.

입력 인수

모두 축소

SVM 분류 모델로, ClassificationSVM 모델 객체 또는 CompactClassificationSVM 모델 객체로 지정됩니다. 이들은 각각 fitcsvmcompact에 의해 반환됩니다.

분류할 예측 변수 데이터로, 숫자형 행렬 또는 테이블로 지정됩니다.

X의 각 행은 하나의 관측값에 대응되고, 각 열은 하나의 변수에 대응됩니다.

  • 숫자형 행렬인 경우:

    • X의 열에 있는 변수는 SVMModel을 훈련시킨 예측 변수와 순서가 동일해야 합니다.

    • 테이블(예: Tbl)을 사용하여 SVMModel을 훈련시켰고 Tbl이 모든 숫자형 예측 변수를 포함하는 경우 X는 숫자형 행렬일 수 있습니다. 훈련 중에 Tbl의 숫자형 예측 변수를 범주형 변수로 처리하려면 fitcsvmCategoricalPredictors 이름-값 쌍 인수를 사용하여 범주형 예측 변수를 식별하십시오. Tbl이 이종 예측 변수(예: 숫자형과 범주형)를 포함하고 X가 숫자형 행렬인 경우 predict는 오류를 발생시킵니다.

  • 테이블인 경우:

    • predict는 다중 열 변수 또는 문자형 벡터로 구성된 셀형 배열 이외의 셀형 배열은 지원하지 않습니다.

    • 테이블(예: Tbl)을 사용하여 SVMModel을 훈련시킨 경우 X의 모든 예측 변수는 SVMModel을 훈련시킨 변수(SVMModel.PredictorNames에 저장된 변수)와 동일한 변수 이름과 데이터형을 가져야 합니다. 그러나 X의 열 순서는 Tbl의 열 순서와 일치하지 않아도 됩니다. 또한, TblX는 추가 변수(응답 변수, 관측값 가중치 등)를 포함할 수 있지만 predict는 이를 무시합니다.

    • 숫자형 행렬을 사용하여 SVMModel을 훈련시킨 경우 SVMModel.PredictorNames의 예측 변수 이름과 X의 대응되는 예측 변수 이름은 동일해야 합니다. 훈련 중에 예측 변수 이름을 지정하려면 fitcsvmPredictorNames 이름-값 쌍 인수를 참조하십시오. X의 모든 예측 변수는 숫자형 벡터여야 합니다. X는 추가 변수(응답 변수, 관측값 가중치 등)를 포함할 수 있지만 predict는 이를 무시합니다.

fitcsvm에서 'Standardize',true를 설정하여 SVMModel을 훈련시킨 경우 SVMModel.Mu의 대응되는 평균과 SVMModel.Sigma의 표준편차를 사용하여 X의 열이 표준화됩니다.

데이터형: table | double | single

출력 인수

모두 축소

예측 클래스 레이블로, categorical형 배열 또는 문자형 배열, 논리형 벡터 또는 숫자형 벡터, 문자형 벡터로 구성된 셀형 배열로 지정됩니다.

labelSVMModel 훈련에 사용된 관측된 클래스 레이블(Y)과 동일한 데이터형을 가지며 X의 행 개수와 동일한 길이를 가집니다. (소프트웨어는 string형 배열을 문자형 벡터로 구성된 셀형 배열로 처리합니다.)

predict 함수는 관측값을 가장 높은 점수를 산출하는 클래스로 분류합니다. 점수가 NaN인 관측값의 경우 이 함수는 관측값을 훈련 레이블의 가장 큰 비율을 차지하는 다수 클래스로 분류합니다.

단일 클래스 학습의 경우, label의 각 값은 동일하며 훈련 데이터의 하나의 클래스입니다. 이상을 식별하려면 score를 사용하십시오.

예측 클래스 점수 또는 사후 확률로, 숫자형 열 벡터 또는 숫자형 행렬로 반환됩니다.

  • 단일 클래스 학습의 경우, score는 관측값(X)과 행 개수가 동일한 열 벡터입니다. score의 요소는 대응되는 관측값에 대한 이상 점수입니다. 음의 점수 값은 대응되는 관측값이 이상값임을 나타냅니다. 단일 클래스 학습에 대해서는 사후 확률을 구할 수 없습니다.

  • 2-클래스 학습의 경우, scoreX와 행 개수가 동일한 2열 행렬입니다.

    • 점수를 사후 확률로 변환하는 최적의 함수를 fitPosterior 또는 fitSVMPosterior를 사용하여 피팅한 경우 score는 클래스 사후 확률을 포함합니다. 즉, SVMModel.ScoreTransform의 값이 none이 아니면 score의 첫 번째 열과 두 번째 열은 대응되는 관측값에 대해 각각 음성 클래스(SVMModel.ClassNames{1}) 및 양성 클래스(SVMModel.ClassNames{2}) 사후 확률을 포함합니다.

    • 그렇지 않은 경우, 대응되는 관측값에 대해 첫 번째 열은 음성 클래스 점수를 포함하고 두 번째 열은 양성 클래스 점수를 포함합니다.

SVMModel.KernelParameters.Function'linear'이면 관측값 x에 대한 분류 점수는 다음과 같습니다.

f(x)=(x/s)β+b.

SVMModel은 β, b, s를 각각 속성 Beta, Bias, KernelParameters.Scale에 저장합니다.

분류 점수를 수동으로 추정하려면 먼저 훈련 중에 적용된 예측 변수 데이터에 변환을 적용해야 합니다. 구체적으로 말해, fitcsvm을 사용할 때 'Standardize',true를 지정할 경우 평균 SVMModel.Mu 및 표준편차 SVMModel.Sigma를 사용하여 예측 변수 데이터를 수동으로 표준화한 후 그 결과를 SVMModel.KernelParameters.Scale에 지정된 커널 스케일로 나눠야 합니다.

모든 SVM 함수(예: resubPredictpredict)는 필요한 모든 변환을 적용한 후 추정을 수행합니다.

SVMModel.KernelParameters.Function'linear'가 아니면 Beta는 비어 있습니다([]).

세부 정보

모두 축소

분류 점수

관측값 x를 분류하기 위한 SVM 분류 점수는 x에서 결정 경계까지의 부호 있는 거리(범위 -∞~+∞)입니다. 클래스에 대한 양의 점수는 x가 해당 클래스에 속하도록 예측됨을 나타냅니다. 음의 점수는 그 밖의 경우를 나타냅니다.

양성 클래스 분류 점수 f(x)는 훈련된 SVM 분류 함수입니다. f(x)는 x에 대해 예측된 숫자형 응답, 즉 x를 양성 클래스로 예측하기 위한 점수입니다.

f(x)=j=1nαjyjG(xj,x)+b,

여기서 (α1,...,αn,b)는 추정된 SVM 모수이고, G(xj,x)는 x와 서포트 벡터 사이의 예측 변수 공간에서의 내적이고, 합계는 훈련 세트 관측값을 포함합니다. x에 대한 음성 클래스 분류 점수, 즉 x를 음성 클래스로 예측하기 위한 점수는 –f(x)입니다.

G(xj,x) = xj′x(선형 커널)이면 점수 함수는 다음으로 축약됩니다.

f(x)=(x/s)β+b.

s는 커널 스케일이고 β는 피팅된 선형 계수로 구성된 벡터입니다.

자세한 내용은 서포트 벡터 머신 이해하기 항목을 참조하십시오.

사후 확률

사후 확률(posterior probability)은 주어진 데이터에서 관측값이 특정 클래스에 속할 확률입니다.

SVM의 경우, 사후 확률은 관측값 j가 클래스 k = {-1,1}에 속할 점수 P(s)의 함수입니다.

  • 분리 가능한 클래스의 경우, 사후 확률은 다음과 같은 계단 함수입니다.

    P(sj)={0;s<maxyk=1skπ;maxyk=1sksjminyk=+1sk1;sj>minyk=+1sk,

    여기서

    • sj는 관측값 j의 점수입니다.

    • +1과 –1은 각각 양성 클래스와 음성 클래스를 나타냅니다.

    • π는 관측값이 양성 클래스에 속할 사전 확률입니다.

  • 분리 불가능한 클래스의 경우, 사후 확률은 다음과 같은 시그모이드 함수입니다.

    P(sj)=11+exp(Asj+B),

    여기서 모수 A와 B는 각각 기울기 모수와 절편 모수입니다.

사전 확률

클래스의 사전 확률(prior probability)은 해당 클래스의 관측값이 모집단에서 발생할 것으로 가정되는 상대 도수입니다.

  • 분류를 위해 선형 SVM 모델을 사용하고 있고 모델에 다수의 지원 벡터가 있다면 predict를 예측 방법으로 사용하는 경우 속도가 느릴 수 있습니다. 선형 SVM 모델을 기반으로 관측값을 효율적으로 분류하려면 discardSupportVectors를 사용하여 모델 객체에서 서포트 벡터를 제거하십시오.

알고리즘

  • 기본적으로, 모델 커널 함수와 관계없이, MATLAB®은 점수 함수의 쌍대 표현을 사용하여 훈련된 SVM 모델을 기반으로 관측값을 분류합니다. 구체적으로는 다음과 같습니다.

    f^(x)=j=1nα^jyjG(x,xj)+b^.

    이 예측 방법을 사용하려면 훈련된 서포트 벡터와 α 계수가 필요합니다(SVM 모델의 SupportVectors 속성과 Alpha 속성 참조).

  • 기본적으로는 다음과 같은 플랫(Platt) 방법[1]을 사용하여 최적의 사후 확률을 계산합니다.

    1. 10겹 교차 검증을 수행합니다.

    2. 교차 검증에서 반환된 점수에 시그모이드 함수 모수를 피팅합니다.

    3. 교차 검증 점수를 피팅된 시그모이드 함수에 입력하여 사후 확률을 추정합니다.

  • 훈련 중에 SVM 목적 함수에 사후 확률을 통합합니다.

  • SVM의 경우, predictresubPredict가 가장 높은 점수(가장 큰 사후 확률)를 산출하는 클래스로 관측값을 분류합니다. 분류기를 훈련시키기 전에 평균 비용 조정을 적용하여 오분류 비용을 보완합니다. 즉, 클래스 사전 벡터 P, 오분류 비용 행렬 C, 관측값 가중 벡터 w가 주어지면 관측값 가중치로 구성된 새 벡터(W)를 다음처럼 정의합니다.

    Wj=wjPjk=1KCjk.

대체 기능

Simulink 블록

SVM 분류 모델의 예측을 Simulink®에 통합하려면 Statistics and Machine Learning Toolbox™ 라이브러리의 ClassificationSVM Predict 블록을 사용하거나 MATLAB Function 블록에 predict 함수를 사용할 수 있습니다. 예제는 Predict Class Labels Using ClassificationSVM Predict BlockPredict Class Labels Using MATLAB Function Block 항목을 참조하십시오.

어떤 접근법을 사용할지 결정할 때는 다음을 고려하십시오.

  • Statistics and Machine Learning Toolbox 라이브러리 블록을 사용하는 경우, 고정소수점 툴 (Fixed-Point Designer)을 사용하여 부동소수점 모델을 고정소수점 모델로 변환할 수 있습니다.

  • MATLAB Function 블록에 predict 함수를 사용하려면 이 블록에 대해 가변 크기 배열 지원이 활성화되어 있어야 합니다.

  • MATLAB Function 블록을 사용하는 경우, 이 MATLAB Function 블록에서 예측 전이나 후에 전처리 또는 후처리를 위해 MATLAB 함수를 사용할 수 있습니다.

참고 문헌

[1] Platt, J. “Probabilistic outputs for support vector machines and comparisons to regularized likelihood methods.” Advances in Large Margin Classifiers. MIT Press, 1999, pages 61–74.

확장 기능

버전 내역

R2014a에 개발됨