メインコンテンツ

kfoldPredict

交差検証済み線形分類モデルの観測値の分類

説明

Label = kfoldPredict(CVMdl) は、交差検証済みのバイナリ線形分類モデル CVMdl によって予測した交差検証クラス ラベルを返します。つまり、他のすべての観測値を使用して学習を行うときにホールドアウトする観測値のクラス ラベルを、kfoldPredict はすべての分割について予測します。

Label には、CVMdl を構成する線形分類モデルの各正則化強度に対する予測クラス ラベルが格納されます。

[Label,Score] = kfoldPredict(CVMdl) は、両方のクラスの交差検証分類スコアも返します。Score には、CVMdl 内の各正則化強度に対する分類スコアが格納されます。

すべて折りたたむ

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

load nlpdata

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

モデルでは、ある Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できなければなりません。したがって、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');
Mdl1 = CVMdl.Trained{1}
Mdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [34023×1 double]
              Bias: -1.0008
            Lambda: 3.5193e-05
           Learner: 'svm'


  Properties, Methods

CVMdlClassificationPartitionedLinear モデルです。既定では、10 分割交差検証が実行されます。'KFold' 名前と値のペアの引数を使用して分割数を変更できます。

fitclinear で分割の学習に使用されなかった観測値のラベルを予測します。

label = kfoldPredict(CVMdl);

Mdl1 内の正則化強度は 1 つなので、label は予測の列ベクトルになり、行数は X 内の観測値数と同じになります。

混同行列を作成します。

ConfusionTrain = confusionchart(Ystats,label);

Figure contains an object of type ConfusionMatrixChart.

このモデルは、15 個の 'stats' ドキュメンテーション ページを Statistics and Machine Learning Toolbox ドキュメンテーションの外部にあると誤分類し、9 個のページを 'stats' ページとして誤分類します。

線形分類モデルは、ロジスティック回帰学習器の場合のみ事後確率を返します。

NLP のデータ セットを読み込み、k 分割交差検証ラベルの予測 で説明されているように前処理します。予測子データ行列を転置します。

load nlpdata
Ystats = Y == 'stats';
X = X';

5 分割の交差検証を使用してバイナリ線形分類モデルを交差検証します。SpaRSA を使用して目的関数を最適化します。目的関数の勾配の許容誤差を 1e-8 に下げます。

rng(10); % For reproducibility
CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns',...
    'KFold',5,'Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','GradientTolerance',1e-8);

各分割で学習に使用しなかった観測値の事後クラス確率を予測します。

[~,posterior] = kfoldPredict(CVMdl);
CVMdl.ClassNames
ans = 2×1 logical array

   0
   1

CVMdl 内の正則化強度は 1 つなので、posterior は列数が 2 で行数が観測値数と同じである行列になります。列 i には、与えられた特定の観測値に対する Mdl.ClassNames(i) の事後確率が格納されます。

rocmetricsオブジェクトを作成し、ROC 曲線のパフォーマンス メトリクス (真陽性率と偽陽性率) を計算して ROC 曲線の下の領域 (AUC) の値を求めます。

rocObj = rocmetrics(Ystats,posterior,CVMdl.ClassNames);

rocmetrics の関数 plot を使用して、2 番目のクラスの ROC 曲線をプロットします。

plot(rocObj,ClassNames=CVMdl.ClassNames(2))

Figure contains an axes object. The axes object with title ROC Curve, xlabel False Positive Rate, ylabel True Positive Rate contains 3 objects of type roccurve, scatter, line. These objects represent true (AUC = 0.999), true Model Operating Point.

ROC 曲線から、モデルが検証の観測値をほぼ完璧に分類することがわかります。

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

NLP のデータ セットを読み込みます。k 分割交差検証事後クラス確率の推定で説明されているようにデータを前処理します。

load nlpdata
Ystats = Y == 'stats';
X = X';

テスト標本には 9471 個の観測値があります。

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

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

各正則化強度と 5 分割の交差検証を使用するバイナリ線形分類モデルを交差検証します。SpaRSA を使用して目的関数を最適化します。目的関数の勾配の許容誤差を 1e-8 に下げます。

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


  Properties, Methods

Mdl1 = CVMdl.Trained{1}
Mdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'logit'
              Beta: [34023×11 double]
              Bias: [-13.2936 -13.2936 -13.2936 -13.2936 -13.2936 -6.8954 -5.4359 -4.7170 -3.4108 -3.1566 -2.9792]
            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 モデル オブジェクトです。Lambda は正則化強度のシーケンスなので、Mdl1 はそれぞれが Lambda の各正則化強度に対応する 11 個のモデルであると考えることができます。

交差検証されたラベルと事後クラス確率を予測します。

[label,posterior] = kfoldPredict(CVMdl);
CVMdl.ClassNames;
[n,K,L] = size(posterior)
n = 
31572
K = 
2
L = 
11
posterior(3,1,5)
ans = 
1.0000

label は、予測されたラベルが含まれている 31572 行 11 列の行列です。各列は、対応する正則化強度を使用して学習を行ったモデルの予測ラベルに対応します。posterior は事後クラス確率が含まれている 31572 x 2 x 11 の行列です。列はクラスに対応し、ページは正則化強度に対応します。たとえば、posterior(3,1,5) は、正則化強度として Lambda(5) を使用するモデルによって 1 番目のクラス (ラベルは 0) が観測値 3 に割り当てられる事後確率を示し、値は 1.0000 です。

それぞれのモデルについて、rocmetricsを使用して AUC を計算します。

auc = 1:numel(Lambda);  % Preallocation
for j = 1:numel(Lambda)
    rocObj = rocmetrics(Ystats,posterior(:,:,j),CVMdl.ClassNames);
    auc(j) = rocObj.AUC(1);
end

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

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

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

figure
yyaxis left
plot(log10(Lambda),log10(auc),'o-')
ylabel('log_{10} AUC')
yyaxis right
plot(log10(Lambda),log10(numNZCoeff + 1),'o-')
ylabel('log_{10} nonzero-coefficient frequency')
xlabel('log_{10} Lambda')
title('Cross-Validated Statistics')
hold off

Figure contains an axes object. The axes object with title Cross-Validated Statistics, xlabel log indexOf 10 baseline Lambda, ylabel log indexOf 10 baseline blank nonzero-coefficient frequency contains 2 objects of type line.

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

idxFinal = 9;

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

MdlFinal = selectModels(Mdl,idxFinal);

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

入力引数

すべて折りたたむ

交差検証済みバイナリ線形分類モデル。ClassificationPartitionedLinear モデル オブジェクトとして指定します。ClassificationPartitionedLinear モデル オブジェクトを作成するには、fitclinear を使用し、交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal など) を指定します。

推定値を取得するため、kfoldPredict は線形分類モデルの交差検証に使用したものと同じデータ (X および Y) を適用します。

出力引数

すべて折りたたむ

交差検証予測クラス ラベル。categorical 配列、文字配列、logical 行列、数値行列、または文字ベクトルの cell 配列として返されます。

ほとんどの場合 Label は、CVMdl の作成に使用した、観測されたクラス ラベル (Y を参照) と同じデータ型の nL 列の配列になります。(string 配列は文字ベクトルの cell 配列として扱われます)。n は予測子データ内の観測値の個数 (X を参照)、LCVMdl.Trained{1}.Lambda 内の正則化強度の個数です。つまり Label(i,j) は、正則化強度が CVMdl.Trained{1}.Lambda(j) である線形分類モデルを使用した、観測値 i の予測クラス ラベルです。

Y が文字配列で L > 1 の場合、Label はクラス ラベルの cell 配列になります。

交差検証分類スコアn x 2 x L の数値配列として返されます。nCVMdl を作成した予測子データ (X を参照) 内の観測値数、LCVMdl.Trained{1}.Lambda 内の正則化強度の数です。Score(i,k,j) は、正則化強度が CVMdl.Trained{1}.Lambda(j) である線形分類モデルを使用した、観測値 i をクラス k に分類するスコアです。クラスの順序は CVMdl.ClassNames に格納されます。

CVMdl.Trained{1}.Learner'logistic' の場合、分類スコアは事後確率です。

詳細

すべて折りたたむ

拡張機能

すべて展開する

バージョン履歴

R2016a で導入

すべて展開する