Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

predict

ニューラル ネットワーク分類器を使用した観測値の分類

    説明

    label = predict(Mdl,X) は、学習済みのニューラル ネットワーク分類モデル Mdl を使用して、table または行列 X 内の予測子データに対する予測クラス ラベルを返します。

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

    [label,Score] = predict(___) は、前の構文におけるいずれかの入力引数の組み合わせを使用して、ラベルが特定のクラスから派生する尤度を示す分類スコアの行列も返します。X 内の各観測値について、予測クラス ラベルは、すべてのクラスの中で最大のスコアに対応します。

    すべて折りたたむ

    ニューラル ネットワーク分類器を使用して検定セットの観測値のラベルを予測します。

    patients データセットを読み込みます。データ セットから table を作成します。各行が 1 人の患者に対応し、各列が診断の変数に対応します。変数 Smoker を応答変数として使用し、残りの変数を予測子として使用します。

    load patients
    tbl = table(Diastolic,Systolic,Gender,Height,Weight,Age,Smoker);

    層化ホールドアウト分割を使用して、データを学習セット tblTrain と検定セット tblTest に分割します。観測値の約 30% が検定データ用に予約され、残りの観測値が学習データ セットに使用されます。

    rng("default") % For reproducibility of the partition
    c = cvpartition(tbl.Smoker,"Holdout",0.30);
    trainingIndices = training(c);
    testIndices = test(c);
    tblTrain = tbl(trainingIndices,:);
    tblTest = tbl(testIndices,:);

    学習セットを使用してニューラル ネットワーク分類器に学習させます。tblTrain の列 Smoker を応答変数として指定します。数値予測子を標準化するための指定を行います。

    Mdl = fitcnet(tblTrain,"Smoker", ...
        "Standardize",true);

    検定セットの観測値を分類します。混同行列を使用して結果を可視化します。

    label = predict(Mdl,tblTest);
    confusionchart(tblTest.Smoker,label)

    ニューラル ネットワーク モデルで検定セットの観測値が 2 つを除いて正しく分類されています。

    検定セットの分類マージン、エッジ、誤差、予測を比較することにより、特徴選択を実行します。すべての予測子を使用して学習させたモデルの検定セット メトリクスを予測子のサブセットのみを使用して学習させたモデルの検定セット メトリクスと比較します。

    標本ファイル fisheriris.csv を読み込みます。これには、アヤメについてのがく片の長さ、がく片の幅、花弁の長さ、花弁の幅、種の種類などのデータが格納されています。ファイルを table に読み込みます。

    fishertable = readtable('fisheriris.csv');

    層化ホールドアウト分割を使用して、データを学習セット trainTbl と検定セット testTbl に分割します。観測値の約 30% が検定データ用に予約され、残りの観測値が学習データ セットに使用されます。

    rng("default")
    c = cvpartition(fishertable.Species,"Holdout",0.3);
    trainTbl = fishertable(training(c),:);
    testTbl = fishertable(test(c),:);

    学習セット内のすべての予測子を使用して 1 つのニューラル ネットワーク分類器に学習させ、PetalWidth を除くすべての予測子を使用してもう 1 つの分類器に学習させます。両方のモデルについて、Species を応答変数として指定し、予測子を標準化します。

    allMdl = fitcnet(trainTbl,"Species","Standardize",true);
    subsetMdl = fitcnet(trainTbl,"Species ~ SepalLength + SepalWidth + PetalLength", ...
        "Standardize",true);

    2 つのモデルの検定セットの分類マージンを計算します。検定セットに含まれる観測値は 45 個だけであるため、棒グラフを使用してマージンを表示します。

    各観測値の分類マージンは、真のクラスの分類スコアと偽のクラスの最大スコアの差を表します。ニューラル ネットワーク分類器から返される分類スコアは事後確率であるため、マージンの値が 1 に近いほど信頼度が高い分類であることを示し、負のマージンの値は誤分類を示します。

    tiledlayout(2,1)
    
    % Top axes
    ax1 = nexttile;
    allMargins = margin(allMdl,testTbl);
    bar(ax1,allMargins)
    xlabel(ax1,"Observation")
    ylabel(ax1,"Margin")
    title(ax1,"All Predictors")
    
    % Bottom axes
    ax2 = nexttile;
    subsetMargins = margin(subsetMdl,testTbl);
    bar(ax2,subsetMargins)
    xlabel(ax2,"Observation")
    ylabel(ax2,"Margin")
    title(ax2,"Subset of Predictors")

    2 つのモデルの検定セットの分類エッジ (分類マージンの平均) を比較します。

    allEdge = edge(allMdl,testTbl)
    allEdge = 0.8198
    
    subsetEdge = edge(subsetMdl,testTbl)
    subsetEdge = 0.9556
    

    検定セットの分類マージンと分類エッジからは、予測子のサブセットで学習させたモデルの方がすべての予測子で学習させたモデルよりも性能が優れていると考えられます。

    2 つのモデルの検定セットの分類誤差を比較します。

    allError = loss(allMdl,testTbl);
    allAccuracy = 1-allError
    allAccuracy = 0.9111
    
    subsetError = loss(subsetMdl,testTbl);
    subsetAccuracy = 1-subsetError
    subsetAccuracy = 0.9778
    

    この場合も、予測子のサブセットのみを使用して学習させたモデルの方がすべての予測子を使用して学習させたモデルよりも性能が優れていることがわかります。

    混同行列を使用して検定セットの分類結果を可視化します。

    allLabels = predict(allMdl,testTbl);
    figure
    confusionchart(testTbl.Species,allLabels)
    title("All Predictors")

    subsetLabels = predict(subsetMdl,testTbl);
    figure
    confusionchart(testTbl.Species,subsetLabels)
    title("Subset of Predictors")

    すべての予測子を使用して学習させたモデルには、検定セットの観測値の誤分類が 4 件あります。予測子のサブセットを使用して学習させたモデルでは、検定セットの観測値の誤分類は 1 件だけです。

    2 つのモデルの検定セットの性能から、PetalWidth を除くすべての予測子を使用して学習させたモデルを使用することを検討します。

    単一の観測値のラベルと分類スコアを予測するためにニューラル ネットワーク分類器の層がどのように連携するかを調べます。

    標本ファイル fisheriris.csv を読み込みます。これには、アヤメについてのがく片の長さ、がく片の幅、花弁の長さ、花弁の幅、種の種類などのデータが格納されています。ファイルを table に読み込みます。

    fishertable = readtable('fisheriris.csv');

    データ セットを使用してニューラル ネットワーク分類器に学習させます。fishertable の列 Species を応答変数として指定します。

    Mdl = fitcnet(fishertable,"Species");

    データ セットから 15 番目の観測値を選択します。ニューラル ネットワーク分類器の層が観測値をどのように扱い、予測クラス ラベル newPointLabel と分類スコア newPointScores をどのように返すかを調べます。

    newPoint = Mdl.X{15,:}
    newPoint = 1×4
    
        5.8000    4.0000    1.2000    0.2000
    
    
    firstFCStep = (Mdl.LayerWeights{1})*newPoint' + Mdl.LayerBiases{1};
    reluStep = max(firstFCStep,0);
    
    finalFCStep = (Mdl.LayerWeights{end})*reluStep + Mdl.LayerBiases{end};
    finalSoftmaxStep = softmax(finalFCStep);
    
    [~,classIdx] = max(finalSoftmaxStep);
    newPointLabel = Mdl.ClassNames{classIdx}
    newPointLabel = 
    'setosa'
    
    newPointScores = finalSoftmaxStep'
    newPointScores = 1×3
    
        1.0000    0.0000    0.0000
    
    

    オブジェクト関数 predict で返される予測と一致することを確認します。

    [predictedLabel,predictedScores] = predict(Mdl,newPoint)
    predictedLabel = 1×1 cell array
        {'setosa'}
    
    
    predictedScores = 1×3
    
        1.0000    0.0000    0.0000
    
    

    入力引数

    すべて折りたたむ

    学習させたニューラル ネットワーク分類器。fitcnet によって返される ClassificationNeuralNetwork モデル オブジェクト、または compact によって返される CompactClassificationNeuralNetwork モデル オブジェクトとして指定します。

    分類対象の予測子データ。数値行列またはテーブルを指定します。

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

    • 数値行列の場合

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

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

    • テーブルの場合

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

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

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

    Mdl に学習させるときに fitcnet'Standardize',true を設定した場合、予測子データの数値列が対応する平均および標準偏差を使用して標準化されます。

    メモ

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

    データ型: single | double | table

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

    メモ

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

    データ型: char | string

    出力引数

    すべて折りたたむ

    予測クラス ラベル。数値ベクトル、categorical ベクトル、logical ベクトル、文字配列、string 配列、または文字ベクトルの cell 配列として返されます。観測値の分類は、分類スコアまたは事後確率が最大になるクラスに観測値を割り当てることで予測されます。

    label は、Mdl に学習させた観測済みクラス ラベルと同じデータ型になり、X の観測値の数と同じ長さになります。(string 配列は文字ベクトルの cell 配列として扱われます)。

    分類スコア。n 行 K 列の行列として返されます。n は X 内の観測値の数、K は一意のクラスの数です。分類スコア Score(i,j) は、i 番目の観測値がクラス j に属する事後確率を表します。

    詳細

    すべて折りたたむ

    分類スコア

    ニューラル ネットワーク分類器の "分類スコア" は、ネットワークの最終全結合層に続くソフトマックス活性化関数を使用して計算されます。スコアは事後確率に対応します。

    観測値 x がクラス k に属する事後確率は次のとおりです。

    P^(k|x)=P(x|k)P(k)j=1KP(x|j)P(j)=exp(ak(x))j=1Kexp(aj(x))

    ここで

    • P(x|k) は、x がクラス k に属する条件付き確率です。

    • P(k) は、クラス k の事前確率です。

    • K は、応答変数内のクラスの数です。

    • ak(x) は、観測値 x に対する最終全結合層からの k の出力です。

    R2021a で導入