Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

predict

クラス: ClassificationLinear

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

説明

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

Label = predict(Mdl,X,'ObservationsIn',dimension) は、予測子データにおける観測値の次元を、'rows' (既定) または 'columns' のいずれかで指定します。たとえば、'ObservationsIn','columns' と指定して、予測子データの列が観測値に対応することを示します。

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

入力引数

すべて展開する

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

分類する予測子データ。非スパースまたはスパースの数値行列またはテーブルとして指定します。

既定では、X の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。

  • 数値行列の場合

    • X の列に含まれている変数の順序は、Mdl に学習させた予測子変数の順序と同じでなければなりません。

    • テーブル (たとえば Tbl) を使用して Mdl に学習をさせる場合、Tbl に含まれている予測子変数が数値のみであれば、X を数値行列にすることができます。学習時に Tbl 内の数値予測子をカテゴリカルとして扱うには、fitclinear の名前と値のペアの引数 CategoricalPredictors を使用してカテゴリカル予測子を指定します。Tbl に種類の異なる予測子変数 (数値および categorical データ型など) が混在し、X が数値行列である場合、predict でエラーがスローされます。

  • テーブルの場合

    • predict は、文字ベクトルの cell 配列ではない cell 配列や複数列の変数をサポートしません。

    • テーブル (たとえば Tbl) を使用して Mdl に学習をさせた場合、X 内のすべての予測子変数は変数名およびデータ型が、Mdl に学習させた (Mdl.PredictorNames に格納されている) 変数と同じでなければなりません。ただし、X の列の順序が Tbl の列の順序に対応する必要はありません。また、TblX に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict はこれらを無視します。

    • 数値行列を使用して Mdl に学習をさせる場合、Mdl.PredictorNames 内の予測子名と X 内の対応する予測子変数名が同じでなければなりません。学習時に予測子の名前を指定するには、fitclinear の名前と値のペアの引数 PredictorNames を使用します。X 内の予測子変数はすべて数値ベクトルでなければなりません。X に追加の変数 (応答変数や観測値の重みなど) を含めることができますが、predict はこれらを無視します。

メモ

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

データ型: table | double | single

予測子データにおける観測値の次元。'columns' または 'rows' として指定します。

メモ

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

出力引数

すべて展開する

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

関数 predict は、スコアが最高になるクラスに観測値を分類します。観測値のスコアが NaN の場合、関数はこの観測値を、学習ラベルの最大比率を占める多数クラスに分類します。

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

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

分類スコア。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 = confusionchart(Ystats,label);

Figure contains an object of type ConfusionMatrixChart.

このモデルは、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 = confusionchart(Ystats(trainIdx),labelTrain);

Figure contains an object of type ConfusionMatrixChart.

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

テスト データの混同行列を作成します。

ConfusionTest = confusionchart(Ystats(testIdx),labelTest);

Figure contains an object of type ConfusionMatrixChart.

このモデルは、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) の事後確率が格納されます。

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

rocObj = rocmetrics(Ystats(idxTest),posterior,Mdl.ClassNames);

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

plot(rocObj,ClassNames=Mdl.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.9985), true Model Operating Point.

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

ロジスティック回帰学習器を使用する線形分類モデルに適した 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 個の観測値があります。

10-610-0.5 の範囲で対数間隔で配置された 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 = 
  ClassificationPartitionedLinear
    CrossValidatedModel: 'Linear'
           ResponseName: 'Y'
        NumObservations: 31572
                  KFold: 1
              Partition: [1x1 cvpartition]
             ClassNames: [0 1]
         ScoreTransform: 'none'


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

Mdl1 = CVMdl.Trained{1}
Mdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'logit'
              Beta: [34023x11 double]
              Bias: [-11.9185 -11.9185 -11.9185 -11.9185 -9.4756 -6.2922 -5.1797 -4.3978 -3.3221 -3.1969 -2.9866]
            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'


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 です。

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

auc = 1:numel(Lambda);  % Preallocation
for j = 1:numel(Lambda)
    rocObj = rocmetrics(YTest,posterior(:,:,j),Mdl1.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('Test-Sample Statistics')
hold off

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

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

idxFinal = 9;

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

MdlFinal = selectModels(Mdl,idxFinal);

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

詳細

すべて展開する

代替機能

Simulink ブロック

Simulink® に線形分類モデルの予測を統合するには、Statistics and Machine Learning Toolbox™ ライブラリにある ClassificationLinear Predict ブロックを使用するか、MATLAB® Function ブロックを関数 predict と共に使用します。例については、ClassificationLinear Predict ブロックの使用によるクラス ラベルの予測MATLAB Function ブロックの使用によるクラス ラベルの予測を参照してください。

使用するアプローチを判断する際は、以下を考慮してください。

  • Statistics and Machine Learning Toolbox ライブラリ ブロックを使用する場合、固定小数点ツール (Fixed-Point Designer)を使用して浮動小数点モデルを固定小数点に変換できます。

  • MATLAB Function ブロックを関数 predict と共に使用する場合は、可変サイズの配列に対するサポートを有効にしなければなりません。

  • MATLAB Function ブロックを使用する場合、予測の前処理や後処理のために、同じ MATLAB Function ブロック内で MATLAB 関数を使用することができます。

拡張機能

バージョン履歴

R2016a で導入