ドキュメンテーション

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

ClassificationPartitionedLinear

パッケージ: classreg.learning.partition
スーパークラス: ClassificationPartitionedModel

高次元データのバイナリ分類用の交差検証済み線形モデル

説明

ClassificationPartitionedLinear は、交差検証分割で学習を行った一連の線形分類モデルです。交差検証済みの線形分類モデルを取得するには、fitclinear を使用して交差検証オプションのいずれかを指定します。分類の品質や、線形分類モデルがどの程度一般化を行うかは、kfold メソッド kfoldPredictkfoldLosskfoldMarginkfoldEdge を 1 つ以上使用して評価できます。

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

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

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

  3. 3 ~ 5 番目のモデルについて同様の処理が行われます。

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

メモ

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

構築

CVMdl = fitclinear(X,Y,Name,Value) は、Name'CrossVal''CVPartition''Holdout' または 'KFold' のいずれかである場合に、交差検証済みの線形分類モデルを作成します。詳細は、fitclinearを参照してください。

プロパティ

すべて展開する

交差検証のプロパティ

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

たとえば、'Linear' はバイナリ分類または回帰について交差検証済みの線形モデルを指定します。

データ型: char

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

データ型: double

交差検証のパラメーター値 (線形モデルの交差検証に使用する名前と値のペアの引数など)。オブジェクトを指定します。推定したパラメーターは ModelParameters に格納されません。

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

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

データ型: double

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

交差検証分割で学習を行った線形分類モデル。ClassificationLinear モデルの cell 配列を指定します。Trained には k 個のセルがあります。k は分割数です。

データ型: cell

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

W は、特定のクラスに含まれている観測値の重みの合計がそのクラスの事前確率になるように正規化されます。

データ型: single | double

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

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

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

他の分類のプロパティ

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

データ型: 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

CVMdl の学習に使用される予測子データに現れる順に並んだ予測子名。文字ベクトルの cell 配列を指定します。PredictorNames の長さは、予測子データ内の予測子変数の数と同じです。

データ型: cell

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

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

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

データ型: double

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

データ型: char

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

線形分類モデルで変換前の場合、観測値 x (行ベクトル) について予測される分類スコア は f(x) = xβ + b になります。β と b はそれぞれ Mdl.BetaMdl.Bias に対応します。

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

メソッド

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

コピーのセマンティクス

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

すべて折りたたむ

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

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。データには 2 つを超えるクラスがあります。

Statistics and Machine Learning Toolbox™ のドキュメンテーション Web ページに対応するラベルを特定します。

Ystats = Y == 'stats';

あるドキュメンテーション Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できるバイナリ線形分類モデルの交差検証を行います。

rng(1); % For reproducibility 
CVMdl = fitclinear(X,Ystats,'CrossVal','on')
CVMdl = 
  classreg.learning.partition.ClassificationPartitionedLinear
    CrossValidatedModel: 'Linear'
           ResponseName: 'Y'
        NumObservations: 31572
                  KFold: 10
              Partition: [1x1 cvpartition]
             ClassNames: [0 1]
         ScoreTransform: 'none'


  Properties, Methods

CVMdl は、ClassificationPartitionedLinear 交差検証済みモデルです。既定の設定では fitclinear は 10 分割の交差検証を実装するので、CVMdl.Trained には 10 個の ClassificationLinear モデルが格納されており、これらのモデルには各分割について線形分類モデルの学習を行った結果が格納されています。

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

oofLabels = kfoldPredict(CVMdl);
ge = kfoldLoss(CVMdl)
ge = 7.6017e-04

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

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

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

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。データには 2 つを超えるクラスがあります。

モデルでは、ある Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できなければなりません。したがって、Statistics and Machine Learning Toolbox™ のドキュメンテーション Web ページに対応するラベルを識別します。

Ystats = Y == 'stats';

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

Lambda = logspace(-6,-0.5,11);

モデルを交差検証します。実行速度を向上させるため、予測子データを転置し、観測値が列単位であることを指定します。SpaRSA を使用して係数を推定します。目的関数の勾配の許容誤差を 1e-8 に下げます。

X = X'; 
rng(10); % For reproducibility
CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns','KFold',5,...
    'Learner','logistic','Solver','sparsa','Regularization','lasso',...
    'Lambda',Lambda,'GradientTolerance',1e-8)
CVMdl = 
  classreg.learning.partition.ClassificationPartitionedLinear
    CrossValidatedModel: 'Linear'
           ResponseName: 'Y'
        NumObservations: 31572
                  KFold: 5
              Partition: [1×1 cvpartition]
             ClassNames: [0 1]
         ScoreTransform: 'none'


  Properties, Methods

numCLModels = numel(CVMdl.Trained)
numCLModels = 5

CVMdlClassificationPartitionedLinear モデルです。fitclinear は 5 分割の交差検証を実装するので、各分割について学習させる 5 つの ClassificationLinear モデルが CVMdl に格納されます。

1 番目の学習済み線形分類モデルを表示します。

Mdl1 = CVMdl.Trained{1}
Mdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'logit'
              Beta: [34023×11 double]
              Bias: [-13.2904 -13.2904 -13.2904 -13.2904 -9.9357 -7.0782 -5.4335 -4.5473 -3.4223 -3.1649 -2.9795]
            Lambda: [1.0000e-06 3.5481e-06 1.2589e-05 4.4668e-05 1.5849e-04 5.6234e-04 0.0020 0.0071 0.0251 0.0891 0.3162]
           Learner: 'logistic'


  Properties, Methods

Mdl1ClassificationLinear モデル オブジェクトです。fitclinear は最初の 4 つの分割に対して学習を行うことにより Mdl1 を構築しました。Lambda は正則化強度のシーケンスなので、Mdl1 はそれぞれが Lambda の各正則化強度に対応する 11 個のモデルであると考えることができます。

交差検証分類誤差を推定します。

ce = kfoldLoss(CVMdl);

11 個の正則化強度があるので、ce は 1 行 11 列の分類誤差率のベクトルです。

Lambda の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。データセット全体を使用し、モデルの交差検証を行ったときと同じオプションを指定して、各正則化強度について線形分類モデルに学習をさせます。モデルごとに非ゼロの係数を特定します。

Mdl = fitclinear(X,Ystats,'ObservationsIn','columns',...
    'Learner','logistic','Solver','sparsa','Regularization','lasso',...
    'Lambda',Lambda,'GradientTolerance',1e-8);
numNZCoeff = sum(Mdl.Beta~=0);

同じ図に、各正則化強度についての交差検証分類誤差率と非ゼロ係数の頻度をプロットします。すべての変数を対数スケールでプロットします。

figure;
[h,hL1,hL2] = plotyy(log10(Lambda),log10(ce),...
    log10(Lambda),log10(numNZCoeff)); 
hL1.Marker = 'o';
hL2.Marker = 'o';
ylabel(h(1),'log_{10} classification error')
ylabel(h(2),'log_{10} nonzero-coefficient frequency')
xlabel('log_{10} Lambda')
title('Test-Sample Statistics')
hold off

予測子変数のスパース性と分類誤差の低さのバランスがとれている正則化強度のインデックスを選択します。この場合、 の値で十分なはずです。

idxFinal = 7;

選択した正則化強度のモデルを Mdl から選択します。

MdlFinal = selectModels(Mdl,idxFinal);

MdlFinal は、1 つの正則化強度が含まれている ClassificationLinear モデルです。新しい観測値のラベルを推定するには、MdlFinal と新しいデータを predict に渡します。

R2016a で導入