ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ClassificationECOC

サポート ベクター マシン (SVM) などの分類器用のマルチクラス モデル

説明

ClassificationECOC は、分類器が複数のバイナリ学習器 (サポート ベクター マシン (SVM) など) から構成されている場合の、マルチクラス学習用の誤り訂正出力符号 (ECOC) 分類器です。学習済みの ClassificationECOC 分類器には、学習データ、パラメーター値、事前確率および符号化行列が格納されます。これらの分類器を使用して、新しいデータのラベルまたは事後確率の予測 (predict を参照) などのタスクを実行できます。

作成

ClassificationECOC オブジェクトの作成には fitcecoc を使用します。

交差検証オプションを指定せずに線形またはカーネル バイナリ学習器を指定した場合、fitcecoc は代わりに CompactClassificationECOC オブジェクトを返します。

プロパティ

すべて展開する

ClassificationECOC モデル オブジェクトを作成した後で、ドット表記を使用してプロパティにアクセスできます。たとえば、SVM 学習器を使用したマルチクラス モデルの学習を参照してください。

ECOC のプロパティ

学習済みのバイナリ学習器。モデル オブジェクトの cell ベクトルを指定します。バイナリ学習器の個数は、Y 内のクラス数と符号化設計によって異なります。

BinaryLearner{j} の学習は、CodingMatrix(:,j) によって指定されるバイナリ問題に従って行われます。たとえば、SVM 学習器を使用したマルチクラス学習では、BinaryLearners の各要素は CompactClassificationSVM 分類器です。

データ型: cell

バイナリ学習器の損失関数。損失関数名を表す文字ベクトルを指定します。

異なる損失関数を使用するバイナリ学習器によって学習させる場合、BinaryLoss'hamming' に設定されます。精度が向上する可能性を高めるには、predict または loss の名前と値のペアの引数 'BinaryLoss' を使用して予測または損失を計算するときに、既定以外のバイナリ損失関数を指定します。

データ型: char

バイナリ学習器クラス ラベル。数値行列として指定します。BinaryYNumObservations 行 L 列の行列で、L はバイナリ学習器 (length(Mdl.BinaryLearners)) 数です。

BinaryY の要素は –10 または 1 で、値は二分法によるクラス割り当てに対応します。次の表に、学習器 j が観測値 kBinaryY(k,j) の値に対応する二分クラスに割り当てる方法を示します。

二分法によるクラス割り当て
–1学習器 j は、観測値 k を陰性クラスに割り当てます。
0学習の前に、学習器 j は観測値 k をデータセットから削除します。
1学習器 j は、観測値 k を陽性クラスに割り当てます。

データ型: double

数値予測子のビンのエッジ。p 個の数値ベクトルが含まれている cell 配列を指定します。p は予測子の個数です。各ベクトルには、数値予測子のビンのエッジを含めます。カテゴリカル予測子はビン化されないので、カテゴリカル予測子の場合は、この cell 配列の要素を空にします。

数値予測子がビン化されるのは、木学習器を使用してモデルに学習をさせるときに名前と値のペアの引数 'NumBins' として正の整数スカラーを指定した場合だけです。'NumBins' の値が空 (既定) である場合、BinEdges プロパティは空になります。

学習済みモデル BinEdgesmdl プロパティを使用することにより、ビン化された予測子データ Xbinned を再現できます。

X = mdl.X; % Predictor data
Xbinned = zeros(size(X));
edges = mdl.BinEdges;
% Find indices of binned predictors.
idxNumeric = find(~cellfun(@isempty,edges));
if iscolumn(idxNumeric)
    idxNumeric = idxNumeric';
end
for j = idxNumeric 
    x = X(:,j);
    % Convert x to array if x is a table.
    if istable(x) 
        x = table2array(x);
    end
    % Group x into bins by using the discretize function.
    xbinned = discretize(x,[-inf; edges{j}; inf]); 
    Xbinned(:,j) = xbinned;
end
数値予測子の場合、1 からビンの個数までの範囲にあるビンのインデックスが Xbinned に格納されます。カテゴリカル予測子の場合、Xbinned の値は 0 になります。XNaN が含まれている場合、対応する Xbinned の値は NaN になります。

データ型: cell

バイナリ学習器のクラス割り当て符号。数値行列を指定します。CodingMatrix は K 行 L 列の行列で、K はクラスの個数、L はバイナリ学習器の個数です。

CodingMatrix の要素は –10 または 1 であり、値は二分法によるクラス割り当てに対応します。次の表に、学習器 j がクラス i の観測値を CodingMatrix(i,j) の値に対応する二分クラスに割り当てる方法を示します。

二分法によるクラス割り当て
–1学習器 j は、クラス i の観測値を陰性クラスに割り当てます。
0学習の前に、学習器 j はクラス i の観測値をデータセットから削除します。
1学習器 j は、クラス i の観測値を陽性クラスに割り当てます。

データ型: double | single | int8 | int16 | int32 | int64

符号化設計名。文字ベクトルを指定します。詳細は、符号化設計を参照してください。

データ型: char

バイナリ学習器の重み。数値行ベクトルを指定します。LeanerWeights の長さは、バイナリ学習器の個数 (length(Mdl.BinaryLearners)) と同じです。

LearnerWeights(j) は、分類器に学習をさせるためにバイナリ学習器 j が使用する観測値の重みの合計です。

LearnerWeights を使用し、カルバック・ライブラー ダイバージェンスの最小化により事後確率をあてはめます。事後確率の推定に二次計画法を使用する場合、LearnerWeights は無視されます。

データ型: double | single

他の分類のプロパティ

カテゴリカル予測子のインデックス。正の整数のベクトルを指定します。CategoricalPredictors には、カテゴリカル予測子が含まれている予測子データの列に対応するインデックス値を格納します。どの予測子もカテゴリカルではない場合、このプロパティは空 ([]) になります。

データ型: single | double

学習で使用する一意なクラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。ClassNames のデータ型はクラス ラベル Y と同じです。(string 配列は文字ベクトルの cell 配列として扱われます)。ClassNames はクラスの順序も決定します。

データ型: カテゴリカル | char | logical | single | double | cell

このプロパティは読み取り専用です。

誤分類のコスト。正方数値行列として指定します。Cost には K 個の行および列が含まれ、K はクラスの数です。

Cost(i,j) は、真のクラスが i である点をクラス j に分類するコストです。Cost の行と列の順序は、ClassNames のクラスの順序に対応します。

fitcecoc は、異なるタイプのバイナリ学習器に異なる誤分類のコストを組み込みます。

データ型: double

展開された予測子名。文字ベクトルの cell 配列を指定します。

モデルがカテゴリカル変数用のエンコーディングを使用している場合、ExpandedPredictorNames には展開された変数を表す名前が格納されます。それ以外の場合、ExpandedPredictorNamesPredictorNames と同じです。

データ型: cell

ECOC 分類器の学習に使用するパラメーター値 (名前と値のペアの引数の値など)。オブジェクトを指定します。推定パラメーターは ModelParameters に格納されません。

ModelParameters のプロパティにはドット表記でアクセスします。たとえば、バイナリ学習器のパラメーターが含まれているテンプレートをリストするには、Mdl.ModelParameters.BinaryLearner を使用します。

学習データに含まれている観測値の数。正の数値スカラーを指定します。

データ型: double

予測子データ X に現れる順序で並んでいる予測子名。文字ベクトルの cell 配列を指定します。PredictorNames の長さは、X の列数と同じです。

データ型: cell

このプロパティは読み取り専用です。

クラスの事前確率。数値ベクトルを指定します。Prior の要素数は ClassNames のクラス数と同じであり、要素の順序は ClassNames 内のクラスの順序に対応します。

fitcecoc は、異なるタイプのバイナリ学習器に異なる誤分類のコストを組み込みます。

データ型: double

応答変数名。文字ベクトルを指定します。

データ型: char

ClassificationECOC モデルのあてはめに使用した元のデータ X の行。logical ベクトルを指定します。すべての行を使用した場合、このプロパティは空になります。

データ型: logical

予測されたスコアに適用するスコア変換関数。関数名または関数ハンドルを指定します。

スコア変換関数を function などに変更するには、ドット表記を使用します。

  • 組み込み関数の場合、function を表の値に置き換えて次のコードを入力します。

    Mdl.ScoreTransform = 'function';

    説明
    'doublelogit'1/(1 + e–2x)
    'invlogit'log(x / (1 – x))
    'ismax'最大のスコアをもつクラスのスコアを 1 に設定し、他のすべてのクラスのスコアを 0 に設定します。
    'logit'1/(1 + e–x)
    'none' または 'identity'x (変換なし)
    'sign'x < 0 のとき –1
    x = 0 のとき 0
    x > 0 のとき 1
    'symmetric'2x – 1
    'symmetricismax'最大のスコアをもつクラスのスコアを 1 に設定し、他のすべてのクラスのスコアを –1 に設定します。
    'symmetriclogit'2/(1 + e–x) – 1

  • MATLAB® 関数やユーザー定義関数の場合は、関数ハンドルを入力します。

    Mdl.ScoreTransform = @function;

    function は、行列 (元のスコア) を受け入れて同じサイズの行列 (変換したスコア) を返さなければなりません。

データ型: char | function_handle

ECOC 分類器の学習に使用する観測値の重み。数値ベクトルを指定します。W の要素数は NumObservations です。

学習に使用する重みは正規化され nansum(W)1 になります。

データ型: single | double

ECOC 分類器の学習に使用する、標準化されていない予測子データ。数値行列または table を指定します。

X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。

データ型: single | double | テーブル

ECOC 分類器の学習に使用する、観測されたクラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。Y の要素数は NumObservations で、データ型は fitcecoc の入力引数 Y と同じです。(string 配列は文字ベクトルの cell 配列として扱われます)。

Y の各行は、X の対応する行の観測された分類を表します。

データ型: カテゴリカル | char | logical | single | double | cell

ハイパーパラメーター最適化のプロパティ

ハイパーパラメーターの交差検証最適化の説明。BayesianOptimization オブジェクト、またはハイパーパラメーターおよび関連する値が含まれているテーブルを指定します。モデルを作成するときに名前と値のペアの引数 'OptimizeHyperparameters' が空以外であった場合、このプロパティは空以外になります。HyperparameterOptimizationResults の値は、次の表で説明されているように、モデル作成時の構造体 OptimizerHyperparameterOptimizationOptions フィールドの設定によって変化します。

Optimizer フィールドの値HyperparameterOptimizationResults の値
'bayesopt' (既定の設定)BayesianOptimization クラスのオブジェクト
'gridsearch' または 'randomsearch'使用したハイパーパラメーター、観測された目的関数の値 (交差検証損失)、および最低 (最良) から最高 (最悪) までの観測値の順位が格納されているテーブル

オブジェクト関数

compareHoldout新しいデータを使用して 2 つの分類モデルの精度を比較
compactマルチクラス誤り訂正出力符号 (ECOC) モデルのサイズを縮小
crossvalマルチクラス誤り訂正出力符号 (ECOC) モデルの交差検証
discardSupportVectorsECOC モデルの線形 SVM バイナリ学習器のサポート ベクターを破棄
edgeマルチクラス誤り訂正出力符号 (ECOC) モデルの分類エッジ
lossマルチクラス誤り訂正出力符号 (ECOC) モデルの分類損失
marginマルチクラス誤り訂正出力符号 (ECOC) モデルの分類マージン
predictマルチクラス誤り訂正出力符号 (ECOC) モデルを使用して観測値を分類
resubEdgeマルチクラス誤り訂正出力符号 (ECOC) モデルの再代入分類エッジ
resubLossマルチクラス誤り訂正出力符号 (ECOC) モデルの再代入分類損失
resubMarginマルチクラス誤り訂正出力符号 (ECOC) モデルの再代入分類マージン
resubPredictマルチクラス誤り訂正出力符号 (ECOC) モデル内の観測値を分類

すべて折りたたむ

サポート ベクター マシン (SVM) バイナリ学習器を使用して、マルチクラス誤り訂正出力符号 (ECOC) モデルに学習をさせます。

フィッシャーのアヤメのデータセットを読み込みます。予測子データ X と応答データ Y を指定します。

load fisheriris
X = meas;
Y = species;

既定のオプションを使用して、マルチクラス ECOC モデルに学習をさせます。

Mdl = fitcecoc(X,Y)
Mdl = 
  ClassificationECOC
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: {'setosa'  'versicolor'  'virginica'}
           ScoreTransform: 'none'
           BinaryLearners: {3x1 cell}
               CodingName: 'onevsone'


  Properties, Methods

MdlClassificationECOC モデルです。既定では、fitcecoc は SVM バイナリ学習器および 1 対 1 符号化設計を使用します。ドット表記を使用して Mdl プロパティにアクセスできます。

クラス名および符号化設計行列を表示します。

Mdl.ClassNames
ans = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

CodingMat = Mdl.CodingMatrix
CodingMat = 3×3

     1     1     0
    -1     0     1
     0    -1    -1

3 つのクラスに対して 1 対 1 符号化設計を使用すると、3 つのバイナリ学習器が生成されます。CodingMat の列は学習器に、行はクラスに対応します。クラスの順序は Mdl.ClassNames 内の順序と同じです。たとえば、CodingMat(:,1)[1; –1; 0] であり、'setosa' または 'versicolor' として分類されるすべての観測値を使用して最初の SVM バイナリ学習器が学習を行うことを示します。'setosa'1 に対応するので陽性クラスであり、'versicolor'–1 に対応するので陰性クラスです。

各バイナリ学習器にセルのインデックス付けおよびドット表記を使用してアクセスすることができます。

Mdl.BinaryLearners{1}   % The first binary learner
ans = 
  classreg.learning.classif.CompactClassificationSVM
             ResponseName: 'Y'
    CategoricalPredictors: []
               ClassNames: [-1 1]
           ScoreTransform: 'none'
                     Beta: [4x1 double]
                     Bias: 1.4505
         KernelParameters: [1x1 struct]


  Properties, Methods

再代入分類誤差を計算します。

error = resubLoss(Mdl)
error = 0.0067

学習データに対する分類誤差は小さくなっていますが、分類器が過適合モデルになる可能性があります。代わりに、crossval を使用して分類器を交差検証し、交差検証分類誤差を計算することができます。

SVM バイナリ学習器を使用して ECOC 分類器に学習をさせます。次に、ドット表記を使用して、バイナリ学習器のプロパティ (推定パラメーターなど) にアクセスします。

フィッシャーのアヤメのデータセットを読み込みます。予測子として花弁の寸法を、応答として種の名前を指定します。

load fisheriris
X = meas(:,3:4);
Y = species;

SVM バイナリ学習器および既定の符号化設計 (1 対 1) を使用して ECOC 分類器に学習をさせます。予測子を標準化し、サポート ベクターを保存します。

t = templateSVM('Standardize',true,'SaveSupportVectors',true);
predictorNames = {'petalLength','petalWidth'};
responseName = 'irisSpecies';
classNames = {'setosa','versicolor','virginica'}; % Specify class order
Mdl = fitcecoc(X,Y,'Learners',t,'ResponseName',responseName,...
    'PredictorNames',predictorNames,'ClassNames',classNames)
Mdl = 
  ClassificationECOC
           PredictorNames: {'petalLength'  'petalWidth'}
             ResponseName: 'irisSpecies'
    CategoricalPredictors: []
               ClassNames: {'setosa'  'versicolor'  'virginica'}
           ScoreTransform: 'none'
           BinaryLearners: {3x1 cell}
               CodingName: 'onevsone'


  Properties, Methods

tは SVM 分類のオプションを含むテンプレート オブジェクトです。関数 fitcecoc は、空 ([]) のプロパティについて既定値を使用します。MdlClassificationECOC 分類器です。ドット表記を使用して Mdl のプロパティにアクセスできます。

クラス名および符号化設計行列を表示します。

Mdl.ClassNames
ans = 3x1 cell array
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

Mdl.CodingMatrix
ans = 3×3

     1     1     0
    -1     0     1
     0    -1    -1

列は SVM バイナリ学習器に対応し、行は個々のクラスに対応します。行の順序は、MdlClassNames プロパティにおける順序と同じです。各列について:

  • 1 は、対応するクラスの観測値を正のグループのメンバーとして使用して fitcecoc が SVM に学習をさせることを示します。

  • –1 は、対応するクラスの観測値を負のグループのメンバーとして使用して fitcecoc が SVM に学習をさせることを示します。

  • 0 は、対応するクラスの観測値を SVM が使用しないことを示します。

たとえば、1 番目の SVM で fitcecoc はすべての観測値を 'setosa' または 'versicolor' に割り当てていますが、'virginica' には割り当てていません。

セルの添字とドット表記を使用して、SVM のプロパティにアクセスします。各 SVM の標準化されたサポート ベクターを保存します。サポート ベクターを非標準化します。

L = size(Mdl.CodingMatrix,2); % Number of SVMs
sv = cell(L,1); % Preallocate for support vector indices
for j = 1:L
    SVM = Mdl.BinaryLearners{j};
    sv{j} = SVM.SupportVectors;
    sv{j} = sv{j}.*SVM.Sigma + SVM.Mu;
end

sv は、SVM の非標準化されたサポート ベクターを含む行列の cell 配列です。

データをプロットし、サポート ベクターを特定します。

figure
gscatter(X(:,1),X(:,2),Y);
hold on
markers = {'ko','ro','bo'}; % Should be of length L
for j = 1:L
    svs = sv{j};
    plot(svs(:,1),svs(:,2),markers{j},...
        'MarkerSize',10 + (j - 1)*3);
end
title('Fisher''s Iris -- ECOC Support Vectors')
xlabel(predictorNames{1})
ylabel(predictorNames{2})
legend([classNames,{'Support vectors - SVM 1',...
    'Support vectors - SVM 2','Support vectors - SVM 3'}],...
    'Location','Best')
hold off

次の関数に Mdl を渡すことができます。

  • predict。新しい観測値を分類します。

  • resubLoss。学習データに対する分類誤差を推定します。

  • crossval。10 分割交差検証を実行します。

SVM バイナリ学習器による ECOC 分類器を交差検証し、一般化分類誤差を推定します。

フィッシャーのアヤメのデータセットを読み込みます。予測子データ X と応答データ Y を指定します。

load fisheriris
X = meas;
Y = species;
rng(1); % For reproducibility

SVM テンプレートを作成し、予測子を標準化します。

t = templateSVM('Standardize',true)
t = 
Fit template for classification SVM.

                     Alpha: [0x1 double]
             BoxConstraint: []
                 CacheSize: []
             CachingMethod: ''
                ClipAlphas: []
    DeltaGradientTolerance: []
                   Epsilon: []
              GapTolerance: []
              KKTTolerance: []
            IterationLimit: []
            KernelFunction: ''
               KernelScale: []
              KernelOffset: []
     KernelPolynomialOrder: []
                  NumPrint: []
                        Nu: []
           OutlierFraction: []
          RemoveDuplicates: []
           ShrinkagePeriod: []
                    Solver: ''
           StandardizeData: 1
        SaveSupportVectors: []
            VerbosityLevel: []
                   Version: 2
                    Method: 'SVM'
                      Type: 'classification'

t は SVM テンプレートです。テンプレート オブジェクトのプロパティは、ほとんとが空です。ECOC 分類器に学習をさせると、該当するプロパティが既定値に設定されます。

ECOC 分類器に学習をさせ、クラスの順序を指定します。

Mdl = fitcecoc(X,Y,'Learners',t,...
    'ClassNames',{'setosa','versicolor','virginica'});

MdlClassificationECOC 分類器です。ドット表記を使用してプロパティにアクセスできます。

10 分割交差検証を使用して Mdl を交差検証します。

CVMdl = crossval(Mdl);

CVMdlClassificationPartitionedECOC 交差検証 ECOC 分類器です。

一般化分類誤差を推定します。

genError = kfoldLoss(CVMdl)
genError = 0.0400

一般化分類誤差が 4% なので、ECOC 分類器がかなり良好に一般化を行うことがわかります。

詳細

すべて展開する

アルゴリズム

すべて展開する

代替機能

これらの代替アルゴリズムを使用してマルチクラス モデルに学習させることができます。

参照

[1] Fürnkranz, Johannes. “Round Robin Classification.” Journal of Machine Learning Research, Vol. 2, 2002, pp. 721–747.

[2] Escalera, S., O. Pujol, and P. Radeva. “Separability of ternary codes for sparse designs of error-correcting output codes.” Pattern Recognition Letters, Vol. 30, Issue 3, 2009, pp. 285–297.

拡張機能

R2014b で導入