Main Content

ClassificationPartitionedLinearECOC

名前空間: classreg.learning.partition
スーパークラス: ClassificationPartitionedModel

高次元データのマルチクラス分類用の交差検証済み線形誤り訂正出力符号モデル

説明

ClassificationPartitionedLinearECOC は、交差検証分割で学習を行った、線形分類モデルから構成される一連の誤り訂正出力符号 (ECOC) モデルです。kfold 関数 kfoldPredictkfoldLosskfoldMarginkfoldEdge を 1 つ以上使用する交差検証により、分類の品質を評価します。

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

  1. CVMdl.Trained{1} に保存されている最初のモデルは、後の 4 グループの観測値によって学習され、最初のグループの観測値を検証用に保存します。

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

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

kfoldPredict を呼び出して検証する場合、最初のモデルを使用してグループ 1 の観測に対する予測が計算され、2 番目のモデルにはグループ 2 が計算され、以降同様です。つまり、それぞれの観測値に対する応答は、その観測値ではなく学習したモデルによって推定されます。

メモ

ClassificationPartitionedLinearECOC モデル オブジェクトに予測子データ セットは格納されません。

構築

CVMdl = fitcecoc(X,Y,'Learners',t,Name,Value) は、次の場合に交差検証済みの線形 ECOC モデルを返します。

  • t'Linear' であるか、templateLinear によって返されるテンプレート オブジェクトである。

  • Name'CrossVal''CVPartition''Holdout' または 'KFold' のいずれかである。

詳細は、fitcecocを参照してください。

プロパティ

すべて展開する

交差検証のプロパティ

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

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

データ型: char

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

データ型: double

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

ModelParameters のプロパティにはドット表記でアクセスします。

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

データ型: double

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

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

データ型: cell

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

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

データ型: single | double

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

Y の各行は、予測子データの観測値の観測された分類を表します。

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

ECOC のプロパティ

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

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

既定では、すべてのバイナリ学習器が SVM を使用する線形分類モデルである場合、BinaryLoss'hinge' です。すべてのバイナリ学習器がロジスティック回帰を使用する線形分類モデルである場合、BinaryLoss'quadratic' です。精度が向上する可能性を高めるには、kfoldPredict または kfoldLoss の名前と値の引数 BinaryLoss を使用して、予測または損失を計算するときに既定以外のバイナリ損失関数を指定します。

サポートされるバイナリ損失関数のリストについては、バイナリ損失を参照してください。

データ型: char

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

  • 符号化行列が分割全体で同一である場合、BinaryYNumObservations 行 L 列の行列であり、L はバイナリ学習器の数 (size(CodingMatrix,2)) です。

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

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

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

データ型: double

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

  • 符号化行列が分割全体で同じである場合、CodingMatrix は K 行 L 列の行列です。K はクラスの数、L はバイナリ学習器の数です。

    CodingMatrix の要素は -10 または 1 で、値は二分法によるクラス割り当てに対応します。次の表に、学習器 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

予測子データに現れる順序で並んでいる予測子名。文字ベクトルの cell 配列として指定します。PredictorNames の長さは、予測子変数として使用される学習データ X または Tbl に含まれている変数の数と等しくなります。

データ型: cell

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

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

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

データ型: double

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

データ型: char

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

予測されたスコアに適用するスコア変換関数。'none' を指定します。ECOC モデルではスコア変換はサポートされません。

メソッド

kfoldEdge学習で使用しない観測値の分類エッジ
kfoldLoss学習で使用しない観測値の分類損失
kfoldMargin学習で使用しない観測値の分類マージン
kfoldPredict学習で使用しない観測値のラベルの予測

コピーのセマンティクス

値。値のクラスがコピー操作に与える影響については、オブジェクトのコピーを参照してください。

すべて折りたたむ

NLP のデータ セットを読み込みます。

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。

あるドキュメンテーション Web ページがどの MATLAB® ツールボックスによるものであるかをページの単語数に基づいて識別できるマルチクラスの線形分類モデルを交差検証します。

rng(1); % For reproducibility 
CVMdl = fitcecoc(X,Y,'Learners','linear','CrossVal','on')
CVMdl = 
  ClassificationPartitionedLinearECOC
    CrossValidatedModel: 'LinearECOC'
           ResponseName: 'Y'
        NumObservations: 31572
                  KFold: 10
              Partition: [1x1 cvpartition]
             ClassNames: [comm    dsp    ecoder    fixedpoint    hdlcoder    phased    physmod    simulink    stats    supportpkg    symbolic    vision    xpc]
         ScoreTransform: 'none'


CVMdl は、ClassificationPartitionedLinearECOC 交差検証済みモデルです。既定の設定では fitcecoc は 10 分割の交差検証を実装するので、CVMdl.Trained には 10 個の CompactClassificationECOC モデルが含まれている 10 行 1 列の cell ベクトルが格納されており、これらのモデルにはバイナリ線形分類モデルから構成される ECOC モデルの学習を各分割について行った結果が格納されています。

CVMdlkfoldPredict に渡して分割外観測値のラベルを推定し、kfoldLoss に渡して汎化誤差を推定します。

oofLabels = kfoldPredict(CVMdl);
ge = kfoldLoss(CVMdl)
ge = 0.0958

推定された汎化誤差は、誤分類観測値の約 10% です。

汎化誤差を改善するには、他のソルバー (LBFGS など) を試します。線形分類モデルから構成される ECOC モデルに学習をさせるときの既定オプションを変更するには、templateLinear を使用して線形分類モデル テンプレートを作成し、このテンプレートを fitcecoc に渡します。

ロジスティック回帰学習器を使用する線形分類モデルから構成される ECOC モデルに適した LASSO ペナルティの強度を決定するため、5 分割の交差検証を実装します。

NLP のデータ セットを読み込みます。

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。

簡単にするため、'simulink''dsp''comm' のいずれでもない Y の観測値すべてに対して 'others' というラベルを使用します。

Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';

10-710-2 の範囲で対数間隔で配置された 11 個の正則化強度を作成します。

Lambda = logspace(-7,-2,11);

ロジスティック回帰学習器を使用するように指定する線形分類モデル テンプレートを作成し、Lambda の強度をもつ LASSO ペナルティを使用し、SpaRSA を使用して学習させ、目的関数の勾配の許容誤差を 1e-8 に下げます。

t = templateLinear('Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8);

モデルを交差検証します。実行速度を向上させるため、予測子データを転置し、観測値が列単位であることを指定します。

X = X'; 
rng(10); % For reproducibility
CVMdl = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns','KFold',5);

CVMdlClassificationPartitionedLinearECOC モデルです。

CVMdl および格納されている各モデルを分析します。

numECOCModels = numel(CVMdl.Trained)
numECOCModels = 5
ECOCMdl1 = CVMdl.Trained{1}
ECOCMdl1 = 
  CompactClassificationECOC
      ResponseName: 'Y'
        ClassNames: [comm    dsp    simulink    others]
    ScoreTransform: 'none'
    BinaryLearners: {6×1 cell}
      CodingMatrix: [4×6 double]


  Properties, Methods

numCLModels = numel(ECOCMdl1.BinaryLearners)
numCLModels = 6
CLMdl1 = ECOCMdl1.BinaryLearners{1}
CLMdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [-1 1]
    ScoreTransform: 'logit'
              Beta: [34023×11 double]
              Bias: [-0.3169 -0.3169 -0.3168 -0.3168 -0.3168 -0.3167 -0.1725 -0.0805 -0.1762 -0.3450 -0.5174]
            Lambda: [1.0000e-07 3.1623e-07 1.0000e-06 3.1623e-06 1.0000e-05 3.1623e-05 1.0000e-04 3.1623e-04 1.0000e-03 0.0032 0.0100]
           Learner: 'logistic'


  Properties, Methods

fitcecoc は 5 分割の交差検証を実装するので、各分割について学習させる CompactClassificationECOC モデルから構成される 5 行 1 列の cell 配列が CVMdl に格納されます。各 CompactClassificationECOC モデルの BinaryLearners プロパティには ClassificationLinear モデルが格納されます。各コンパクト ECOC モデル内の ClassificationLinear モデルの数は、それぞれのラベルの数と符号化設計によって決まります。Lambda は正則化強度のシーケンスなので、CLMdl1 はそれぞれが Lambda の各正則化強度に対応する 11 個のモデルであると考えることができます。

各正則化強度について 5 分割分類誤差の平均をプロットすることにより、モデルがどの程度一般化を行うかを判断します。グリッド全体で汎化誤差を最小化する正則化強度を特定します。

ce = kfoldLoss(CVMdl);
figure;
plot(log10(Lambda),log10(ce))
[~,minCEIdx] = min(ce);
minLambda = Lambda(minCEIdx);
hold on
plot(log10(minLambda),log10(ce(minCEIdx)),'ro');
ylabel('log_{10} 5-fold classification error')
xlabel('log_{10} Lambda')
legend('MSE','Min classification error')
hold off

データ セット全体を使用して線形分類モデルから構成される ECOC モデルに学習をさせ、最小の正則化強度を指定します。

t = templateLinear('Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',minLambda,'GradientTolerance',1e-8);
MdlFinal = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns');

新しい観測値のラベルを推定するには、MdlFinal と新しいデータを predict に渡します。

バージョン履歴

R2016a で導入