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 = x 1 0 0 + 2 x 2 0 0 + e .

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

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

rng(1)% For reproducibilityn = 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 = x 1 0 0 + 2 x 2 0 0 + e .

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

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

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

1 0 - 5 1 0 - 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 ... ] Lambda: [1.0000e-05 1.9307e-05 3.7276e-05 7.1969e-05 ... ] Learner: 'leastsquares' Properties, Methods

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') holdoff

Figure contains 2 axes objects. Axes object 1 contains an object of type line. Axes object 2 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' Properties, Methods
idxNZCoeff = find(MdlFinal.Beta~=0)
idxNZCoeff =2×1100 200
EstCoeff = Mdl.Beta(idxNZCoeff)
EstCoeff =2×11.0051 1.9965

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

バージョン履歴

R2016a で導入