このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
predict
構文
説明
例
補助関数の HelperRegrGenerator
と HelperConceptDriftGenerator
をそれぞれ使用して、ランダムな概念データと概念ドリフト発生器を作成します。
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 つ目のストリームから抽出される確率が低下します。このシグモイド関数により、一方のストリームからもう一方への滑らかな遷移が実現します。幅の値が大きいほど、両方のストリームがほぼ等しい確率で選択される遷移期間が大きいことを示します。
回帰用のインクリメンタル ドリフト認識モデルを次のように開始します。
回帰用のインクリメンタル線形モデルを作成します。線形回帰モデルのタイプとソルバーのタイプを指定します。
移動平均による Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を開始します。
インクリメンタル線形モデルと概念ドリフト検出器を使用して、インクリメンタル ドリフト認識モデルをインスタンス化します。学習期間を 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 個の観測値の入力チャンクを使用してデータ ストリームをシミュレートし、インクリメンタル ドリフト認識学習を実行します。各反復で次を行います。
予測子データとラベルをシミュレートし、補助関数
hgenerate
を使用してドリフト発生器を更新します。updateMetrics
を呼び出してパフォーマンス メトリクスを更新し、fit
を呼び出してインクリメンタル ドリフト認識モデルを入力データに当てはめます。可視化のためにドリフト ステータスと回帰誤差を追跡して記録します。
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() 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")
ドリフトの検出後、関数 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")
残差は、新しいデータで 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 つ目のストリームから抽出される確率が低下します。このシグモイド関数により、一方のストリームからもう一方への滑らかな遷移が実現します。幅の値が大きいほど、両方のストリームがほぼ等しい確率で選択される遷移期間が大きいことを示します。
インクリメンタル ドリフト認識モデルを次のようにインスタンス化します。
バイナリ分類用のインクリメンタル単純ベイズ分類モデルを作成します。
移動平均による Hoeffding 境界のドリフト検出法 (HDDMA) を使用するインクリメンタルな概念ドリフト検出器を開始します。
インクリメンタル線形モデルと概念ドリフト検出器を使用して、インクリメンタル ドリフト認識モデルをインスタンス化します。学習期間を 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 個の観測値の入力チャンクを使用してデータ ストリームをシミュレートし、インクリメンタル ドリフト認識学習を実行します。各反復で次を行います。
予測子データとラベルをシミュレートし、補助関数
hgenerate
を使用してドリフト発生器を更新します。updateMetricsAndFit
を呼び出して、パフォーマンス メトリクスを更新し、インクリメンタル ドリフト認識モデルを入力データに当てはめます。可視化のためにドリフト ステータスと分類誤差を追跡して記録します。
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")
ドリフト ステータスと反復回数の関係をプロットします。
gscatter(1:numIterations,dstatus,statusname,'gmr','o',4,'on',"Iteration","Drift Status","Filled")
500 個の観測値からなる新しいデータを生成します。新しいデータのクラス ラベルと分類スコアを予測します。
numnewdata = 500; [driftGenerator,X,Y] = hgenerate(driftGenerator,numnewdata); [yhat,cscores] = predict(idaMdl,X);
ROC を計算して結果をプロットします。
roc = rocmetrics(Y,cscores,idaMdl.BaseLearner.ClassNames); plot(roc)
関数 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
の行に沿うことを示しています。
データ型: single
| double
予測子データにおける観測値の次元。"columns"
または "rows"
として指定します。
predict
は、Mdl.BaseLearner
が名前と値の引数 ObservationsIn=dimension
をサポートする場合にのみ ObservationsIn
をサポートします。
データ型: char
| string
出力引数
予測応答 (ラベル)。n 行の浮動小数点ベクトル、categorical 配列、文字配列、string ベクトル、logical ベクトル、または文字ベクトルの cell 配列として返されます。n は X
の観測値の数、yfit(
は観測値 j
)
の予測応答 (ラベル) です。j
分類問題の場合、
yfit
はMdl.BaseLearner.ClassNames
に格納されているクラス名と同じデータ型になります。string 配列は文字ベクトルの cell 配列として扱われます。回帰問題の場合、
yfit
は浮動小数点ベクトルです。
分類スコア、事後確率、または符号を反転した平均バイナリ損失。Mdl.BaseLearner
がインクリメンタル分類モデルである場合に、浮動小数点行列として返されます。
Mdl.BaseLearner
がincrementalClassificationNaiveBayes
モデル オブジェクトの場合、m
には事後確率が格納されます。詳細については、predict
(incrementalClassificationNaiveBayes
) を参照してください。
Mdl.BaseLearner
がincrementalClassificationECOC
モデル オブジェクトの場合、m
には符号を反転した平均バイナリ損失が格納されます。詳細については、predict
(incrementalClassificationECOC
) を参照してください。
予測誤分類コスト。Mdl.BaseLearner
が incrementalClassificationNaiveBayes
である場合に、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 で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)