Main Content

RegressionPartitionedLinear

名前空間: classreg.learning.partition
スーパークラス: RegressionPartitionedModel

高次元データ用の交差検証済み線形回帰モデル

説明

RegressionPartitionedLinear は、交差検証分割で学習を行った一連の線形回帰モデルです。交差検証済みの線形回帰モデルを取得するには、fitrlinear を使用して交差検証オプションのいずれかを指定します。モデルの予測品質や、線形回帰モデルがどの程度一般化を行うかは、kfold メソッド kfoldPredict および kfoldLoss を 1 つ以上使用して評価できます。

すべての "kfold" メソッドでは、学習用データの観測値で学習したモデルを使用して、学習用データにはない観測値に対する応答を予測します。たとえば、データを 5 つに分割して交差検証を行うとします。この場合、各観測値は 5 つのほぼ等しいサイズのグループに無作為に割り当てられます。"学習用分割" にはグループのうち 4 つ (すなわち、データの約 4/5) が含まれ、"テスト用分割" には残りのグループ (すなわち、データの約 1/5) が含まれます。この場合、交差検証は次のように処理されます。

  1. CVMdl.Trained{1} に保存されている最初のモデルは、後の 4 グループの観測値によって学習され、最初のグループの観測値を検証用に保存します。

  2. 1 番目のグループと最後の 3 つのグループの観測値を使用して 2 番目のモデル (CVMdl.Trained{2} に格納) に学習させます。2 番目のグループの観測値は、検証用に予約されます。

  3. 3 ~ 5 番目のモデルについて同様の処理が行われます。

kfoldPredict を呼び出して検証する場合、最初のモデルを使用してグループ 1 の観測に対する予測が計算され、2 番目のモデルにはグループ 2 が計算され、以降同様です。つまり、それぞれの観測値に対する応答は、その観測値ではなく学習したモデルによって推定されます。

メモ

他の交差検証済み回帰モデルと異なり、RegressionPartitionedLinear モデル オブジェクトに予測子データ セットは格納されません。

構築

CVMdl = fitrlinear(X,Y,Name,Value) は、Name'CrossVal''CVPartition''Holdout''KFold' のいずれかである場合に、交差検証済みの線形回帰モデルを作成します。詳細は、fitrlinearを参照してください。

プロパティ

すべて展開する

交差検証のプロパティ

交差検証済みモデルの名前。文字ベクトルを指定します。

たとえば、'Linear' はバイナリ分類または回帰について交差検証済みの線形モデルを指定します。

データ型: char

交差検証された分割の数。正の整数で指定します。

データ型: double

交差検証のパラメーター値 (線形モデルの交差検証に使用する名前と値のペアの引数など)。オブジェクトを指定します。推定したパラメーターは ModelParameters に格納されません。

ModelParameters のプロパティにはドット表記でアクセスします。

学習データに含まれている観測値の数。正の数値スカラーを指定します。

データ型: double

データを交差検証分割に分割する方法を含むデータ分割。cvpartition モデルとして指定します。

交差検証分割で学習を行った線形回帰モデル。RegressionLinear モデルの cell 配列として指定します。Trained には k 個のセルがあります。k は分割数です。

データ型: cell

モデルの交差検証に使用した観測値の重み。数値ベクトルを指定します。W には NumObservations 個の要素があります。

学習に使用する重みは正規化され sum(W,'omitnan')1 になります。

データ型: single | double

モデルの交差検証に使用する観測応答。NumObservations 個の要素が格納されている数値ベクトルを指定します。

Y の各行は、予測子データ内の対応する観測値の観測応答を表します。

データ型: single | double

他の回帰のプロパティ

カテゴリカル予測子のインデックス。正の整数のベクトルとして指定します。CategoricalPredictors には、対応する予測子がカテゴリカルであることを示すインデックス値が格納されます。インデックス値の範囲は 1 ~ p です。p はモデルの学習に使用した予測子の数です。どの予測子もカテゴリカルではない場合、このプロパティは空 ([]) になります。

データ型: single | double

予測子データに現れる順序で並んでいる予測子名。文字ベクトルの cell 配列として指定します。PredictorNames の長さは、予測子変数として使用される学習データ X または Tbl に含まれている変数の数と等しくなります。

データ型: cell

応答変数名。文字ベクトルを指定します。

データ型: char

応答変換関数。'none' または関数ハンドルを指定します。ResponseTransform は、生の応答値を変換する方法を表します。

MATLAB® 関数やユーザー定義関数の場合は、関数ハンドルを入力します。たとえば、Mdl.ResponseTransform = @function を入力できます。ここで function は、元の応答の数値ベクトルを受け入れ、変換した応答が格納されている同じサイズの数値ベクトルを返します。

データ型: char | function_handle

メソッド

kfoldLoss学習で使用しない観測値の回帰損失
kfoldPredict学習で使用しない観測の予測応答

コピーのセマンティクス

値。値のクラスがコピー操作に与える影響については、オブジェクトのコピーを参照してください。

すべて折りたたむ

次のモデルにより、10000 個の観測値をシミュレートします。

y=x100+2x200+e.

  • X={x1,...,x1000} は、10% の要素が非ゼロ標準正規である 10000 行 1000 列のスパース行列です。

  • e は、平均が 0、標準偏差が 0.3 のランダムな正規誤差です。

rng(1) % For reproducibility
n = 1e4;
d = 1e3;
nz = 0.1;
X = sprandn(n,d,nz);
Y = X(:,100) + 2*X(:,200) + 0.3*randn(n,1);

線形回帰モデルを交差検証します。実行速度を向上させるため、予測子データを転置し、観測値が列単位であることを指定します。

X = X';
CVMdl = fitrlinear(X,Y,'CrossVal','on','ObservationsIn','columns');

CVMdl は、RegressionPartitionedLinear 交差検証済みモデルです。既定の設定では fitrlinear は 10 分割の交差検証を実装するので、CVMdl.Trained には 10 個の RegressionLinear モデルの cell ベクトルが格納されます。各セルには、9 つの分割で学習を行い残りの分割でテストを行った線形回帰モデルが格納されます。

CVMdlkfoldPredict に渡して分割外観測値の応答を予測し、kfoldLoss に渡して汎化誤差を推定します。

oofYHat = kfoldPredict(CVMdl);
ge = kfoldLoss(CVMdl)
ge = 0.1748

推定された汎化平均二乗誤差は 0.1748 です。

最小二乗を使用する線形回帰モデルに適した LASSO ペナルティの強度を決定するため、5 分割の交差検証を実装します。

次のモデルにより、10000 個の観測値をシミュレートします。

y=x100+2x200+e.

  • X={x1,...,x1000} は、10% の要素が非ゼロ標準正規である 10000 行 1000 列のスパース行列です。

  • e は、平均が 0、標準偏差が 0.3 のランダムな正規誤差です。

rng(1) % For reproducibility
n = 1e4;
d = 1e3;
nz = 0.1;
X = sprandn(n,d,nz);
Y = X(:,100) + 2*X(:,200) + 0.3*randn(n,1);

10-510-1 の範囲で対数間隔で配置された 15 個の正則化強度を作成します。

Lambda = logspace(-5,-1,15);

モデルを交差検証します。実行速度を向上させるため、予測子データを転置し、観測値が列単位であることを指定します。SpaRSA を使用して目的関数を最適化します。

X = X'; 
CVMdl = fitrlinear(X,Y,'ObservationsIn','columns','KFold',5,'Lambda',Lambda,...
    'Learner','leastsquares','Solver','sparsa','Regularization','lasso');

numCLModels = numel(CVMdl.Trained)
numCLModels = 5

CVMdlRegressionPartitionedLinear モデルです。fitrlinear は 5 分割の交差検証を実装するので、各分割について学習させる 5 つの RegressionLinear モデルが CVMdl に格納されます。

1 番目の学習済み線形回帰モデルを表示します。

Mdl1 = CVMdl.Trained{1}
Mdl1 = 
  RegressionLinear
         ResponseName: 'Y'
    ResponseTransform: 'none'
                 Beta: [1000x15 double]
                 Bias: [-0.0049 -0.0049 -0.0049 -0.0049 -0.0049 -0.0048 -0.0044 -0.0037 -0.0030 -0.0031 -0.0033 -0.0036 -0.0041 -0.0051 -0.0071]
               Lambda: [1.0000e-05 1.9307e-05 3.7276e-05 7.1969e-05 1.3895e-04 2.6827e-04 5.1795e-04 1.0000e-03 0.0019 0.0037 0.0072 0.0139 0.0268 0.0518 0.1000]
              Learner: 'leastsquares'


Mdl1RegressionLinear モデル オブジェクトです。fitrlinear は最初の 4 つの分割に対して学習を行うことにより Mdl1 を構築しました。Lambda は正則化強度のシーケンスなので、Mdl1 はそれぞれが Lambda の各正則化強度に対応する 15 個のモデルであると考えることができます。

交差検証された MSE を推定します。

mse = kfoldLoss(CVMdl);

Lambda の値が大きくなると、予測子変数がスパースになります。これは回帰モデルの品質として優れています。データ セット全体を使用し、モデルの交差検証を行ったときと同じオプションを指定して、各正則化強度について線形回帰モデルに学習をさせます。モデルごとに非ゼロの係数を特定します。

Mdl = fitrlinear(X,Y,'ObservationsIn','columns','Lambda',Lambda,...
    'Learner','leastsquares','Solver','sparsa','Regularization','lasso');
numNZCoeff = sum(Mdl.Beta~=0);

同じ図に、各正則化強度についての交差検証された MSE と非ゼロ係数の頻度をプロットします。すべての変数を対数スケールでプロットします。

figure
[h,hL1,hL2] = plotyy(log10(Lambda),log10(mse),...
    log10(Lambda),log10(numNZCoeff)); 
hL1.Marker = 'o';
hL2.Marker = 'o';
ylabel(h(1),'log_{10} MSE')
ylabel(h(2),'log_{10} nonzero-coefficient frequency')
xlabel('log_{10} Lambda')
hold off

Figure contains 2 axes objects. Axes object 1 with xlabel log_{10} Lambda, ylabel log_{10} MSE contains an object of type line. Axes object 2 with ylabel log_{10} nonzero-coefficient frequency contains an object of type line.

予測子変数のスパース性と MSE の低さのバランスがとれている正則化強度 (Lambda(10) など) のインデックスを選択します。

idxFinal = 10;

最小の MSE に対応するモデルを抽出します。

MdlFinal = selectModels(Mdl,idxFinal)
MdlFinal = 
  RegressionLinear
         ResponseName: 'Y'
    ResponseTransform: 'none'
                 Beta: [1000x1 double]
                 Bias: -0.0050
               Lambda: 0.0037
              Learner: 'leastsquares'


idxNZCoeff = find(MdlFinal.Beta~=0)
idxNZCoeff = 2×1

   100
   200

EstCoeff = Mdl.Beta(idxNZCoeff)
EstCoeff = 2×1

    1.0051
    1.9965

MdlFinal は、1 つの正則化強度がある RegressionLinear モデルです。非ゼロ係数 EstCoeff は、データをシミュレートした係数に近くなっています。

拡張機能

バージョン履歴

R2016a で導入

すべて展開する