ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

selectModels

クラス: RegressionLinear

近似済み正則化線形回帰モデルの選択

説明

SubMdl = selectModels(Mdl,idx) は、さまざまな正則化強度を使用して学習を行った一連の線形回帰モデル (Mdl) から、学習済み線形回帰モデルのサブセットを返します。インデックス idxMdl.Lambda の正則化強度に対応し、どのモデルを返すかを指定します。

入力引数

すべて展開する

さまざまな正則化強度を使用して学習を行った線形回帰モデル。RegressionLinear モデル オブジェクトを指定します。RegressionLinear モデル オブジェクトは、fitrlinear を使用して作成できます。

Mdl は 1 つのモデル オブジェクトですが、numel(Mdl.Lambda) = L ≥ 2 の場合、Mdl は L 個の学習済みモデルであると考えることができます。

正則化強度に対応するインデックス。正の整数の数値ベクトルを指定します。idx の値は [1,L] の範囲になければなりません。L = numel(Mdl.Lambda) です。

データ型: double | single

出力引数

すべて展開する

さまざまな正則化強度を使用して学習を行った線形回帰モデルのサブセット。RegressionLinear モデル オブジェクトとして返されます。

すべて展開する

次のモデルにより、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-410-1 の範囲で対数間隔で配置された 15 個の正則化強度を作成します。

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

データの 30% を検定用にホールドアウトします。検定標本のインデックスを識別します。

cvp = cvpartition(numel(Y),'Holdout',0.30);
idxTest = test(cvp);

Lambda 内の強度による LASSO ペナルティを使用して、線形回帰モデルに学習をさせます。正則化強度、目的関数を最適化するための SpaRSA の使用、およびデータ分割を指定します。実行速度を向上させるため、予測子データを転置し、観測値が列単位であることを指定します。

X = X'; 
CVMdl = fitrlinear(X,Y,'ObservationsIn','columns','Lambda',Lambda,...
    'Solver','sparsa','Regularization','lasso','CVPartition',cvp);
Mdl1 = CVMdl.Trained{1};
numel(Mdl1.Lambda)
ans = 15

Mdl1RegressionLinear モデルです。Lambda は正則化強度の 15 次元ベクトルなので、Mdl1 はそれぞれが正則化強度に対応する 15 個の学習済みモデルであると考えることができます。

各正則化モデルについて検定標本の平均二乗誤差を推定します。

mse = loss(Mdl1,X(:,idxTest),Y(idxTest),'ObservationsIn','columns');

Lambda の値が大きくなると、予測子変数がスパースになります。これは回帰モデルの品質として優れています。データセット全体と、以前に使用した、データ分割指定以外のすべてのオプションを使用して、モデルに再学習をさせます。モデルごとに非ゼロの係数を特定します。

Mdl = fitrlinear(X,Y,'ObservationsIn','columns','Lambda',Lambda,...
    '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

最小分類誤差と予測子変数のスパース性のバランスがとれている Lambda のインデックス (Lambda(11) など) を選択します。

idx = 11;
MdlFinal = selectModels(Mdl,idx);

MdlFinal は、正則化強度として Lambda(11) を使用する学習済みの RegressionLinear モデル オブジェクトです。

ヒント

複数の線形回帰予測モデルを作成する方法の 1 つに、次のようなものがあります。

  1. データの一部を検定用にホールドアウトします。

  2. fitrlinear を使用して線形回帰モデルに学習をさせます。名前と値のペアの引数 'Lambda' を使用して正則化強度のグリッドを指定し、学習データを与えます。fitrlinear は 1 つの RegressionLinear モデル オブジェクトを返しますが、これには各正則化強度に対するモデルが含まれています。

  3. 各正則化モデルの品質を判断するため、返されたモデル オブジェクトとホールドアウトされたデータを loss などに渡します。

  4. 満足できる正則化モデルのサブセットのインデックス (idx) を識別し、返されたモデルとインデックスを selectModels に渡します。selectModels は 1 つの RegressionLinear モデル オブジェクトを返しますが、これには numel(idx) 個の正則化モデルが含まれています。

  5. 新しいデータのクラス ラベルを予測するため、データと正則化モデルのサブセットを predict に渡します。

R2016a で導入