Main Content

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

incrementalClassificationLinear

インクリメンタル学習用のバイナリ分類線形モデル

説明

incrementalClassificationLinearincrementalClassificationLinear モデル オブジェクトを作成します。これは、インクリメンタル学習用のバイナリ分類線形モデルを表します。サポートされる学習器には、サポート ベクター マシン (SVM) とロジスティック回帰が含まれます。

他の Statistics and Machine Learning Toolbox™ モデル オブジェクトとは異なり、incrementalClassificationLinear は直接呼び出すことができます。また、モデルをデータにあてはめる前に、パフォーマンス メトリクス構成、パラメーター値、および目的ソルバーなどの学習オプションを指定できます。incrementalClassificationLinear オブジェクトを作成すると、インクリメンタル学習用に準備されます。

incrementalClassificationLinear は、インクリメンタル学習に最適です。バイナリ分類用の SVM または線形モデルに学習させるための従来のアプローチ (データへのあてはめによるモデルの作成、交差検証の実行、ハイパーパラメーターの調整など) については、fitcsvm または fitclinear を参照してください。

作成

incrementalClassificationLinear モデル オブジェクトは、次のいくつかの方法で作成できます。

  • 関数の直接呼び出し — インクリメンタル学習オプションを構成するか、incrementalClassificationLinear を直接呼び出して、線形モデル パラメーターとハイパーパラメーターの初期値を指定します。このアプローチは、データがまだない場合やインクリメンタル学習をすぐに開始したい場合に最適です。

  • 従来式の学習済みモデルの変換 — 学習済みの SVM またはバイナリ分類線形モデル オブジェクトのモデル係数およびハイパーパラメーターを使用して、インクリメンタル学習用のバイナリ分類線形モデルを初期化するには、従来式の学習済みモデルを関数 incrementalLearner に渡して incrementalClassificationLinear モデル オブジェクトに変換できます。この表には、適切なリファレンス ページへのリンクが含まれています。

    変換可能なモデル オブジェクト変換関数
    ClassificationSVM または CompactClassificationSVMincrementalLearner
    ClassificationLinearincrementalLearner

  • インクリメンタル学習関数の呼び出しfitupdateMetrics、および updateMetricsAndFit は、構成済みの incrementalClassificationLinear モデル オブジェクトおよびデータを入力として受け入れ、入力モデルとデータから学習した情報で更新された incrementalClassificationLinear モデル オブジェクトを返します。

説明

Mdl = incrementalClassificationLinear() は、インクリメンタル学習用の既定のバイナリ分類線形モデル オブジェクト Mdl を返します。既定のモデルのプロパティには、未知のモデル パラメーター用のプレースホルダーが含まれています。既定のモデルは、パフォーマンスを追跡したり、予測を生成したりする前に学習させなければなりません。

Mdl = incrementalClassificationLinear(Name,Value) は、名前と値のペアの引数を使用して、プロパティと追加のオプションを設定します。それぞれの名前は引用符で囲みます。たとえば、incrementalClassificationLinear('Beta',[0.1 0.3],'Bias',1,'MetricsWarmupPeriod',100) は、線形モデル係数 β のベクトルを [0.1 0.3] に、バイアス β01 に、およびメトリクスのウォームアップ期間を 100 に設定します。

入力引数

すべて展開する

名前と値のペアの引数

オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: 'Standardize',true は、推定期間中に推定された予測子の平均と標準偏差を使用して、予測子データを標準化します。

インクリメンタル学習中に追跡するモデルのパフォーマンス メトリクス。'Metrics' および組み込みの損失関数名で構成されるコンマ区切りのペア、名前の string ベクトル、関数ハンドル (@metricName)、関数ハンドルの構造体配列、または名前、関数ハンドル、構造体配列の cell ベクトルとして指定します。

Mdl"ウォーム" のとき (IsWarm を参照)、updateMetrics および updateMetricsAndFitMdlMetrics プロパティのパフォーマンス メトリクスを追跡します。

次の表は、組み込みの損失関数名の一覧です。string ベクトルを使用して、複数指定できます。

名前説明
"binodeviance"二項分布からの逸脱度
"classiferror"分類誤差
"exponential"指数
"hinge"ヒンジ
"logit"ロジスティック
"quadratic"2 次

組み込み損失関数の詳細については、loss を参照してください。

例: 'Metrics',["classiferror" "hinge"]

パフォーマンス メトリクスを返すカスタム関数を指定するには、関数ハンドル表記を使用します。関数は次の形式でなければなりません。

metric = customMetric(C,S)

  • 出力引数 metric は n 行 1 列の数値ベクトルです。ここで、各要素は、学習サイクル中にインクリメンタル学習関数によって処理されたデータの対応する観測値の損失です。

  • 関数名 (customMetric) を選択します。

  • C は n 行 2 列の logical 行列であり、対応する観測値が属するクラスを各行が示します。列の順序は ClassNames プロパティのクラスの順序に対応します。C を作成するには、指定されたデータの各観測値について観測値 p がクラス q に属する場合に C(p,q) = 1 を設定します。行 p の他の要素を 0 に設定します。

  • S は、予測分類スコアの n 行 2 列の数値行列です。Spredict の出力 Score に似ています。ここで、行はデータの観測値に対応し、列の順序は ClassNames プロパティのクラスの順序に対応しています。S(p,q) は、クラス q に分類されている観測値 p の分類スコアです。

複数のカスタム メトリクスを指定し、それぞれにカスタム名を割り当てるには、構造体配列を使用します。組み込みメトリクスとカスタム メトリクスの組み合わせを指定するには、cell ベクトルを使用します。

例: 'Metrics',struct('Metric1',@customMetric1,'Metric2',@customMetric2)

例: 'Metrics',{@customMetric1 @customeMetric2 'logit' struct('Metric3',@customMetric3)}

updateMetrics および updateMetricsAndFit は、table で指定したメトリクスを Metrics プロパティに保存します。Metrics のデータ型によって、table の行名が決まります。

'Metrics' 値のデータ型Metrics プロパティの行名の説明
string または文字ベクトル対応する組み込みメトリクスの名前"classiferror" の行名は "ClassificationError"
構造体配列フィールド名struct('Metric1',@customMetric1) の行名は "Metric1"
プログラム ファイルに格納されている関数への関数ハンドル関数名@customMetric の行名は "customMetric"
無名関数CustomMetric_j。ここで、jMetrics のメトリクス j@(C,S)customMetric(C,S)... の行名は CustomMetric_1

パフォーマンス メトリクス オプションの詳細については、パフォーマンス メトリクスを参照してください。

データ型: char | string | struct | cell | function_handle

予測子データを標準化するためのフラグ。'Standardize' と以下の表の値で構成されるコンマ区切りのペアとして指定します。

説明
'auto'incrementalClassificationLinear が予測子変数を標準化する必要があるかどうかを決定します。データの標準化を参照してください。
trueソフトウェアが予測子データを標準化します。詳細は、データの標準化を参照してください。
falseソフトウェアが予測子データを標準化しません。

例: 'Standardize',true

データ型: logical | char | string

プロパティ

すべて展開する

ほとんどのプロパティは、incrementalClassificationLinear を直接呼び出すときに名前と値のペアの引数の構文のみを使用して設定できます。incrementalLearner を呼び出して従来式の学習済みモデルを変換するときに、いくつかのプロパティを設定できます。プロパティ FittedLossNumTrainingObservationsMuSigmaSolverOptions、および IsWarm は設定できません。

分類モデルのパラメーター

このプロパティは読み取り専用です。

線形モデル係数 β。NumPredictors 行 1 列の数値ベクトルとして指定します。

従来式の学習済みモデルを変換して Mdl を作成する場合、Beta は従来式の学習済みモデルの Beta プロパティの値によって指定されます。それ以外の場合、既定で Betazeros(NumPredictors,1) です。

データ型: single | double

このプロパティは読み取り専用です。

モデル切片 β0 またはバイアス項。数値スカラーとして指定します。

従来式の学習済みモデルを変換して Mdl を作成する場合、Bias は従来式の学習済みモデルの Bias プロパティの値によって指定されます。それ以外の場合、既定で Bias0 です。

データ型: single | double

このプロパティは読み取り専用です。

モデルの学習に使用した一意のクラス ラベル。categorical 配列、文字配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として指定します。incrementalClassificationLinear は指定された string ベクトルを文字ベクトルの cell 配列として保存します。

  • 従来式の学習済みモデルを変換して Mdl を作成する場合、ClassNames は従来式の学習済みモデルの ClassNames プロパティです。

  • それ以外の場合、インクリメンタル近似関数は学習中に ClassNames を推測します。

データ型: single | double | logical | char | cell | categorical

このプロパティは読み取り専用です。

線形モデルのあてはめに使用する損失関数。'hinge' または 'logit' を指定します。

アルゴリズム損失関数Learner の値
'hinge'サポート ベクター マシンヒンジ: [y,f(x)]=max[0,1yf(x)]'svm'
'logit'ロジスティック回帰逸脱度 (ロジスティック): [y,f(x)]=log{1+exp[yf(x)]}'logistic'

このプロパティは読み取り専用です。

線形分類モデルのタイプ。'logistic' または 'svm' を指定します。

次の表では f(x)=xβ+b. です。

  • β は p 個の係数のベクトルです。

  • x は p 個の予測子変数による観測値です。

  • b はスカラー バイアスです。

アルゴリズム損失関数FittedLoss の値
'logistic'ロジスティック回帰逸脱度 (ロジスティック): [y,f(x)]=log{1+exp[yf(x)]}'logit'
'svm'サポート ベクター マシンヒンジ: [y,f(x)]=max[0,1yf(x)]'hinge'

従来式の学習済みモデルを変換して Mdl を作成する場合、Learner は従来式の学習済みモデルの学習器です。

このプロパティは読み取り専用です。

予測子変数の数。非負の数値スカラーとして指定します。

従来式の学習済みモデルを変換して Mdl を作成する場合、NumPredictors は従来式の学習済みモデルの対応するプロパティによって指定されます。それ以外の場合、インクリメンタル近似関数は学習中に予測子データから NumPredictors を推測します。

データ型: uint32

このプロパティは読み取り専用です。

インクリメンタル モデル Mdl にあてはめる観測値の数。非負の数値スカラーとして指定します。NumTrainingObservations は、Mdl および学習データを fit または updateMetricsAndFit に渡すときに増加します。

メモ

従来式の学習済みモデルを変換して Mdl を作成する場合、incrementalClassificationLinear は、従来式の学習済みモデルにあてはめる観測値の数を NumTrainingObservations に追加しません。

データ型: uint64

このプロパティは読み取り専用です。

前のクラスの確率。次の表の値として指定します。名前と値のペアの引数の構文を使用してこのプロパティを設定できますが、incrementalClassificationLinear は常に数値ベクトルを格納します。

説明
'empirical'インクリメンタル学習関数が、インクリメンタル学習中 (推定期間 EstimationPeriod の後) に応答データで観測されたクラスの相対頻度から前のクラスの確率を推定します。
'uniform'各クラスの事前確率を 1/K とします。ここで、K はクラスの数です。
数値ベクトル正規化されたカスタム事前確率。Prior の要素の順序は ClassNames プロパティの要素に対応します。

  • 従来式の学習済みモデルを変換して Mdl を作成する場合、incrementalClassificationLinear は従来式の学習済みモデルの Prior プロパティを使用します。

  • それ以外の場合は、Prior'empirical' です。

データ型: single | double

このプロパティは読み取り専用です。

インクリメンタル変換関数が生の応答値を変換する方法を記述するスコア変換関数。文字ベクトル、string スカラー、または関数ハンドルとして指定します。incrementalClassificationLinear は、指定された値を文字ベクトルまたは関数ハンドルとして格納します。

次の表は、スコア変換で使用可能な組み込み関数の一覧です。

説明
'doublelogit'1/(1 + e–2x)
'invlogit'log(x / (1 – x))
'ismax'最大のスコアをもつクラスのスコアを 1 に設定し、他のすべてのクラスのスコアを 0 に設定する
'logit'1/(1 + e–x)
'none' または 'identity'x (変換なし)
'sign'x < 0 のとき –1
x = 0 のとき 0
x > 0 のとき 1
'symmetric'2x – 1
'symmetricismax'最大のスコアをもつクラスのスコアを 1 に設定し、他のすべてのクラスのスコアを –1 に設定する
'symmetriclogit'2/(1 + e–x) – 1

MATLAB® 関数やユーザー定義関数の場合は、関数ハンドルを入力します。たとえば、'ScoreTransform',@function では次のようになります。

  • function は n 行 K 列の行列 (元のスコア) を受け入れ、同じサイズの行列 (変換されたスコア) を返します。

  • n は観測値の数であり、行列の行 j には、観測値 j のクラス スコアが格納されます。

  • K クラスの数 numel(ClassNames) で、列 k はクラス ClassNames(k) です。

既定の設定では、次のようになります。

  • 従来式の学習済みモデルを変換して Mdl を作成する場合、ScoreTransform は従来式の学習済みモデルの対応するプロパティによって指定されます。たとえば、従来式の学習済みモデルの ScoreTransform プロパティがスコアから事後確率への変換関数である場合、fitPosterior または fitSVMPosterior によって計算されるものとして、Mdl.ScoreTransform は無名関数を含みます。

  • Learner'svm' のとき、ScoreTransform'none' です。

  • Learner'logistic' のとき、ScoreTransform'logit' です。

データ型: char | function_handle

学習パラメーター

このプロパティは読み取り専用です。

ハイパーパラメーターの推定のために、パフォーマンス メトリクスの学習または追跡の前にインクリメンタル モデルが処理する観測値の数。非負の整数として指定します。

メモ

  • Mdl をインクリメンタル学習用に準備する場合 (学習に必要なすべてのハイパーパラメーターを指定する必要があります)、incrementalClassificationLinear'EstimationPeriod'0 に強制します。

  • Mdl をインクリメンタル学習用に準備しない場合、incrementalClassificationLinear'EstimationPeriod'1000 にセットします。

詳細は、推定期間を参照してください。

データ型: single | double

このプロパティは読み取り専用です。

線形モデルの切片使用フラグ。true または false として指定します。

説明
trueincrementalClassificationLinear は、バイアス項 β0 を、インクリメンタル関数がデータにあてはめる線形モデルに含めます。
falseincrementalClassificationLinear は β0 = 0 に設定します。

Bias ≠ 0 の場合、FitBiastrue でなければなりません。つまり、incrementalClassificationLinear は β0 の等式制約をサポートしません。

従来式の学習済み線形分類モデル (ClassificationLinear) を変換して Mdl を作成する場合、FitBias は従来式の学習済みモデルの ModelParameters.FitBias プロパティの値によって指定されます。

データ型: logical

このプロパティは読み取り専用です。

予測子の平均。数値ベクトルを指定します。

Mu が空の配列 [] で、'Standardize',true が指定されている場合、インクリメンタル近似関数は、MuEstimationPeriod で指定された推定期間中に推定された予測子変数の平均に設定します。

Mu を直接指定することはできません。

データ型: single | double

このプロパティは読み取り専用です。

予測子の標準偏差。数値ベクトルを指定します。

Sigma が空の配列 [] で、'Standardize',true が指定されている場合、インクリメンタル近似関数は、SigmaEstimationPeriod で指定された推定期間中に推定された予測子変数の標準偏差に設定します。

Sigma を直接指定することはできません。

データ型: single | double

このプロパティは読み取り専用です。

目的関数の最小化手法。次の表の値として指定します。

説明メモ:
'scale-invariant'

インクリメンタル学習用の適応型スケール不変ソルバー[1]

このアルゴリズムはパラメーターを持たず、予測子のスケールの違いに適応できます。SGD または ASGD を使用する前に、このアルゴリズムを試してください。
'sgd'確率的勾配降下法 (SGD) [3][2]

SGD で効果的に学習させるには、データを標準化し、SGD および ASGD ソルバーのパラメーターにリストされているオプションを使用してハイパーパラメーターの適切な値を指定します。

'asgd'平均化確率的勾配降下法 (ASGD) [4]ASGD で効果的に学習させるには、データを標準化し、SGD および ASGD ソルバーのパラメーターにリストされているオプションを使用してハイパーパラメーターの適切な値を指定します。

バイナリ分類用の従来式の学習済み線形分類モデル (ClassificationLinear) を変換して Mdl を作成する場合、その ModelParameters.Solver プロパティは 'sgd' または 'asgd' であり、Solver は従来式の学習済みモデルの ModelParameters.Solver プロパティによって指定されます。

データ型: char | string

このプロパティは読み取り専用です。

目的ソルバーの構成。構造体配列として指定します。SolverOptions のフィールドは、指定したソルバー Solver 固有のプロパティです。

データ型: struct

SGD および ASGD ソルバーのパラメーター

このプロパティは読み取り専用です。

ミニバッチのサイズ。正の整数として指定します。学習中の各反復で、incrementalClassificationLinearmin(BatchSize,numObs) 個の観測値を使用して劣勾配を計算します。ここで、numObs は、fit または updateMetricsAndFit に渡される学習データ内の観測値の数です。

バイナリ分類用の従来式の学習済み線形分類モデル (ClassificationLinear) を変換して Mdl を作成する場合、その ModelParameters.Solver プロパティは 'sgd' または 'asgd' であり、BatchSize は従来式の学習済みモデルの ModelParameters.BatchSize プロパティによって指定されます。それ以外の場合は、既定値は 10 です。

データ型: single | double

このプロパティは読み取り専用です。

リッジ (L2) 正則化項の強度。非負のスカラーとして指定します。

リッジ ペナルティがあるバイナリ分類用の従来式の学習済み線形分類モデル (プロパティ Regularization'ridge (L2)' と等しい ClassificationLinear オブジェクト) を変換して Mdl を作成する場合、Lambda は従来式の学習済みモデルの Lambda プロパティの値によって指定されます。それ以外の場合は、既定値は 1e-5 です。

データ型: double | single

このプロパティは読み取り専用です。

学習率。'auto' または正のスカラーとして指定します。LearnRate は、目的の劣勾配をスケールすることによって最適化のステップ サイズを制御します。

'auto' を指定した場合、次のようになります。

  • EstimationPeriod0 の場合、初期学習率は 0.7 となります。

  • EstimationPeriod > 0 の場合、初期学習率は 1/sqrt(1+max(sum(X.^2,obsDim))) となります。ここで、obsDim は、観測値が予測子データの列を構成する場合に 1、それ以外の場合に 2 となります。fit および updateMetricsAndFit がモデルおよび学習データを一方に渡すときに値が設定されます。

バイナリ分類用の従来式の学習済み線形分類モデル (ClassificationLinear) を変換して Mdl を作成する場合、その ModelParameters.Solver プロパティは 'sgd' または 'asgd' であり、LearnRate は従来式の学習済みモデルの ModelParameters.LearnRate プロパティによって指定されます。

LearnRateSchedule プロパティによって、後続の学習サイクルの学習率が決まります。

データ型: single | double | char | string

このプロパティは読み取り専用です。

学習率スケジュール。次の表の値として指定します。ここで、LearnRate は初期学習率 ɣ0 を指定します。

説明
'constant'すべての学習サイクルの学習率を ɣ0 とする。
'decaying'

学習サイクル t での学習率を次とする。

γt=γ0(1+λγ0t)c.

  • λ は Lambda の値です。

  • Solver'sgd' の場合、c = 1 です。

  • Solver'asgd' の場合、c は 0.75 です [4]

バイナリ分類用の従来式の学習済み線形分類モデル (ClassificationLinear) を変換して Mdl を作成する場合、その ModelParameters.Solver プロパティは 'sgd' または 'asgd' であり、LearnRate'decaying' となります。

データ型: char | string

適応型スケール不変ソルバーのオプション

このプロパティは読み取り専用です。

各学習サイクルでのバッチ内観測値のシャッフル フラグ。次の表の値として指定します。

説明
trueソフトウェアが、セットを処理する前に、データの各入力バッチ内の観測値をシャッフルします。このアクションにより、抽出スキームによって誘発されるバイアスが低減されます。
falseソフトウェアが、受信した順序でデータを処理します。

データ型: logical

パフォーマンス メトリクス パラメーター

このプロパティは読み取り専用です。

インクリメンタル モデルがパフォーマンス メトリクスを追跡するかどうかを示すフラグ。false または true として指定します。インクリメンタル モデル Mdl は、インクリメンタル近似関数が MetricsWarmupPeriod 個の観測値 (つまり、EstimationPeriod + MetricsWarmupPeriod 個の観測値) をインクリメンタル モデルにあてはめた後、"ウォーム" (IsWarmtrue となる) になります。

説明
trueインクリメンタル モデル Mdl がウォームです。この結果、updateMetrics および updateMetricsAndFitMdlMetrics プロパティのパフォーマンス メトリクスを追跡します。
falseupdateMetrics および updateMetricsAndFit はパフォーマンス メトリクスを追跡しません。

データ型: logical

このプロパティは読み取り専用です。

updateMetrics および updateMetricsAndFit によってインクリメンタル学習中に更新されたモデルのパフォーマンス メトリクス。m 行 2 列の table として指定します。ここで、m は、名前と値のペアの引数 'Metrics' によって指定されたメトリクスの数です。

Metrics の列には Cumulative および Window のラベルが付けられます。

  • Cumulative:要素 j は、メトリクス j で測定される、モデルがウォーム (IsWarm1) になった時点からの、モデルの性能です。

  • Window:要素 j は、メトリクス j で測定され、MetricsWindowSize プロパティで指定されたウィンドウ内のすべての観測値に対して評価される、モデルの性能です。ソフトウェアは MetricsWindowSize 個の観測値を処理した後、Window を更新します。

行には、指定したメトリクスのラベルが付けられます。詳細については、'Metrics' を参照してください。

データ型: table

このプロパティは読み取り専用です。

インクリメンタル モデルが Metrics プロパティのパフォーマンス メトリクスを追跡する前にあてはめなければならない観測値の数。非負の整数として指定します。

詳細は、IsWarmおよびパフォーマンス メトリクスを参照してください。

データ型: single | double

このプロパティは読み取り専用です。

ウィンドウ パフォーマンス メトリクスの計算に使用する観測値の数。正の整数として指定します。

パフォーマンス メトリクス オプションの詳細については、パフォーマンス メトリクスを参照してください。

データ型: single | double

オブジェクト関数

fitインクリメンタル学習モデルの学習
updateMetricsAndFit新しいデータにおけるインクリメンタル学習モデルのパフォーマンス メトリクスの更新とモデルの学習
updateMetrics新しいデータにおけるインクリメンタル学習モデルのパフォーマンス メトリクスの更新
lossデータのバッチでのインクリメンタル学習モデルの損失
predictインクリメンタル学習モデルからの新しい観測の応答予測

すべて折りたたむ

バイナリ分類用の既定のインクリメンタル線形 SVM モデルを作成します。

Mdl = incrementalClassificationLinear()
Mdl = 
  incrementalClassificationLinear

            IsWarm: 0
           Metrics: [1×2 table]
        ClassNames: [1×0 double]
    ScoreTransform: 'none'
              Beta: [0×1 double]
              Bias: 0
           Learner: 'svm'


  Properties, Methods

MdlincrementalClassificationLinear モデル オブジェクトです。そのプロパティはすべて読み取り専用です。

Mdl は、他の演算の実行に使用する前に、データにあてはめなければなりません。

人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。

load humanactivity
n = numel(actid);
rng(1); % For reproducibility
idx = randsample(n,n);
X = feat(idx,:);
Y = actid(idx);

データ セットの詳細については、コマンド ラインで Description を入力してください。

応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid > 2) を基準に、応答を二分します。

Y = Y > 2;

関数 updateMetricsAndfit を使用して、インクリメンタル モデルを学習データにあてはめます。50 個の観測値のチャンクを一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。

  • 50 個の観測値を処理。

  • 前のインクリメンタル モデルを、入力観測値にあてはめた新しいモデルで上書き。

  • 累積メトリクス β1、およびウィンドウ メトリクスを保存し、インクリメンタル学習中にそれらがどのように進化するかを確認。

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta1 = zeros(nchunk,1);    

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;    
    Mdl = updateMetricsAndFit(Mdl,X(idx,:),Y(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    beta1(j + 1) = Mdl.Beta(1);
end

IncrementalMdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationLinear モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetricsAndFit は入力観測値でのモデルの性能をチェックし、モデルをその観測値にあてはめます。

パフォーマンス メトリクスと β1 が学習中にどのように進化したかを確認するには、それらを別々のサブプロットにプロットします。

figure;
subplot(2,1,1)
plot(beta1)
ylabel('\beta_1')
xlim([0 nchunk]);
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
subplot(2,1,2)
h = plot(ce.Variables);
xlim([0 nchunk]);
ylabel('Classification Error')
xline(Mdl.EstimationPeriod/numObsPerChunk,'r-.');
xline((Mdl.EstimationPeriod + Mdl.MetricsWarmupPeriod)/numObsPerChunk,'g-.');
legend(h,ce.Properties.VariableNames)
xlabel('Iteration')

プロットは、updateMetricsAndFit が次を行うことを示しています。

  • β1 をインクリメンタル学習のすべての反復であてはめる

  • パフォーマンス メトリクスをメトリクスのウォームアップ期間後にのみ計算。

  • 累積メトリクスを各反復中に計算。

  • ウィンドウ メトリクスを 500 個の観測値の処理後に計算。

メトリクスのウォームアップ期間を指定して、インクリメンタル バイナリ SVM 学習器を準備します。その間、関数 updateMetricsAndFit はモデルのあてはめのみを行います。メトリクス ウィンドウ サイズを観測値 500 個に指定します。SGD を使用してモデルに学習させ、SGD バッチ サイズ、学習率、および正則化パラメーターを調整します。

人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。

load humanactivity
n = numel(actid);
idx = randsample(n,n);
X = feat(idx,:);
Y = actid(idx);

データ セットの詳細については、コマンド ラインで Description を入力してください。

応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid > 2) を基準に、応答を二分します。

Y = Y > 2;

バイナリ分類用のインクリメンタル線形モデルを作成します。次のようにモデルを構成します。

  • SGD ソルバーを指定。

  • リッジ正則化パラメーター値 0.001、SGD バッチ サイズ 20、および学習率 0.002 で、問題に対して十分に機能すると仮定。

  • メトリクスのウォームアップ期間を観測値 1000 個に指定。

  • メトリクス ウィンドウ サイズを観測値 500 個に指定。

  • 分類およびヒンジ エラー メトリクスを追跡して、モデルの性能を測定。

Mdl = incrementalClassificationLinear('Solver','sgd','Lambda',0.001,'BatchSize',20,...
    'LearnRate',0.002,'MetricsWarmupPeriod',1000,'MetricsWindowSize',500,...
    'Metrics',{'classiferror' 'hinge'})
Mdl = 
  incrementalClassificationLinear

            IsWarm: 0
           Metrics: [2×2 table]
        ClassNames: [1×0 double]
    ScoreTransform: 'none'
              Beta: [0×1 double]
              Bias: 0
           Learner: 'svm'


  Properties, Methods

Mdl はインクリメンタル学習用に構成された incrementalClassificationLinear モデル オブジェクトです。

関数 updateMetricsAndfit を使用して、インクリメンタル モデルを残りのデータにあてはめます。各反復で次を行います。

  • 50 個の観測値のチャンクを処理して、データ ストリームをシミュレート。チャンクのサイズと SGD バッチ サイズは異なることに注意してください。

  • 前のインクリメンタル モデルを、入力観測値にあてはめた新しいモデルで上書き。

  • 推定係数 β10、累積メトリクス、およびウィンドウ メトリクスを保存し、インクリメンタル学習中にそれらがどのように進化するかを確認。

% Preallocation
numObsPerChunk = 50;
nchunk = floor(n/numObsPerChunk);
ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
hinge = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta10 = zeros(nchunk,1);    

% Incremental fitting
for j = 1:nchunk
    ibegin = min(n,numObsPerChunk*(j-1) + 1);
    iend   = min(n,numObsPerChunk*j);
    idx = ibegin:iend;    
    Mdl = updateMetricsAndFit(Mdl,X(idx,:),Y(idx));
    ce{j,:} = Mdl.Metrics{"ClassificationError",:};
    hinge{j,:} = Mdl.Metrics{"HingeLoss",:};
    beta10(j + 1) = Mdl.Beta(10);
end

IncrementalMdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationLinear モデル オブジェクトです。インクリメンタル学習中およびモデルがウォームアップされた後、updateMetricsAndFit は入力観測値でのモデルの性能をチェックし、モデルをその観測値にあてはめます。

パフォーマンス メトリクスと β10 が学習中にどのように進化したかを確認するには、それらを別々のサブプロットにプロットします。

figure;
subplot(2,2,1)
plot(beta10)
ylabel('\beta_{10}')
xlim([0 nchunk]);
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
xlabel('Iteration')
subplot(2,2,2)
h = plot(ce.Variables);
xlim([0 nchunk]);
ylabel('Classification Error')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
legend(h,ce.Properties.VariableNames)
xlabel('Iteration')
subplot(2,2,3)
h = plot(hinge.Variables);
xlim([0 nchunk]);
ylabel('Hinge Loss')
xline(Mdl.MetricsWarmupPeriod/numObsPerChunk,'r-.');
legend(h,hinge.Properties.VariableNames)
xlabel('Iteration')

プロットは、updateMetricsAndFit が次を行うことを示しています。

  • β10 をインクリメンタル学習のすべての反復であてはめる

  • パフォーマンス メトリクスをメトリクスのウォームアップ期間後にのみ計算。

  • 累積メトリクスを各反復中に計算。

  • ウィンドウ メトリクスを 500 個の観測値の処理後に計算。

fitclinear を使用してバイナリ分類用の線形モデルに学習させ、それをインクリメンタル学習器に変換し、その性能を追跡し、ストリーミング データにあてはめます。学習オプションを従来式からインクリメンタル学習に引き継ぎます。

データの読み込みと前処理

人の行動のデータ セットを読み込みます。データをランダムにシャッフルします。予測子データの観測値を列に配置します。

load humanactivity
rng(1); % For reproducibility
n = numel(actid);
idx = randsample(n,n);
X = feat(idx,:)';
Y = actid(idx);

データ セットの詳細については、コマンド ラインで Description を入力してください。

応答は、次の 5 つのクラスのいずれかになります。座る、立つ、歩く、走る、または踊る。被験者が移動しているかどうか (actid > 2) を基準に、応答を二分します。

Y = Y > 2;

被験者が移動していない (Y = false) ときの収集データが、被験者が移動していたときのデータの倍の品質であると仮定します。静止している被験者から収集した観測値に 2 を割り当て、移動している被験者から収集した観測値に 1 を割り当てる重み変数を作成します。

W = ones(n,1) + ~Y;

バイナリ分類用の線形モデルの学習

バイナリ分類用の線形モデルを、データの半分から取った無作為標本にあてはめます。

idxtt = randsample([true false],n,true);
TTMdl = fitclinear(X(:,idxtt),Y(idxtt),'ObservationsIn','columns',...
    'Weights',W(idxtt))
TTMdl = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60×1 double]
              Bias: -0.1107
            Lambda: 8.2967e-05
           Learner: 'svm'


  Properties, Methods

TTMdl は、バイナリ分類用の従来式の学習済み線形モデルを表す ClassificationLinear モデル オブジェクトです。

学習済みモデルの変換

従来式の学習済み分類モデルを、インクリメンタル学習用のバイナリ分類線形モデルに変換します。

IncrementalMdl = incrementalLearner(TTMdl)
IncrementalMdl = 
  incrementalClassificationLinear

            IsWarm: 1
           Metrics: [1×2 table]
        ClassNames: [0 1]
    ScoreTransform: 'none'
              Beta: [60×1 double]
              Bias: -0.1107
           Learner: 'svm'


  Properties, Methods

パフォーマンス メトリクスの追跡とモデルのあてはめの個別の実行

関数 updateMetrics および fit を使用して、残りのデータに対してインクリメンタル学習を実行します。50 個の観測値を一度に処理して、データ ストリームをシミュレートします。各反復で次を行います。

  1. updateMetrics を呼び出し、観測値の入力チャンクを所与として、モデルの分類誤差の累積とウィンドウを更新します。前のインクリメンタル モデルを上書きして、Metrics プロパティ内の損失を更新します。関数がモデルをデータ チャンクにあてはめないことに注意してください。チャンクはモデルに対して "新しい" データです。観測値の向きを列方向に指定し、観測値の重みを指定します。

  2. fit を呼び出して、観測値の入力チャンクにモデルをあてはめます。前のインクリメンタル モデルを上書きして、モデル パラメーターを更新します。観測値の向きを列方向に指定し、観測値の重みを指定します。

  3. 分類誤差と推定された最初の係数 β1 を保存します。

% Preallocation
idxil = ~idxtt;
nil = sum(idxil);
numObsPerChunk = 50;
nchunk = floor(nil/numObsPerChunk);
ce = array2table(zeros(nchunk,2),'VariableNames',["Cumulative" "Window"]);
beta1 = [IncrementalMdl.Beta(1); zeros(nchunk,1)];
Xil = X(:,idxil);
Yil = Y(idxil);
Wil = W(idxil);

% Incremental fitting
for j = 1:nchunk
    ibegin = min(nil,numObsPerChunk*(j-1) + 1);
    iend   = min(nil,numObsPerChunk*j);
    idx = ibegin:iend;
    IncrementalMdl = updateMetrics(IncrementalMdl,Xil(:,idx),Yil(idx),...
        'ObservationsIn','columns','Weights',Wil(idx));
    ce{j,:} = IncrementalMdl.Metrics{"ClassificationError",:};
    IncrementalMdl = fit(IncrementalMdl,Xil(:,idx),Yil(idx),'ObservationsIn','columns',...
        'Weights',Wil(idx));
    beta1(j + 1) = IncrementalMdl.Beta(end);
end

IncrementalMdl は、ストリーム内のすべてのデータで学習させた incrementalClassificationLinear モデル オブジェクトです。

あるいは、updateMetricsAndFit を使用して、新しいデータ チャンクに対するモデルのパフォーマンス メトリクスを更新し、モデルをデータにあてはめることもできます。

パフォーマンス メトリクスと推定された係数 β1 のトレース プロットをプロットします。

figure;
subplot(2,1,1)
h = plot(ce.Variables);
xlim([0 nchunk]);
ylabel('Classification Error')
legend(h,ce.Properties.VariableNames)
subplot(2,1,2)
plot(beta1)
ylabel('\beta_1')
xlim([0 nchunk]);
xlabel('Iteration')

累積の損失は安定しており徐々に減少しますが、ウィンドウの損失は不連続です。

β1 はまず急激に変動した後、fit がより多くのチャンクを処理するにつれて徐々に平坦になります。

詳細

すべて展開する

アルゴリズム

すべて展開する

参照

[1] Kempka, Michał, Wojciech Kotłowski, and Manfred K. Warmuth. "Adaptive Scale-Invariant Online Algorithms for Learning Linear Models." CoRR (February 2019). https://arxiv.org/abs/1902.07528.

[2] Langford, J., L. Li, and T. Zhang. “Sparse Online Learning Via Truncated Gradient.” J. Mach. Learn. Res., Vol. 10, 2009, pp. 777–801.

[3] Shalev-Shwartz, S., Y. Singer, and N. Srebro. “Pegasos: Primal Estimated Sub-Gradient Solver for SVM.” Proceedings of the 24th International Conference on Machine Learning, ICML ’07, 2007, pp. 807–814.

[4] Xu, Wei. “Towards Optimal One Pass Large Scale Learning with Averaged Stochastic Gradient Descent.” CoRR, abs/1107.2490, 2011.

R2020b で導入