kfoldLoss
交差検証済みの線形回帰モデルの回帰損失
説明
例
次のモデルにより、10000 個の観測値をシミュレートします。
は、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');
CVMdl は RegressionPartitionedLinear モデルです。既定では、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');
CVMdl は RegressionPartitionedLinear モデルです。このモデルに含まれている Trained プロパティは、学習セットを使用して学習を行った RegressionLinear モデルが格納されている 10 行 1 列の cell 配列です。
次の Huber 損失 ( = 1) を評価する無名関数を作成します。
ここで
は観測値 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.4448
mseFold = kfoldLoss(CVMdl,'LossFun',huberloss,'Mode','individual')
mseFold = 10×1
-0.4454
-0.4473
-0.4453
-0.4469
-0.4434
-0.4434
-0.4465
-0.4430
-0.4438
-0.4426
最小二乗を使用する線形回帰モデルに適した LASSO ペナルティの強度を決定するため、5 分割の交差検証を実装します。
次のモデルにより、10000 個の観測値をシミュレートします。
は、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);~ の範囲で対数間隔で配置された 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
CVMdl は RegressionPartitionedLinear モデルです。fitrlinear は 5 分割の交差検証を実装するので、各分割について学習させる 5 つの RegressionLinear モデルが CVMdl に格納されます。
1 番目の学習済み線形回帰モデルを表示します。
Mdl1 = CVMdl.Trained{1}Mdl1 =
RegressionLinear
ResponseName: 'Y'
ResponseTransform: 'none'
Beta: [1000×15 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'
Properties, Methods
Mdl1 は RegressionLinear モデル オブジェクトです。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

予測子変数のスパース性と MSE の低さのバランスがとれている正則化強度 (Lambda(10) など) のインデックスを選択します。
idxFinal = 10;
最小の MSE に対応するモデルを抽出します。
MdlFinal = selectModels(Mdl,idxFinal)
MdlFinal =
RegressionLinear
ResponseName: 'Y'
ResponseTransform: 'none'
Beta: [1000×1 double]
Bias: -0.0050
Lambda: 0.0037
Learner: 'leastsquares'
Properties, Methods
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 は、データをシミュレートした係数に近くなっています。
入力引数
交差検証済み線形回帰モデル。RegressionPartitionedLinear モデル オブジェクトとして指定します。RegressionPartitionedLinear モデルを作成するには、fitrlinear を使用し、交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal など) を指定します。
推定値を取得するため、kfoldLoss は線形回帰モデルの交差検証に使用したものと同じデータ (X および Y) を適用します。
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。
例: kfoldLoss(CVMdl,Folds=[1 2 3 5]) は、回帰損失の計算に 1 番目、2 番目、3 番目、および 5 番目の分割を使用し、4 番目の分割は除外するように指定します。
応答の予測に使用する分割のインデックス。正の整数の数値ベクトルとして指定します。Folds の要素は 1 から CVMdl.KFold の範囲でなければなりません。
例: Folds=[1 4 10]
データ型: single | double
損失関数。組み込みの損失関数名または関数ハンドルとして指定します。
次の表は、使用可能な損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。また、この表では です。
β は p 個の係数のベクトルです。
x は p 個の予測子変数による観測値です。
b はスカラー バイアスです。
値 説明 "epsiloninsensitive"イプシロン不感応損失: "mse"MSE: "epsiloninsensitive"は SVM 学習器のみに適しています。関数ハンドル表記を使用して独自の関数を指定します。
nをXの観測値数とします。使用する関数のシグネチャは次のようになっていなければなりません。ここでlossvalue =lossfun(Y,Yhat,W)出力引数
lossvalueはスカラーです。関数名 (
lossfun) を選択します。Yは観測された応答のn次元ベクトルです。kfoldLossには入力引数YでYを渡します。Yhatは予測された応答のn次元ベクトルです。これはpredictの出力と同様です。Wは、観測値の重みのn行 1 列の数値ベクトルです。
LossFun=@を使用して独自の関数を指定します。lossfun
例: LossFun="epsiloninsensitive"
データ型: char | string | function_handle
損失の集約レベル。"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を使用する交差検証済みモデルのすべての分割に対する平均回帰損失です。それ以外の場合、
LはF行R列の行列になります。L(は、正則化強度i,j)jを使用する交差検証済みモデルの分割iに対する回帰損失です。
拡張機能
この関数は、GPU 配列を完全にサポートします。詳細は、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2016a で導入kfoldLoss は GPU 配列を完全にサポートします。
R2023b 以降で損失を予測または計算する際、一部の回帰モデルでは、予測子に欠損値がある観測値について予測した応答値を指定できます。名前と値の引数 PredictionForMissingValue を指定して、予測値として数値スカラー、学習セットの中央値、または学習セットの平均値を使用します。損失を計算するときに、予測子に欠損値がある観測値を省略するように指定することもできます。
次の表は、名前と値の引数 PredictionForMissingValue をサポートするオブジェクト関数の一覧です。既定では、これらの関数は、予測子に欠損値がある観測値について予測した応答値として、学習セットの中央値を使用します。
| モデル タイプ | モデル オブジェクト | オブジェクト関数 |
|---|---|---|
| ガウス過程回帰 (GPR) モデル | RegressionGP, CompactRegressionGP | loss, predict, resubLoss, resubPredict |
RegressionPartitionedGP | kfoldLoss, kfoldPredict | |
| ガウス カーネル回帰モデル | RegressionKernel | loss, predict |
RegressionPartitionedKernel | kfoldLoss, kfoldPredict | |
| 線形回帰モデル | RegressionLinear | loss, predict |
RegressionPartitionedLinear | kfoldLoss, kfoldPredict | |
| ニューラル ネットワーク回帰モデル | RegressionNeuralNetwork, CompactRegressionNeuralNetwork | loss, predict, resubLoss, resubPredict |
RegressionPartitionedNeuralNetwork | kfoldLoss, kfoldPredict | |
| サポート ベクター マシン (SVM) 回帰モデル | RegressionSVM, CompactRegressionSVM | loss, predict, resubLoss, resubPredict |
RegressionPartitionedSVM | kfoldLoss, kfoldPredict |
以前のリリースでは、上記の回帰モデル関数 loss および predict は、予測子に欠損値がある観測値について予測した応答値として NaN を使用していました。予測子に欠損値がある観測値は、予測と損失の再代入 ("resub") と交差検証 ("kfold") の計算で省略されていました。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)