Main Content

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

kfoldPredict

学習で使用しない観測値のラベルの予測

説明

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

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

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

入力引数

すべて展開する

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

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

出力引数

すべて展開する

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

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

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

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

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

すべて展開する

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: [34023x1 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);

このモデルは、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 = 2x1 logical array

   0
   1

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

偽陽性率と真陽性率を取得し、AUC を推定します。2 番目のクラスが陽性クラスであることを指定します。

[fpr,tpr,~,auc] = perfcurve(Ystats,posterior(:,2),CVMdl.ClassNames(2));
auc
auc = 0.9989

AUC は 0.9990 なので、モデルの予測精度が高いことがわかります。

ROC 曲線をプロットします。

figure;
plot(fpr,tpr)
h = gca;
h.XLim(1) = -0.1;
h.YLim(2) = 1.1;
xlabel('False positive rate')
ylabel('True positive rate')
title('ROC Curve')

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 = 
  classreg.learning.partition.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.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 モデル オブジェクトです。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 です。

各モデルについて AUC を計算します。2 番目のクラスを陽性クラスとして指定します。

auc = 1:numel(Lambda);  % Preallocation
for j = 1:numel(Lambda)
    [~,~,~,auc(j)] = perfcurve(Ystats,posterior(:,2,j),CVMdl.ClassNames(2));
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;
[h,hL1,hL2] = plotyy(log10(Lambda),log10(auc),...
    log10(Lambda),log10(numNZCoeff + 1)); 
hL1.Marker = 'o';
hL2.Marker = 'o';
ylabel(h(1),'log_{10} AUC')
ylabel(h(2),'log_{10} nonzero-coefficient frequency')
xlabel('log_{10} Lambda')
title('Cross-Validated Statistics')
hold off

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

idxFinal = 9;

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

MdlFinal = selectModels(Mdl,idxFinal);

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

詳細

すべて展開する

R2016a で導入