Main Content

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

predict

回帰ニューラル ネットワークの使用による応答の予測

    説明

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

    yfit は、i 番目のエントリが X の i 番目の観測値に対応する数値ベクトルとして返されます。

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

    すべて折りたたむ

    学習済みの回帰ニューラル ネットワーク モデルを使用して検定セットの応答値を予測します。

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

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

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

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

    学習セットを使用して回帰ニューラル ネットワーク モデルに学習させます。tblTrain の列 Systolic を応答変数として指定します。数値予測子を標準化するための指定を行います。既定では、ニューラル ネットワーク モデルには、最終全結合層を除き、出力数が 10 の全結合層が 1 つあります。

    Mdl = fitrnet(tblTrain,"Systolic", ...
        "Standardize",true);

    検定セットの患者の収縮期血圧レベルを予測します。

    predictedY = predict(Mdl,tblTest);

    基準線を示した散布図を使用して結果を可視化します。予測値を縦軸に、実際の応答値を横軸に沿ってプロットします。基準線上にある点は予測が正しいことを示します。

    plot(tblTest.Systolic,predictedY,".")
    hold on
    plot(tblTest.Systolic,tblTest.Systolic)
    hold off
    xlabel("True Systolic Blood Pressure Levels")
    ylabel("Predicted Systolic Blood Pressure Levels")

    多くの点が基準線から離れた位置にあるため、サイズ 10 の全結合層をもつ既定のニューラル ネットワーク モデルは、収縮期血圧レベルの最適な予測子ではないようです。

    検定セットの損失と予測を比較することにより、特徴選択を実行します。すべての予測子を使用して学習させた回帰ニューラル ネットワーク モデルの検定セット メトリクスを予測子のサブセットのみを使用して学習させたモデルの検定セット メトリクスと比較します。

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

    fishertable = readtable('fisheriris.csv');

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

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

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

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

    2 つのモデルの検定セットの平均二乗誤差 (MSE) を比較します。MSE の値が小さいほど、パフォーマンスが優れていることを示します。

    allMSE = loss(allMdl,testTbl)
    allMSE = 0.0834
    
    subsetMSE = loss(subsetMdl,testTbl)
    subsetMSE = 0.0887
    

    各モデルについて、検定セットの予測される花弁の長さと実際の花弁の長さを比較します。予測される花弁の長さを縦軸に、実際の花弁の長さを横軸に沿ってプロットします。基準線上にある点は予測が正しいことを示します。

    tiledlayout(2,1)
    
    % Top axes
    ax1 = nexttile;
    allPredictedY = predict(allMdl,testTbl);
    plot(ax1,testTbl.PetalLength,allPredictedY,".")
    hold on
    plot(ax1,testTbl.PetalLength,testTbl.PetalLength)
    hold off
    xlabel(ax1,"True Petal Length")
    ylabel(ax1,"Predicted Petal Length")
    title(ax1,"All Predictors")
    
    % Bottom axes
    ax2 = nexttile;
    subsetPredictedY = predict(subsetMdl,testTbl);
    plot(ax2,testTbl.PetalLength,subsetPredictedY,".")
    hold on
    plot(ax2,testTbl.PetalLength,testTbl.PetalLength)
    hold off
    xlabel(ax2,"True Petal Length")
    ylabel(ax2,"Predicted Petal Length")
    title(ax2,"Subset of Predictors")

    予測が基準線の近くに分布しており、両方のモデルが適切に機能しているようなので、PetalWidth を除くすべての予測子を使用して学習させたモデルを使用することを検討します。

    単一の観測値の応答値を予測するために回帰ニューラル ネットワーク モデルの層がどのように連携するかを調べます。

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

    fishertable = readtable('fisheriris.csv');
    head(fishertable)
    ans=8×5 table
        SepalLength    SepalWidth    PetalLength    PetalWidth     Species  
        ___________    __________    ___________    __________    __________
    
            5.1           3.5            1.4           0.2        {'setosa'}
            4.9             3            1.4           0.2        {'setosa'}
            4.7           3.2            1.3           0.2        {'setosa'}
            4.6           3.1            1.5           0.2        {'setosa'}
              5           3.6            1.4           0.2        {'setosa'}
            5.4           3.9            1.7           0.4        {'setosa'}
            4.6           3.4            1.4           0.3        {'setosa'}
              5           3.4            1.5           0.2        {'setosa'}
    
    

    データ セットを使用して回帰ニューラル ネットワーク モデルに学習させます。変数 PetalLength を応答として指定し、他の数値変数を予測子として使用します。

    Mdl = fitrnet(fishertable,"PetalLength ~ SepalLength + SepalWidth + PetalWidth");

    データ セットから 15 番目の観測値を選択します。ニューラル ネットワークの層が観測値をどのように扱い、予測応答値 newPointResponse をどのように返すかを調べます。

    newPoint = Mdl.X{15,:}
    newPoint = 1×3
    
        5.8000    4.0000    0.2000
    
    
    firstFCStep = (Mdl.LayerWeights{1})*newPoint' + Mdl.LayerBiases{1};
    reluStep = max(firstFCStep,0);
    
    finalFCStep = (Mdl.LayerWeights{end})*reluStep + Mdl.LayerBiases{end};
    
    newPointResponse = finalFCStep
    newPointResponse = 1.6716
    

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

    predictedY = predict(Mdl,newPoint)
    predictedY = 1.6716
    
    isequal(newPointResponse,predictedY)
    ans = logical
       1
    
    

    2 つの結果は一致しています。

    入力引数

    すべて折りたたむ

    学習させた回帰ニューラル ネットワーク。fitrnet によって返される RegressionNeuralNetwork モデル オブジェクト、または compact によって返される CompactRegressionNeuralNetwork モデル オブジェクトとして指定します。

    応答の生成に使用する予測子データ。数値行列またはテーブルを指定します。

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

    • 数値行列の場合

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

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

    • テーブルの場合

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

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

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

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

    メモ

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

    データ型: single | double | table

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

    メモ

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

    データ型: char | string

    R2021a で導入