Main Content

predict

インクリメンタル ドリフト認識学習モデルからの新しい観測の応答予測

R2022b 以降

    説明

    yfit = predict(Mdl,X) は、インクリメンタル ドリフト認識学習モデル Mdl からの予測子データ X について、観測値の予測応答 (またはラベル) yfit を返します。

    yfit = predict(Mdl,X,ObservationsIn=dimension) は、予測子データの観測値の次元を "rows" (既定) または "columns" のいずれかで指定します。たとえば、予測子データの観測値が X の列に沿うように指定するには ObservationsIn="columns" と指定します。

    [yfit,m] = predict(___) は、Mdl.BaseLearner が分類用のインクリメンタル学習モデルである場合に、前の構文におけるいずれかの入力引数の組み合わせを使用して、分類スコア、事後確率、または符号を反転した平均バイナリ損失も m で返します。m に格納される内容は Mdl.BaseLearner モデル オブジェクトのタイプによって異なります。

    [yfit,m,cost] = predict(___) は、Mdl.BaseLearnerincrementalClassificationNaiveBayes モデル オブジェクトである場合に、前の構文におけるいずれかの入力引数の組み合わせを使用して、予測 (推定) 誤分類コストを返します。

    すべて折りたたむ

    補助関数の HelperRegrGeneratorHelperConceptDriftGenerator をそれぞれ使用して、ランダムな概念データと概念ドリフト発生器を作成します。

    concept1 = HelperRegrGenerator(NumFeatures=100,NonZeroFeatures=[1,20,40,50,55], ...
        FeatureCoefficients=[4,5,10,-2,-6],NoiseStd=1.1,TableOutput=false);
    concept2 = HelperRegrGenerator(NumFeatures=100,NonZeroFeatures=[10,20,45,56,80], ...
        FeatureCoefficients=[4,5,10,-2,-6],NoiseStd=1.1,TableOutput=false);
    driftGenerator = HelperConceptDriftGenerator(concept1,concept2,15000,1000);

    HelperRegrGenerator は、関数の呼び出しで指定された回帰用の特徴量と特徴量係数を使用してストリーミング データを生成します。この関数は、各ステップで正規分布から予測子を抽出します。その後、関数は特徴量係数と予測子の値を使用して、平均がゼロで指定のノイズ標準偏差をもつ正規分布からランダム ノイズを追加することで応答を計算します。そのデータがインクリメンタル学習器で使用するために行列として返されます。

    HelperConceptDriftGenerator は、概念ドリフトを確立します。このオブジェクトでは、シグモイド関数 1./(1+exp(-4*(numobservations-position)./width)) を使用して、データ生成時に 1 つ目のストリームが選択される確率を判定します [3]。この例では、位置の引数が 15000 で、幅の引数が 1000 です。観測値の数が位置の値から幅の半分を引いた値を超えると、データ生成時に 1 つ目のストリームから抽出される確率が低下します。このシグモイド関数により、一方のストリームからもう一方への滑らかな遷移が実現します。幅の値が大きいほど、両方のストリームがほぼ等しい確率で選択される遷移期間が大きいことを示します。

    回帰用のインクリメンタル ドリフト認識モデルを次のように開始します。

    1. 回帰用のインクリメンタル線形モデルを作成します。線形回帰モデルのタイプとソルバーのタイプを指定します。

    2. 移動平均による Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を開始します。

    3. インクリメンタル線形モデルと概念ドリフト検出器を使用して、インクリメンタル ドリフト認識モデルをインスタンス化します。学習期間を 6000 個の観測値として指定します。

    baseMdl = incrementalRegressionLinear(Learner="leastsquares",Solver="sgd",EstimationPeriod=1000,Standardize=false);
    dd = incrementalConceptDriftDetector("hddma",Alternative="greater",InputType="continuous",WarmupPeriod=1000);
    idaMdl = incrementalDriftAwareLearner(baseMdl,DriftDetector=dd,TrainingPeriod=6000);

    データ ストリームの作成用に各チャンクの変数の数と反復回数を事前に割り当てます。

    numObsPerChunk = 10;
    numIterations = 4000;

    ドリフト ステータスとドリフト時間を追跡する変数、および回帰誤差を格納する変数を事前に割り当てます。

    dstatus = zeros(numIterations,1);
    statusname = strings(numIterations,1);
    driftTimes = [];
    ce = array2table(zeros(numIterations,2),VariableNames=["Cumulative" "Window"]);

    それぞれ 10 個の観測値の入力チャンクを使用してデータ ストリームをシミュレートし、インクリメンタル ドリフト認識学習を実行します。各反復で次を行います。

    1. 予測子データとラベルをシミュレートし、補助関数 hgenerate を使用してドリフト発生器を更新します。

    2. updateMetrics を呼び出してパフォーマンス メトリクスを更新し、fit を呼び出してインクリメンタル ドリフト認識モデルを入力データに当てはめます。

    3. 可視化のためにドリフト ステータスと回帰誤差を追跡して記録します。

    rng(12); % For reproducibility
    
    for j = 1:numIterations
     
     % Generate data
     [driftGenerator,X,Y] = hgenerate(driftGenerator,numObsPerChunk); 
    
     % Update performance metrics and fit
     idaMdl = updateMetrics(idaMdl,X,Y); 
     idaMdl = fit(idaMdl,X,Y);
    
     % Record drift status and regression error
     statusname(j) = string(idaMdl.DriftStatus); 
     ce{j,:} = idaMdl.Metrics{"MeanSquaredError",:};
        if idaMdl.DriftDetected
           dstatus(j) = 2;
           driftTimes(end+1) = j;
        elseif idaMdl.WarningDetected
           dstatus(j) = 1;
        else 
           dstatus(j) = 0;
        end   
     
    end

    ドリフト ステータスと反復回数の関係をプロットします。

    figure()
    gscatter(1:numIterations,dstatus,statusname,'gmr','o',5,'on',"Iteration","Drift Status","filled")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel Drift Status contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent Stable, Drift.

    累積とウィンドウごとの回帰誤差をプロットします。ウォームアップ期間と学習期間、およびドリフトが発生した時点をマークします。

    figure()
    h = plot(ce.Variables);
    
    xlim([0 numIterations])
    ylim([0 20])
    ylabel("Mean Squared Error")
    xlabel("Iteration")
    
    xline((idaMdl.MetricsWarmupPeriod+idaMdl.BaseLearner.EstimationPeriod)/numObsPerChunk,"g-.","Estimation Period + Warmup Period",LineWidth=1.5)
    xline((idaMdl.MetricsWarmupPeriod+idaMdl.BaseLearner.EstimationPeriod)/numObsPerChunk+driftTimes,"g-.","Estimation Period + Warmup Period",LineWidth=1.5)
    xline(idaMdl.TrainingPeriod/numObsPerChunk,"b-.","Training Period",LabelVerticalAlignment="middle",LineWidth=1.5)
    xline(driftTimes,"m--","Drift",LabelVerticalAlignment="middle",LineWidth=1.5)
    
    legend(h,ce.Properties.VariableNames)
    legend(h,Location="best")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel Mean Squared Error contains 6 objects of type line, constantline. These objects represent Cumulative, Window.

    ドリフトの検出後、関数 fit は関数 reset を呼び出してインクリメンタル ドリフト認識学習器、つまりベース学習器とドリフト検出器をリセットします。関数 updateMetrics は、idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod の観測値を待ってからモデルのパフォーマンス メトリクスの更新を再開します。

    新しいデータを生成します。列の予測子変数を再配向します。

    [driftGenerator,X,Y] = hgenerate(driftGenerator,500); 
    X = X';

    新しいデータで応答を予測します。予測子変数の方向を指定します。

    yhat = predict(idaMdl,X,ObservationsIn="columns");

    残差を計算してプロットします。

    res = Y - yhat;
    plot(res)
    ylabel("Residuals")
    xlabel("New data points")

    Figure contains an axes object. The axes object with xlabel New data points, ylabel Residuals contains an object of type line.

    残差は、新しいデータで 0 を中心に対称的に広がっています。

    HelperSineGenerator を使用してランダムな概念データを作成し、HelperConceptDriftGenerator を使用して概念ドリフト発生器を作成します。

    concept1 = HelperSineGenerator("ClassificationFunction",1,"IrrelevantFeatures",true,"TableOutput",false);
    concept2 = HelperSineGenerator("ClassificationFunction",3,"IrrelevantFeatures",true,"TableOutput",false);
    driftGenerator = HelperConceptDriftGenerator(concept1,concept2,15000,1000);

    ClassificationFunction が 1 の場合、HelperSineGenerator"x1" < "sin(x2)" を満たすすべての点に 1 のラベルを付け、それ以外に 0 のラベルを付けます。ClassificationFunction が 3 の場合はその逆になります。つまり、HelperSineGenerator は、"x1" >= "sin(x2)" を満たすすべての点に 1 のラベルを付け、それ以外に 0 のラベルを付けます。

    HelperConceptDriftGenerator は、概念ドリフトを確立します。このオブジェクトでは、シグモイド関数 1./(1+exp(-4*(numobservations-position)./width)) を使用して、データ生成時に 1 つ目のストリームが選択される確率を判定します [1]。この例では、位置の引数が 15000 で、幅の引数が 1000 です。観測値の数が位置の値から幅の半分を引いた値を超えると、データ生成時に 1 つ目のストリームから抽出される確率が低下します。このシグモイド関数により、一方のストリームからもう一方への滑らかな遷移が実現します。幅の値が大きいほど、両方のストリームがほぼ等しい確率で選択される遷移期間が大きいことを示します。

    インクリメンタル ドリフト認識モデルを次のようにインスタンス化します。

    1. バイナリ分類用のインクリメンタル単純ベイズ分類モデルを作成します。

    2. 移動平均による Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を開始します。

    3. インクリメンタル線形モデルと概念ドリフト検出器を使用して、インクリメンタル ドリフト認識モデルをインスタンス化します。学習期間を 5000 個の観測値として指定します。

    BaseLearner = incrementalClassificationLinear(Solver="sgd");
    dd = incrementalConceptDriftDetector("hddma");
    idaMdl = incrementalDriftAwareLearner(BaseLearner,DriftDetector=dd,TrainingPeriod=5000);

    データ ストリームの作成用に各チャンクの変数の数と反復回数を事前に割り当てます。

    numObsPerChunk = 10;
    numIterations = 4000;

    ドリフト ステータスとドリフト時間を追跡する変数、および分類誤差を格納する変数を事前に割り当てます。

    dstatus = zeros(numIterations,1);
    statusname = strings(numIterations,1);
    ce = array2table(zeros(numIterations,2),VariableNames=["Cumulative" "Window"]);
    driftTimes = [];

    それぞれ 10 個の観測値の入力チャンクを使用してデータ ストリームをシミュレートし、インクリメンタル ドリフト認識学習を実行します。各反復で次を行います。

    1. 予測子データとラベルをシミュレートし、補助関数 hgenerate を使用してドリフト発生器を更新します。

    2. updateMetricsAndFit を呼び出して、パフォーマンス メトリクスを更新し、インクリメンタル ドリフト認識モデルを入力データに当てはめます。

    3. 可視化のためにドリフト ステータスと分類誤差を追跡して記録します。

    rng(12); % For reproducibility
    
    for j = 1:numIterations
     
     % Generate data
     [driftGenerator,X,Y] = hgenerate(driftGenerator,numObsPerChunk); 
    
     % Update performance metrics and fit
     idaMdl = updateMetricsAndFit(idaMdl,X,Y); 
    
     % Record drift status and classification error
     statusname(j) = string(idaMdl.DriftStatus); 
     ce{j,:} = idaMdl.Metrics{"ClassificationError",:};
     if idaMdl.DriftDetected
           dstatus(j) = 2;  
           driftTimes(end+1) = j; 
        elseif idaMdl.WarningDetected
           dstatus(j) = 1;
        else 
           dstatus(j) = 0;
        end   
      
    end

    累積とウィンドウごとの分類誤差をプロットします。ウォームアップ期間と学習期間、およびドリフトが発生した時点をマークします。

    h = plot(ce.Variables);
    
    xlim([0 numIterations])
    ylim([0 0.08])
    ylabel("Classification Error")
    xlabel("Iteration")
    
    xline((idaMdl.BaseLearner.EstimationPeriod+idaMdl.MetricsWarmupPeriod)/numObsPerChunk,"g-.","Estimation + Warmup Period",LineWidth=1.5)
    xline(idaMdl.TrainingPeriod/numObsPerChunk,"b-.","Training Period",LabelVerticalAlignment="middle",LineWidth=1.5)
    xline(driftTimes,"m--","Drift",LabelVerticalAlignment="middle",LineWidth=1.5)
    
    legend(h,ce.Properties.VariableNames)
    legend(h,Location="best")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel Classification Error contains 5 objects of type line, constantline. These objects represent Cumulative, Window.

    ドリフト ステータスと反復回数の関係をプロットします。

    gscatter(1:numIterations,dstatus,statusname,'gmr','o',4,'on',"Iteration","Drift Status","Filled")

    Figure contains an axes object. The axes object with xlabel Iteration, ylabel Drift Status contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Stable, Warning, Drift.

    500 個の観測値からなる新しいデータを生成します。新しいデータのクラス ラベルと分類スコアを予測します。

    numnewdata = 500;
    [driftGenerator,X,Y] = hgenerate(driftGenerator,numnewdata); 
    [yhat,cscores] = predict(idaMdl,X);

    ROC を計算して結果をプロットします。

    roc = rocmetrics(Y,cscores,idaMdl.BaseLearner.ClassNames);
    plot(roc)

    Figure contains an axes object. The axes object with title ROC Curve, xlabel False Positive Rate, ylabel True Positive Rate contains 5 objects of type roccurve, scatter, line. These objects represent false (AUC = 0.9996), false Model Operating Point, true (AUC = 0.9996), true Model Operating Point.

    関数 plot は、各クラスの ROC 曲線をプロットし、モデル操作点に塗りつぶされた円のマーカーを表示します。凡例に各曲線のクラスの名前と AUC の値が表示されます。バイナリ分類問題では、2 つの ROC 曲線は対称であり、AUC の値は同じになります。

    モデルの精度を計算します。

    accuracy = sum(Y==yhat)/500
    accuracy = 0.9780
    

    モデルは新しいクラス ラベルを高い精度で予測しています。

    入力引数

    すべて折りたたむ

    ストリーミング データに当てはめるインクリメンタル ドリフト認識学習モデル。incrementalDriftAwareLearner モデル オブジェクトとして指定します。Mdl は関数 incrementalDriftAwareLearner を使用して作成できます。詳細については、オブジェクトのリファレンス ページを参照してください。

    応答またはラベルを予測するための予測子データのチャンク。n 個の観測値と Mdl.BaseLearner.NumPredictors 個の予測子変数で構成される浮動小数点行列として指定します。

    Mdl.BaseLearner が名前と値の引数 ObservationsIn を受け入れる場合、ObservationsIn の値で変数と観測値の方向が決まります。ObservationsIn の既定値は "rows" であり、予測子データの観測値が X の行に沿うことを示しています。

    メモ

    predict は、浮動小数点の入力予測子データのみをサポートしています。入力データに categorical データが含まれている場合は、エンコード バージョンの categorical データを準備する必要があります。dummyvar を使用して、各カテゴリカル変数をダミー変数で構成される数値行列に変換します。その後、すべてのダミー変数行列とその他の数値予測子を連結します。詳細については、ダミー変数を参照してください。

    データ型: single | double

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

    predict は、Mdl.BaseLearner が名前と値の引数 ObservationsIn=dimension をサポートする場合にのみ ObservationsIn をサポートします。

    データ型: char | string

    出力引数

    すべて折りたたむ

    予測応答 (ラベル)。n 行の浮動小数点ベクトル、categorical 配列、文字配列、string ベクトル、logical ベクトル、または文字ベクトルの cell 配列として返されます。n は X の観測値の数、yfit(j) は観測値 j の予測応答 (ラベル) です。

    • 分類問題の場合、yfitMdl.BaseLearner.ClassNames に格納されているクラス名と同じデータ型になります。string 配列は文字ベクトルの cell 配列として扱われます。

    • 回帰問題の場合、yfit は浮動小数点ベクトルです。

    分類スコア、事後確率、または符号を反転した平均バイナリ損失。Mdl.BaseLearner がインクリメンタル分類モデルである場合に、浮動小数点行列として返されます。

    • Mdl.BaseLearnerincrementalClassificationLinear または incrementalClassificationKernel モデル オブジェクトの場合、m には学習器のタイプに応じて生の分類スコアまたは事後確率が格納されます。詳細については、predict (incrementalClassificationLinear) または predict (incrementalClassificationKernel) を参照してください。

    • Mdl.BaseLearnerincrementalClassificationNaiveBayes モデル オブジェクトの場合、m には事後確率が格納されます。詳細については、predict (incrementalClassificationNaiveBayes) を参照してください。

    • Mdl.BaseLearnerincrementalClassificationECOC モデル オブジェクトの場合、m には符号を反転した平均バイナリ損失が格納されます。詳細については、predict (incrementalClassificationECOC) を参照してください。

    予測誤分類コスト。Mdl.BaseLearnerincrementalClassificationNaiveBayes である場合に、n 行 numel(Mdl.BaseLearner.ClassNames) 列の浮動小数点行列として返されます。詳細については、predict (incrementalClassificationNaiveBayes) を参照してください。

    参照

    [1] Barros, Roberto S.M. , et al. "RDDM: Reactive drift detection method." Expert Systems with Applications. vol. 90, Dec. 2017, pp. 344-55. https://doi.org/10.1016/j.eswa.2017.08.023.

    [2] Bifet, Albert, et al. "New Ensemble Methods for Evolving Data Streams." Proceedings of the 15th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. ACM Press, 2009, p. 139. https://doi.org/10.1145/1557019.1557041.

    [3] Gama, João, et al. "Learning with drift detection". Advances in Artificial Intelligence – SBIA 2004, edited by Ana L. C. Bazzan and Sofiane Labidi, vol. 3171, Springer Berlin Heidelberg, 2004, pp. 286–95. https://doi.org/10.1007/978-3-540-28645-5_29.

    バージョン履歴

    R2022b で導入