Main Content

loss

ガウス カーネル回帰モデルの回帰損失

説明

L = loss(Mdl,X,Y) は、X 内の予測子データと Y 内の対応する応答を使用して、ガウス カーネル回帰モデル Mdl の平均二乗誤差 (MSE) を返します。

L = loss(Mdl,Tbl,ResponseVarName) は、Tbl 内の予測子データと Tbl.ResponseVarName 内の真の応答を使用して、モデル Mdl の MSE を返します。

L = loss(Mdl,Tbl,Y) は、table Tbl 内の予測子データと Y 内の真の応答を使用して、モデル Mdl の MSE を返します。

L = loss(___,Name,Value) では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、回帰損失関数と観測値の重みを指定できます。この場合、loss は指定された損失関数を使用して加重回帰損失を返します。

すべて折りたたむ

tall 配列についてガウス カーネル回帰モデルに学習をさせ、再代入平均二乗誤差とイプシロン不感応誤差を計算します。

tall 配列に対する計算を実行する場合、MATLAB® は並列プール (Parallel Computing Toolbox™ がある場合は既定) またはローカルの MATLAB セッションを使用します。Parallel Computing Toolbox がある場合にローカルの MATLAB セッションを使用して例を実行するには、関数 mapreducer を使用してグローバルな実行環境を変更します。

mapreducer(0)

データがあるフォルダーの場所を参照するデータストアを作成します。データは、単一のファイル、ファイルの集まり、またはフォルダー全体のどれに含まれていてもかまいません。datastore によって NaN 値に置き換えられるようにするため、'NA' 値を欠損データとして扱います。使用する変数のサブセットを選択します。データストアの先頭に tall table を作成します。

varnames = {'ArrTime','DepTime','ActualElapsedTime'};
ds = datastore('airlinesmall.csv','TreatAsMissing','NA',...
    'SelectedVariableNames',varnames);
t = tall(ds);

予測子変数 (X) として DepTimeArrTime を、応答変数 (Y) として ActualElapsedTime を指定します。ArrTimeDepTime より遅い観測値を選択します。

daytime = t.ArrTime>t.DepTime;
Y = t.ActualElapsedTime(daytime);     % Response data
X = t{daytime,{'DepTime' 'ArrTime'}}; % Predictor data

予測子変数を標準化します。

Z = zscore(X); % Standardize the data

標準化された予測子を使用して、既定のガウス カーネル回帰モデルに学習をさせます。'Verbose',0 を設定して、診断メッセージを非表示にします。

[Mdl,FitInfo] = fitrkernel(Z,Y,'Verbose',0)
Mdl = 
  RegressionKernel
              ResponseName: 'Y'
                   Learner: 'svm'
    NumExpansionDimensions: 64
               KernelScale: 1
                    Lambda: 8.5385e-06
             BoxConstraint: 1
                   Epsilon: 5.9303


FitInfo = struct with fields:
                  Solver: 'LBFGS-tall'
            LossFunction: 'epsiloninsensitive'
                  Lambda: 8.5385e-06
           BetaTolerance: 1.0000e-03
       GradientTolerance: 1.0000e-05
          ObjectiveValue: 26.1409
       GradientMagnitude: 0.0023
    RelativeChangeInBeta: 0.0150
                 FitTime: 32.5816
                 History: []

Mdl は学習済みの RegressionKernel モデルです。構造体配列 FitInfo には最適化の詳細が格納されます。

再代入平均二乗誤差とイプシロン不感応誤差を推定することにより、学習済みのモデルが新しい予測子の値に対してどの程度一般化されているかを調べます。

lossMSE = loss(Mdl,Z,Y) % Resubstitution mean squared error
lossMSE =

  MxNx... tall array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :
lossEI = loss(Mdl,Z,Y,'LossFun','epsiloninsensitive') % Resubstitution epsilon-insensitive error
lossEI =

  MxNx... tall array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

tall 配列を評価し、gather を使用して結果をメモリに格納します。

[lossMSE,lossEI] = gather(lossMSE,lossEI)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1.7 sec
Evaluation completed in 2 sec
lossMSE = 2.5141e+03
lossEI = 25.5148

ガウス カーネル回帰モデルのカスタム回帰損失 (Huber 損失) を指定します。

carbig データ セットを読み込みます。

load carbig

予測子変数 (X) と応答変数 (Y) を指定します。

X = [Weight,Cylinders,Horsepower,Model_Year];
Y = MPG;

配列 X および Y から、それぞれの配列で NaN 値が含まれている行を削除します。NaN 値が含まれている行を削除してからデータを fitrkernel に渡すと、学習が高速化され、メモリ使用量が少なくなります。

R = rmmissing([X Y]); 
X = R(:,1:4); 
Y = R(:,end); 

観測値の 10% をホールドアウト標本として予約します。学習インデックスとテスト インデックスを分割の定義から抽出します。

rng(10)  % For reproducibility
N = length(Y);
cvp = cvpartition(N,'Holdout',0.1);
idxTrn = training(cvp); % Training set indices
idxTest = test(cvp);    % Test set indices

カーネル回帰モデルに学習させます。学習データを標準化します。

Xtrain = X(idxTrn,:);
Ytrain = Y(idxTrn);
Mdl = fitrkernel(Xtrain,Ytrain,'Standardize',true)
Mdl = 
  RegressionKernel
              ResponseName: 'Y'
                   Learner: 'svm'
    NumExpansionDimensions: 128
               KernelScale: 1
                    Lambda: 0.0028
             BoxConstraint: 1
                   Epsilon: 0.8617


MdlRegressionKernel モデルです。

次の 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 損失関数を使用して、学習セットの回帰損失を推定します。

eTrain = loss(Mdl,Xtrain,Ytrain,'LossFun',huberloss)
eTrain = 1.7210

Huber 損失関数を使用して、テスト セットの回帰損失を推定します。

Xtest = X(idxTest,:);
Ytest = Y(idxTest);

eTest = loss(Mdl,Xtest,Ytest,'LossFun',huberloss)
eTest = 1.3062

入力引数

すべて折りたたむ

カーネル回帰モデル。RegressionKernel モデル オブジェクトを指定します。RegressionKernel モデル オブジェクトは、fitrkernel を使用して作成できます。

予測子データ。n 行 p 列の数値行列を指定します。n は観測値の個数、p は予測子の個数です。p は、Mdl の学習に使用した予測子の個数と同じでなければなりません。

データ型: single | double

応答データ。n 次元の数値ベクトルを指定します。Y の長さは X または Tbl の観測値の数と等しくなければなりません。

データ型: single | double

モデルを学習させるために使用する標本データ。テーブルとして指定します。Tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。必要に応じて、応答変数用および観測値の重み用の追加列を Tbl に含めることができます。Tbl には、Mdl を学習させるために使用したすべての予測子が含まれていなければなりません。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。

Mdl を学習させるために使用した応答変数が Tbl に含まれている場合、ResponseVarName または Y を指定する必要はありません。

テーブルに格納されている標本データを使用して Mdl の学習を行った場合、loss の入力データもテーブルに格納されていなければなりません。

応答変数の名前。Tbl 内の変数の名前で指定します。応答変数は、数値ベクトルでなければなりません。Mdl を学習させるために使用した応答変数が Tbl に含まれている場合、ResponseVarName を指定する必要はありません。

ResponseVarName を指定する場合は、文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数が Tbl.Y として格納されている場合、ResponseVarName として 'Y' を指定します。それ以外の場合、Tbl の列は Tbl.Y を含めてすべて予測子として扱われます。

データ型: char | string

名前と値の引数

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

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

例: L = loss(Mdl,X,Y,'LossFun','epsiloninsensitive','Weights',weights) は、イプシロン不感応損失関数を使用して加重回帰損失を返します。

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

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

    • x は p 個の予測子変数による観測値 (行ベクトル) です。

    • T(·) は特徴量を拡張するための観測値 (行ベクトル) の変換です。T(x)p の x を高次元空間 (m) にマッピングします。

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

    • 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 次元ベクトルです。loss には入力引数 YY を渡します。

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

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

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

データ型: char | string | function_handle

R2023b 以降

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

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

観測された応答値または観測値の重みが観測値にない場合、その観測値は loss による損失の計算に使用されません。

例: "PredictionForMissingValue","omitted"

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

観測値の重み。'Weights' と数値ベクトル、または Tbl に含まれる変数の名前から構成されるコンマ区切りのペアとして指定します。

  • Weights が数値ベクトルである場合、Weights のサイズは X または Tbl の行数と等しくなければなりません。

  • WeightsTbl 内の変数名である場合、Weights を文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、重みが Tbl.W として格納されている場合、Weights として 'W' を指定します。それ以外の場合、Tbl の列は Tbl.W を含めてすべて予測子として扱われます。

観測値の重みを指定した場合、loss は加重回帰損失、つまり重み付けされた平均二乗誤差またはイプシロン不感応損失関数を計算します。

loss は合計が 1 になるように Weights を正規化します。

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

出力引数

すべて折りたたむ

回帰損失。数値スカラーとして返されます。L の解釈は WeightsLossFun によって異なります。たとえば、既定の観測値の重みを使用し、損失関数として 'epsiloninsensitive' を指定した場合、L はイプシロン不感応損失です。

詳細

すべて折りたたむ

重み付けされた平均二乗誤差

重み付けされた平均二乗誤差は、次のように計算されます。

mse=j=1nwj(f(xj)yj)2j=1nwj,

ここで、

  • n は、観測数です。

  • xj は j 番目の観測値 (予測子データの行) です。

  • yj は、xj に対する観測された応答です。

  • f(xj) は、xj に対するガウス カーネル回帰モデル Mdl の応答予測です。

  • w は、観測値の重みのベクトルです。

w 内の各観測値の重みは、既定では ones(n,1)/n に等しくなります。名前と値のペアの引数 'Weights' を使用することにより、観測値の重みについて異なる値を指定できます。loss は、合計が 1 になるように Weights を正規化します。

イプシロン不感応損失関数

イプシロン不感応損失関数は、関数値の距離がイプシロン (ε) 以内である誤差を無視します。この関数は、正式には次のように表されます。

Lossε={0,if|yf(x)|ε|yf(x)|ε,otherwise.

イプシロン不感応損失は、次のように計算されます。

Loss=j=1nwjmax(0,|yjf(xj)|ε)j=1nwj,

ここで、

  • n は、観測数です。

  • xj は j 番目の観測値 (予測子データの行) です。

  • yj は、xj に対する観測された応答です。

  • f(xj) は、xj に対するガウス カーネル回帰モデル Mdl の応答予測です。

  • w は、観測値の重みのベクトルです。

w 内の各観測値の重みは、既定では ones(n,1)/n に等しくなります。名前と値のペアの引数 'Weights' を使用することにより、観測値の重みについて異なる値を指定できます。loss は、合計が 1 になるように Weights を正規化します。

拡張機能

バージョン履歴

R2018a で導入

すべて展開する