Main Content

ClassificationPartitionedECOC

サポート ベクター マシン (SVM) またはその他の分類器向けの交差検証済みマルチクラス ECOC モデル

説明

ClassificationPartitionedECOC は交差検証分割で学習を行った ECOC (誤り訂正出力符号) モデルのセットです。"kfold" 関数 kfoldPredictkfoldLosskfoldMarginkfoldEdgekfoldfun を 1 つ以上使用して、交差検証分類の品質を評価します。

すべての "kfold" メソッドでは、学習分割 (分割内) 観測値で学習をさせたモデルを使用して、検証分割 (分割外) 観測値に対する応答を予測します。たとえば、データを 5 つに分割して交差検証を行うとします。この場合、ほぼ等しいサイズの 5 つのグループに各観測値が無作為に割り当てられます。"学習分割" にはグループのうち 4 つ (データの約 4/5) が含まれ、"検証分割" には他のグループ (データの約 1/5) が含まれます。この場合、交差検証は次のように処理されます。

  1. (CVMdl.Trained{1} に格納されている) 1 番目のモデルの学習には最後の 4 つのグループの観測値が使用され、1 番目のグループの観測値は検証用に確保されます。

  2. (CVMdl.Trained{2} に格納されている) 2 番目のモデルの学習には、1 番目のグループと最後の 3 つのグループの観測値が使用されます。2 番目のグループの観測値は、検証用に予約されます。

  3. 3 番目、4 番目および 5 番目のモデルに対しても同様に続けられます。

kfoldPredict を使用して検証する場合、i 番目のモデルを使用してグループ i の観測値について予測が計算されます。つまり、それぞれの観測値に対する応答は、その観測値を使用せずに学習させたモデルによって推定されます。

作成

ClassificationPartitionedECOC モデルは 2 つの方法で作成できます。

  • オブジェクト関数 crossval を使用して、交差検証済み ECOC モデルを ECOC モデルから作成する。

  • 関数 fitcecoc を使用し、名前と値のペアの引数 'CrossVal''CVPartition''Holdout''KFold''Leaveout' のいずれかを指定して、交差検証済み ECOC モデルを作成する。

プロパティ

すべて展開する

交差検証のプロパティ

交差検証済みモデルの名前。文字ベクトルを指定します。

たとえば、'ECOC' は交差検証された ECOC モデルを指定します。

データ型: char

交差検証された分割の数。正の整数で指定します。

データ型: double

交差検証パラメーター値。オブジェクトを指定します。パラメーター値は、ECOC 分類器の交差検証に使用した名前と値のペアの引数の値に対応します。推定されたパラメーターは ModelParameters に含まれません。

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

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

データ型: double

データを交差検証分割に分割する方法を含むデータ分割。cvpartition モデルとして指定します。

交差検証分割で学習させたコンパクトな分類器。CompactClassificationECOC モデルの cell 配列を指定します。Trained には k 個のセルがあります。k は分割数です。

データ型: cell

モデルの交差検証に使用した観測値の重み。数値ベクトルを指定します。W には NumObservations 個の要素があります。

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

データ型: single | double

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

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

データ型: single | double | table

モデルの交差検証に使用される、観測されたクラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。Y には NumObservations 個の要素があり、データ型はモデルの交差検証を実行するために fitcecoc に渡した入力引数 Y と同じです。(string 配列は文字ベクトルの cell 配列として扱われます)。

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

データ型: categorical | char | logical | single | double | cell

ECOC のプロパティ

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

BinaryLoss の既定値は、バイナリ学習器が返すスコアの範囲によって異なります。次の表に、既定のスコア変換を使用する場合 (モデルの ScoreTransform プロパティが 'none' の場合) の BinaryLoss の既定値をいくつか示します。

仮定既定値

すべてのバイナリ学習器が次のいずれかである。

  • 分類決定木

  • 判別分析モデル

  • k 最近傍モデル

  • 単純ベイズ モデル

'quadratic'
すべてのバイナリ学習器が SVM である。'hinge'
すべてのバイナリ学習器が、AdaboostM1 または GentleBoost によって学習をさせたアンサンブルである。'exponential'
すべてのバイナリ学習器が、LogitBoost によって学習をさせたアンサンブルである。'binodeviance'
fitcecoc'FitPosterior',true を設定して、クラスの事後確率を予測するように指定している。'quadratic'
バイナリ学習器が異種混合で、さまざまな損失関数を使用している。'hamming'

既定値を確認するには、コマンド ラインでドット表記を使用して学習済みモデルの BinaryLoss プロパティを表示します。

精度が向上する可能性を高めるには、kfoldPredict または kfoldLoss の名前と値の引数 BinaryLoss を使用して、予測または損失を計算するときに既定以外のバイナリ損失関数を指定します。詳細については、バイナリ損失を参照してください。

データ型: char

バイナリ学習器クラス ラベル。数値行列または [] として指定します。

  • すべての分割で符号化行列が同じである場合、BinaryYNumObservations 行 L 列の行列になります。L はバイナリ学習器の個数 (size(CodingMatrix,2)) です。

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

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

  • 符号化行列が分割全体で異なる場合、BinaryY は空 ([]) です。

データ型: double

バイナリ学習器のクラス割り当てを指定するコード。数値行列または [] として指定します。

  • すべての分割で符号化行列が同じである場合、CodingMatrix は K 行 L 列の行列になります。K はクラスの個数、L はバイナリ学習器の個数です。

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

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

  • 符号化行列が分割全体で異なる場合、CodingMatrix は空 ([]) です。Trained プロパティを使用することにより、各分割の符号化行列を取得できます。たとえば、CVMdl.Trained{1}.CodingMatrix は、交差検証された ECOC モデル CVMdl の最初の分割の符号化行列です。

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

他の分類のプロパティ

カテゴリカル予測子のインデックス。正の整数のベクトルとして指定します。CategoricalPredictors には、対応する予測子がカテゴリカルであることを示すインデックス値が格納されます。インデックス値の範囲は 1 ~ p です。p はモデルの学習に使用した予測子の数です。どの予測子もカテゴリカルではない場合、このプロパティは空 ([]) になります。

データ型: single | double

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

データ型: categorical | char | logical | single | double | cell

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

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

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

データ型: double

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

データ型: cell

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

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

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

データ型: double

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

データ型: char

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

スコア変換関数を 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

オブジェクト関数

gatherGPU からの Statistics and Machine Learning Toolbox オブジェクトのプロパティの収集
kfoldEdge交差検証済み ECOC モデルの分類エッジ
kfoldLoss交差検証済み ECOC モデルの分類損失
kfoldMargin交差検証済み ECOC モデルの分類マージン
kfoldPredict交差検証済み ECOC モデルの観測値の分類
kfoldfun交差検証済み ECOC モデルを使用する交差検証関数

すべて折りたたむ

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 分類器がかなり良好に一般化を行うことがわかります。

代理分岐をもつ決定木の GentleBoost アンサンブルを使用して、1 対他の ECOC 分類器に学習をさせます。学習を高速化するため、数値予測子をビン化し、並列計算を使用します。ビン化は、fitcecoc が木学習器を使用する場合のみ有効です。学習後、10 分割交差検証を使用して分類誤差を推定します。並列計算には Parallel Computing Toolbox™ が必要であることに注意してください。

標本データの読み込み

arrhythmia データセットを読み込み検証します。

load arrhythmia
[n,p] = size(X)
n = 452
p = 279
isLabels = unique(Y);
nLabels = numel(isLabels)
nLabels = 13
tabulate(categorical(Y))
  Value    Count   Percent
      1      245     54.20%
      2       44      9.73%
      3       15      3.32%
      4       15      3.32%
      5       13      2.88%
      6       25      5.53%
      7        3      0.66%
      8        2      0.44%
      9        9      1.99%
     10       50     11.06%
     14        4      0.88%
     15        5      1.11%
     16       22      4.87%

このデータセットには 279 個の予測子が含まれ、452 という標本サイズは相対的に小さいものです。16 個の異なるラベルのうち、13 個のみが応答 (Y) で表現されています。各ラベルは不整脈のさまざまな段階を表しており、観測値の 54.20% がクラス 1 に含まれています。

1 対他 ECOC 分類器の学習

アンサンブル テンプレートを作成します。少なくとも 3 つの引数を指定しなければなりません。手法、学習器の数、および学習器のタイプです。この例では、手法として 'GentleBoost'、学習器の個数として 100 を指定します。欠損観測値があるので、代理分岐を使用する決定木テンプレートを指定します。

tTree = templateTree('surrogate','on');
tEnsemble = templateEnsemble('GentleBoost',100,tTree);

tEnsemble はテンプレート オブジェクトです。ほとんどのプロパティは空ですが、学習中に既定値が入力されます。

決定木のアンサンブルをバイナリ学習器として使用して、1 対他の ECOC 分類器を学習させます。学習を高速化するため、ビン化と並列計算を使用します。

  • ビン化 ('NumBins',50) — 学習データセットが大きい場合、名前と値のペアの引数 'NumBins' を使用することにより学習を高速化できます (精度が低下する可能性があります)。この引数は、fitcecoc が木学習器を使用する場合のみ有効です。'NumBins' の値を指定した場合、指定した個数の同確率のビンにすべての数値予測子がビン化され、元のデータではなくビンのインデックスに対して木が成長します。はじめに 'NumBins',50 を試してから、精度と学習速度に応じて 'NumBins' の値を変更できます。

  • 並列計算 ('Options',statset('UseParallel',true)) — Parallel Computing Toolbox のライセンスがある場合、プール内のワーカーに各バイナリ学習器を送る並列計算を使用して、計算を高速化できます。ワーカーの個数はシステム構成によって異なります。デュアルコア以上のシステムの場合、バイナリ学習器について決定木を使用すると、fitcecoc は Intel® スレッディング ビルディング ブロック (TBB) を使用して学習を並列化します。したがって、単一のコンピューターで 'UseParallel' オプションを指定しても役に立ちません。このオプションは、クラスターに対して使用します。

さらに、事前確率として 1/K を指定します。K = 13 は異なるクラスの個数です。

options = statset('UseParallel',true);
Mdl = fitcecoc(X,Y,'Coding','onevsall','Learners',tEnsemble,...
                'Prior','uniform','NumBins',50,'Options',options);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

MdlClassificationECOC モデルです。

交差検証

10 分割交差検証を使用して ECOC 分類器の交差検証を実行します。

CVMdl = crossval(Mdl,'Options',options);
Warning: One or more folds do not contain points from all the groups.

CVMdlClassificationPartitionedECOC モデルです。少なくとも 1 つの分割の学習中に、いくつかのクラスが表示されないことが警告でわかります。したがって、これらの分割は欠損クラスに対するラベルを予測できません。cell のインデックス指定とドット表記を使用して、分割の結果を調査できます。たとえば、1 番目の分割の結果にアクセスするには CVMdl.Trained{1} と入力します。

交差検証済みの ECOC 分類器を使用して、検証分割のラベルを予測します。混同行列は、confusionchart を使用して計算できます。内側の位置のプロパティを変更してチャートを移動およびサイズ変更することにより、行要約の内部にパーセントが表示されるようにします。

oofLabel = kfoldPredict(CVMdl,'Options',options);
ConfMat = confusionchart(Y,oofLabel,'RowSummary','total-normalized');
ConfMat.InnerPosition = [0.10 0.12 0.85 0.85];

ビン化されたデータの再現

学習済みモデルの BinEdges プロパティと関数discretizeを使用して、ビン化された予測子データを再現します。

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 になります。

拡張機能

バージョン履歴

R2014b で導入