ドキュメンテーション

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

predict

クラス: ClassificationLinear

線形分類モデルのラベルの予測

構文

Label = predict(Mdl,X)
Label = predict(Mdl,X,Name,Value)
[Label,Score] = predict(___)

説明

Label = predict(Mdl,X) は、学習済みのバイナリ線形分類モデル Mdl に基づいて予測子データ X 内の各観測値について予測したクラス ラベルを返します。Label には、Mdl 内の各正則化強度に対するクラス ラベルが格納されます。

Label = predict(Mdl,X,Name,Value) は、1 つ以上の Name,Value のペア引数により指定された追加オプションを使用して、予測クラス ラベルを返します。たとえば、予測子データの列が観測値に対応することを指定できます。

[Label,Score] = predict(___) は、前の構文のいずれかを使用して、両方のクラスの分類スコアも返します。Score には、Mdl 内の各正則化強度に対する分類スコアが格納されます。

入力引数

すべて展開する

バイナリ線形分類モデル。ClassificationLinear モデル オブジェクトを指定します。ClassificationLinear モデル オブジェクトは、fitclinear を使用して作成できます。

予測子データ。n 行 p 列の非スパース行列またはスパース行列を指定します。この X の配置は、各行が個々の観測値に、各列が個々の予測子変数に対応することを示しています。

メモ

観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns' を指定すると、計算時間が大幅に短縮される可能性があります。

データ型: single | double

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で閉じなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順序で指定できます。

予測子データにおける観測値の次元。'ObservationsIn''columns' または 'rows' から構成されるコンマ区切りのペアとして指定します。

メモ

観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns' を指定すると、最適化実行時間が大幅に短縮される可能性があります。

出力引数

すべて展開する

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

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

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

分類スコア。n x 2 x L の数値配列として返されます。n は X 内の観測値数、L は Mdl.Lambda 内の正則化強度の数です。Score(i,k,j) は、正則化強度が Mdl.Lambda(j) である線形分類モデルを使用して観測値 i をクラス k に分類するスコアです。クラスの順序は Mdl.ClassNames に格納されます。

Mdl.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 
Mdl = fitclinear(X,Ystats);

MdlClassificationLinear モデルです。

学習標本 (再代入) のラベルを予測します。

label = predict(Mdl,X);

Mdl 内の正則化強度は 1 つなので、label は長さが観測値数に等しい列ベクトルになります。

混同行列を作成します。

ConfusionTrain = confusionmat(Ystats,label)
ConfusionTrain = 2×2

       30018           0
           1        1553

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

NLP のデータセットを読み込み、学習標本のラベルの予測 で説明されているように前処理します。予測子データ行列を転置します。

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

あるドキュメンテーション Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できるバイナリ線形分類モデルに学習をさせます。観測値の 30% をホールドアウトするように指定します。SpaRSA を使用して目的関数を最適化します。

rng(1); % For reproducibility 
CVMdl = fitclinear(X,Ystats,'Solver','sparsa','Holdout',0.30,...
    'ObservationsIn','columns');
Mdl = CVMdl.Trained{1};

CVMdlClassificationPartitionedLinear モデルです。これには Trained プロパティが含まれています。これは 1 行 1 列の cell 配列で、学習セットにより学習させた ClassificationLinear モデルが格納されています。

学習データと検定データを分割の定義から抽出します。

trainIdx = training(CVMdl.Partition);
testIdx = test(CVMdl.Partition);

学習標本および検定標本のラベルを予測します。

labelTrain = predict(Mdl,X(:,trainIdx),'ObservationsIn','columns');
labelTest = predict(Mdl,X(:,testIdx),'ObservationsIn','columns');

Mdl 内の正則化強度は 1 つなので、labelTrainlabelTest はそれぞれ長さが学習観測値数および検定観測値数に等しい列ベクトルになります。

学習データの混同行列を作成します。

ConfusionTrain = confusionmat(Ystats(trainIdx),labelTrain)
ConfusionTrain = 2×2

       21013           0
           3        1085

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

検定データの混同行列を作成します。

ConfusionTest = confusionmat(Ystats(testIdx),labelTest)
ConfusionTest = 2×2

        9003           2
           3         463

このモデルは、3 つのドキュメンテーション ページを Statistics and Machine Learning Toolbox ドキュメンテーションの外部、2 つのページを内部にあると誤分類します。

検定標本の事後クラス確率を推定し、ROC 曲線をプロットしてモデルの品質を判断します。線形分類モデルは、ロジスティック回帰学習器の場合のみ事後確率を返します。

NLP のデータセットを読み込み、検定標本のラベルの予測 で説明されているように前処理します。

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

30% のホールドアウト標本を指定して、データを無作為に学習セットと検定セットに分割します。検定セットのインデックスを特定します。

cvp = cvpartition(Ystats,'Holdout',0.30);
idxTest = test(cvp);

バイナリ線形分類モデルに学習をさせます。SpaRSA を使用してロジスティック回帰学習器を近似させます。検定セットをホールドアウトするため、分割済みのモデルを指定します。

CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns','CVPartition',cvp,...
    'Learner','logistic','Solver','sparsa');
Mdl = CVMdl.Trained{1};

Mdl は、分割 cvp で指定される学習セットのみを使用して学習を行った ClassificationLinear モデルです。

検定標本の事後クラス確率を予測します。

[~,posterior] = predict(Mdl,X(:,idxTest),'ObservationsIn','columns');

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

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

[fpr,tpr,~,auc] = perfcurve(Ystats(idxTest),posterior(:,2),Mdl.ClassNames(2));
auc
auc = 0.9986

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

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 曲線と AUC から、モデルが検定標本の観測値をほぼ完璧に分類することがわかります。

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

NLP のデータセットを読み込みます。検定標本のラベルの予測で説明されているようにデータを前処理します。

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

観測値の 10% をホールドアウトするように指定するデータ分割を作成します。検定標本のインデックスを抽出します。

rng(10); % For reproducibility
Partition = cvpartition(Ystats,'Holdout',0.10);
testIdx = test(Partition);
XTest = X(:,testIdx);
n = sum(testIdx)
n = 3157
YTest = Ystats(testIdx);

検定標本には 3157 個の観測値があります。

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

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

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

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


  Properties, Methods

学習済みの線形分類モデルを抽出します。

Mdl1 = CVMdl.Trained{1}
Mdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'logit'
              Beta: [34023x11 double]
              Bias: [1x11 double]
            Lambda: [1x11 double]
           Learner: 'logistic'


  Properties, Methods

MdlClassificationLinear モデル オブジェクトです。Lambda は正則化強度のシーケンスなので、Mdl はそれぞれが Lambda の各正則化強度に対応する 11 個のモデルであると考えることができます。

検定標本の予測ラベルと事後クラス確率を推定します。

[label,posterior] = predict(Mdl1,XTest,'ObservationsIn','columns');
Mdl1.ClassNames;
posterior(3,1,5)
ans = 1.0000

label は、予測されたラベルが含まれている 3157 行 11 列の行列です。各列は、対応する正則化強度を使用して学習を行ったモデルの予測ラベルに対応します。posterior は事後クラス確率が含まれている 3157 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(YTest,posterior(:,2,j),Mdl1.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('Test-Sample Statistics')
hold off

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

idxFinal = 9;

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

MdlFinal = selectModels(Mdl,idxFinal);

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

詳細

すべて展開する

拡張機能

R2016a で導入