Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

kfoldLoss

学習で使用しない観測値の回帰損失

説明

L = kfoldLoss(CVMdl) は、交差検証済みの線形回帰モデル CVMdl によって取得した交差検証平均二乗誤差 (MSE) を返します。つまり、他のすべての観測値を使用して学習を行うときにホールドアウトする観測値の回帰損失を、kfoldLoss はすべての分割について推定します。

L には、CVMdl を構成する線形回帰モデルの各正則化強度に対する回帰損失が格納されます。

L = kfoldLoss(CVMdl,Name,Value) は、1 つ以上の Name,Value 引数のペアによって指定された追加オプションを使用します。たとえば、損失の計算に使用する分割や回帰損失関数を指定します。

入力引数

すべて展開する

交差検証済み線形回帰モデル。RegressionPartitionedLinear モデル オブジェクトとして指定します。RegressionPartitionedLinear モデルを作成するには、fitrlinear を使用し、交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal など) を指定します。

推定値を取得するため、kfoldLoss は線形回帰モデルの交差検証に使用したものと同じデータ (X および Y) を適用します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

応答の予測に使用する分割のインデックス。'Folds' と正の整数の数値ベクトルから構成されるコンマ区切りのペアとして指定します。Folds の要素は 1 から CVMdl.KFold の範囲でなければなりません。

例: 'Folds',[1 4 10]

データ型: single | double

損失関数。'LossFun' と組み込み損失関数名または関数ハンドルから構成されるコンマ区切りのペアとして指定します。

  • 次の表は、使用可能な損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。また、この表では f(x)=xβ+b. です。

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

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

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

    説明
    'epsiloninsensitive'イプシロン不感応損失: [y,f(x)]=max[0,|yf(x)|ε]
    'mse'MSE: [y,f(x)]=[yf(x)]2

    'epsiloninsensitive' は SVM 学習器のみに適しています。

  • 関数ハンドル表記を使用して独自の関数を指定します。

    nX の観測値数とします。使用する関数のシグネチャは次のようになっていなければなりません。

    lossvalue = lossfun(Y,Yhat,W)
    ここで、

    • 出力引数 lossvalue はスカラーです。

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

    • Y は観測された応答の n 次元ベクトルです。kfoldLoss には入力引数 YY を渡します。

    • Yhat は予測された応答の n 次元ベクトルです。これは predict の出力と同様です。

    • W は、観測値の重みの n 行 1 列の数値ベクトルです。

    'LossFun',@lossfun を使用して独自の関数を指定します。

データ型: char | string | function_handle

損失の集約レベル。'Mode''average' または 'individual' から構成されるコンマ区切りのペアとして指定します。

説明
'average'分割全体で平均した損失を返す
'individual'各分割について損失を返す

例: 'Mode','individual'

R2023b 以降

予測子に欠損値がある観測値に使用する予測した応答値。"median""mean""omitted"、または数値スカラーとして指定します。

説明
"median"kfoldLoss は、予測子に欠損値がある観測値について予測した応答値として、学習分割データ内の観測された応答値の中央値を使用します。
"mean"kfoldLoss は、予測子に欠損値がある観測値について予測した応答値として、学習分割データ内の観測された応答値の平均値を使用します。
"omitted"kfoldLoss は、予測子に欠損値がある観測値を損失の計算から除外します。
数値スカラーkfoldLoss は、予測子に欠損値がある観測値について予測した応答値として、この値を使用します。

すべての予測子の値、観測された応答値、または観測値の重みが観測値にない場合、その観測値は kfoldLoss での損失の計算に使用されません。

例: "PredictionForMissingValue","omitted"

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

出力引数

すべて展開する

交差検証回帰損失。数値スカラー、ベクトルまたは行列として返されます。L の解釈は LossFun によって異なります。

交差検証済みモデルの正則化強度の数 (numel(CVMdl.Trained{1}.Lambda) に格納) を R、分割数 (CVMdl.KFold に格納) を F とします。

  • Mode'average' の場合、L は 1 行 R 列のベクトルになります。L(j) は、正則化強度 j を使用する交差検証済みモデルのすべての分割に対する平均回帰損失です。

  • それ以外の場合、LFR 列の行列になります。L(i,j) は、正則化強度 j を使用する交差検証済みモデルの分割 i に対する回帰損失です。

kfoldLossL を推定するため、CVMdl を作成したデータを使用します (XY を参照)。

すべて展開する

次のモデルにより、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);

SVM 学習器を使用する線形回帰モデルを交差検証します。

rng(1); % For reproducibility 
CVMdl = fitrlinear(X,Y,'CrossVal','on');

CVMdlRegressionPartitionedLinear モデルです。既定では、10 分割交差検証が実行されます。'KFold' 名前と値のペアの引数を使用して分割数を変更できます。

テスト標本の MSE の平均を推定します。

mse = kfoldLoss(CVMdl)
mse = 0.1735

または、名前と値のペアの引数 'Mode','individual'kfoldLoss で指定することにより、分割ごとの MSE を取得できます。

k 分割平均二乗誤差の推定で説明されているようにデータをシミュレートします。

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'; % Put observations in columns for faster training 

10 分割の交差検証を使用して線形回帰モデルを交差検証します。SpaRSA を使用して目的関数を最適化します。

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

CVMdlRegressionPartitionedLinear モデルです。このモデルに含まれている Trained プロパティは、学習セットを使用して学習を行った RegressionLinear モデルが格納されている 10 行 1 列の cell 配列です。

次の Huber 損失 (δ = 1) を評価する無名関数を作成します。

L=1wjj=1nwjj,

ここで

j={0.5ejˆ2;|ejˆ|-0.5;|ejˆ|1|ejˆ|>1.

ejˆ は観測値 j の残差です。カスタム損失関数は特定の形式で記述しなければなりません。カスタム損失関数の記述に関するルールについては、名前と値のペアの引数 'LossFun' を参照してください。

huberloss = @(Y,Yhat,W)sum(W.*((0.5*(abs(Y-Yhat)<=1).*(Y-Yhat).^2) + ...
    ((abs(Y-Yhat)>1).*abs(Y-Yhat)-0.5)))/sum(W);

分割全体に対する平均の Huber 損失を推定します。また、各分割の Huber 損失も取得します。

mseAve = kfoldLoss(CVMdl,'LossFun',huberloss)
mseAve = -0.4447
mseFold = kfoldLoss(CVMdl,'LossFun',huberloss,'Mode','individual')
mseFold = 10×1

   -0.4454
   -0.4473
   -0.4452
   -0.4469
   -0.4434
   -0.4427
   -0.4471
   -0.4430
   -0.4438
   -0.4426

最小二乗を使用する線形回帰モデルに適した 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 で導入

すべて展開する