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 配列として返されます。

ほとんどの場合 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 = confusionchart(Ystats,label);

このモデルは、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);

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

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

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

このモデルは、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.9985

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 個の観測値があります。

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'


  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 の高さのバランスがとれている正則化強度のインデックスを選択します。この場合、10-210-1 の値で十分なはずです。

idxFinal = 9;

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

MdlFinal = selectModels(Mdl,idxFinal);

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

詳細

すべて展開する

拡張機能

R2016a で導入