Main Content

fsrnca

回帰に近傍成分分析を使用する特徴選択

説明

fsrnca は、回帰用に近傍成分分析 (NCA) を使用して特徴選択を実行します。

分類用に NCA に基づく特徴選択を実行するには、fscnca を参照してください。

mdl = fsrnca(Tbl,ResponseVarName) は、table Tbl の予測子を使用して、回帰用の NCA 特徴選択モデルを返します。ResponseVarName は、応答値が格納されている Tbl 内の変数の名前です。

fsrnca は、正則化がある NCA を対角的に適用することにより、特徴量の重みを学習します。

mdl = fsrnca(Tbl,formula) は、table Tbl の予測子を使用して、回帰用の NCA 特徴選択モデルを返します。formula は、mdl の当てはめに使用する応答および Tbl 内の予測子変数サブセットの説明モデルです。

mdl = fsrnca(Tbl,Y) は、table Tbl の予測子と Y の応答を使用して、回帰用の NCA 特徴選択モデルを返します。

mdl = fsrnca(X,Y) は、X の予測子と Y の応答を使用して、回帰用の NCA 特徴選択モデルを返します。

mdl = fsrnca(X,Y,Name,Value) では、1 つ以上の名前と値の引数を使用して追加オプションを指定します。たとえば、モデルの当てはめ方式、正則化パラメーター、特徴量の重みの初期値を指定できます。

すべて折りたたむ

応答変数が 3、9 および 15 番目の予測子に依存する遊びのデータを生成します。

rng(0,'twister'); % For reproducibility
N = 100;
X = rand(N,20);
y = 1 + X(:,3)*5 + sin(X(:,9)./X(:,15) + 0.25*randn(N,1));

回帰用の近傍成分分析モデルを当てはめます。

mdl = fsrnca(X,y,'Verbose',1,'Lambda',0.5/N);
 o Solver = LBFGS, HessianHistorySize = 15, LineSearchMethod = weakwolfe

|====================================================================================================|
|   ITER   |   FUN VALUE   |  NORM GRAD  |  NORM STEP  |  CURV  |    GAMMA    |    ALPHA    | ACCEPT |
|====================================================================================================|
|        0 |  1.636932e+00 |   3.688e-01 |   0.000e+00 |        |   1.627e+00 |   0.000e+00 |   YES  |
|        1 |  8.304833e-01 |   1.083e-01 |   2.449e+00 |    OK  |   9.194e+00 |   4.000e+00 |   YES  |
|        2 |  7.548105e-01 |   1.341e-02 |   1.164e+00 |    OK  |   1.095e+01 |   1.000e+00 |   YES  |
|        3 |  7.346997e-01 |   9.752e-03 |   6.383e-01 |    OK  |   2.979e+01 |   1.000e+00 |   YES  |
|        4 |  7.053407e-01 |   1.605e-02 |   1.712e+00 |    OK  |   5.809e+01 |   1.000e+00 |   YES  |
|        5 |  6.970502e-01 |   9.106e-03 |   8.818e-01 |    OK  |   6.223e+01 |   1.000e+00 |   YES  |
|        6 |  6.952347e-01 |   5.522e-03 |   6.382e-01 |    OK  |   3.280e+01 |   1.000e+00 |   YES  |
|        7 |  6.946302e-01 |   9.102e-04 |   1.952e-01 |    OK  |   3.380e+01 |   1.000e+00 |   YES  |
|        8 |  6.945037e-01 |   6.557e-04 |   9.942e-02 |    OK  |   8.490e+01 |   1.000e+00 |   YES  |
|        9 |  6.943908e-01 |   1.997e-04 |   1.756e-01 |    OK  |   1.124e+02 |   1.000e+00 |   YES  |
|       10 |  6.943785e-01 |   3.478e-04 |   7.755e-02 |    OK  |   7.621e+01 |   1.000e+00 |   YES  |
|       11 |  6.943728e-01 |   1.428e-04 |   3.416e-02 |    OK  |   3.649e+01 |   1.000e+00 |   YES  |
|       12 |  6.943711e-01 |   1.128e-04 |   1.231e-02 |    OK  |   6.092e+01 |   1.000e+00 |   YES  |
|       13 |  6.943688e-01 |   1.066e-04 |   2.326e-02 |    OK  |   9.319e+01 |   1.000e+00 |   YES  |
|       14 |  6.943655e-01 |   9.324e-05 |   4.399e-02 |    OK  |   1.810e+02 |   1.000e+00 |   YES  |
|       15 |  6.943603e-01 |   1.206e-04 |   8.823e-02 |    OK  |   4.609e+02 |   1.000e+00 |   YES  |
|       16 |  6.943582e-01 |   1.701e-04 |   6.669e-02 |    OK  |   8.425e+01 |   5.000e-01 |   YES  |
|       17 |  6.943552e-01 |   5.160e-05 |   6.473e-02 |    OK  |   8.832e+01 |   1.000e+00 |   YES  |
|       18 |  6.943546e-01 |   2.477e-05 |   1.215e-02 |    OK  |   7.925e+01 |   1.000e+00 |   YES  |
|       19 |  6.943546e-01 |   1.077e-05 |   6.086e-03 |    OK  |   1.378e+02 |   1.000e+00 |   YES  |

|====================================================================================================|
|   ITER   |   FUN VALUE   |  NORM GRAD  |  NORM STEP  |  CURV  |    GAMMA    |    ALPHA    | ACCEPT |
|====================================================================================================|
|       20 |  6.943545e-01 |   2.260e-05 |   4.071e-03 |    OK  |   5.856e+01 |   1.000e+00 |   YES  |
|       21 |  6.943545e-01 |   4.250e-06 |   1.109e-03 |    OK  |   2.964e+01 |   1.000e+00 |   YES  |
|       22 |  6.943545e-01 |   1.916e-06 |   8.356e-04 |    OK  |   8.649e+01 |   1.000e+00 |   YES  |
|       23 |  6.943545e-01 |   1.083e-06 |   5.270e-04 |    OK  |   1.168e+02 |   1.000e+00 |   YES  |
|       24 |  6.943545e-01 |   1.791e-06 |   2.673e-04 |    OK  |   4.016e+01 |   1.000e+00 |   YES  |
|       25 |  6.943545e-01 |   2.596e-07 |   1.111e-04 |    OK  |   3.154e+01 |   1.000e+00 |   YES  |

         Infinity norm of the final gradient = 2.596e-07
              Two norm of the final step     = 1.111e-04, TolX   = 1.000e-06
Relative infinity norm of the final gradient = 2.596e-07, TolFun = 1.000e-06
EXIT: Local minimum found.

選択された特徴量をプロットします。無関連性な特徴量の重みはゼロに近いはずです。

figure()
plot(mdl.FeatureWeights,'ro')
grid on
xlabel('Feature index')
ylabel('Feature weight')

Figure contains an axes object. The axes object with xlabel Feature index, ylabel Feature weight contains a line object which displays its values using only markers.

fsrnca は、この応答に対して、関連する予測子を正しく判別しています。

標本データを読み込みます。

load robotarm.mat

robotarm データセット (pumadyn32nm) は、ロボット アーム シミュレータを使用して作成されており、7168 個の学習観測値、1024 個のテスト観測値、32 個の特徴量が含まれています [1][2]。これは、オリジナルのデータ セットを前処理したものです。データの前処理では、線形回帰近似を除外してから、すべての特徴量を単位分散に対して正規化しています。

既定値の λ (正則化パラメーター) を使用して、回帰用の近傍成分分析 (NCA) 特徴選択を実行します。

nca = fsrnca(Xtrain,ytrain,'FitMethod','exact', ...
    'Solver','lbfgs');

選択された値をプロットします。

figure
plot(nca.FeatureWeights,'ro')
xlabel('Feature index')
ylabel('Feature weight')
grid on

Figure contains an axes object. The axes object with xlabel Feature index, ylabel Feature weight contains a line object which displays its values using only markers.

特徴量の重みは半分以上が非ゼロです。選択された特徴量を使用し、テスト セットを性能の尺度にして損失を計算します。

L = loss(nca,Xtest,ytest)
L = 0.0837

性能の改善を試みます。5 分割交差検証を使用して、特徴選択の正則化パラメーター λ を調整します。λ の調整とは、回帰損失が最小になる λ の値を求めることを意味します。交差検証を使用して λ を調整するため、以下を行います。

1.データを 5 つの分割に分割します。各分割について、cvpartition は各データの 4/5 を学習セットとして、1/5 をテスト セットとして割り当てます。

rng(1) % For reproducibility 
n = length(ytrain);
cvp = cvpartition(length(ytrain),'kfold',5);
numvalidsets = cvp.NumTestSets;

探索用の λ の値を割り当てます。応答値に定数を乗算すると、損失関数項はその定数倍になります。したがって、係数 std(ytrain)λ の値に含めると、目的関数で既定の損失関数 ('mad'、平均絶対偏差) 項と正則化項のバランスがとれます。この例では、読み込んだ標本データは元のデータ セットを前処理したバージョンなので、係数 std(ytrain) は 1 です。

lambdavals = linspace(0,50,20)*std(ytrain)/n;

損失値を格納する配列を作成します。

lossvals = zeros(length(lambdavals),numvalidsets);

2.各分割の学習セットを使用して、λ の各値について NCA モデルに学習をさせます。

3.NCA モデルを使用して、分割内の対応するテスト セットの回帰損失を計算します。損失の値を記録します。

4.これを λ の各値および各分割に対して繰り返します。

for i = 1:length(lambdavals)
    for k = 1:numvalidsets
        X = Xtrain(cvp.training(k),:);
        y = ytrain(cvp.training(k),:);
        Xvalid = Xtrain(cvp.test(k),:);
        yvalid = ytrain(cvp.test(k),:);

        nca = fsrnca(X,y,'FitMethod','exact', ...
             'Solver','minibatch-lbfgs','Lambda',lambdavals(i), ...
             'GradientTolerance',1e-4,'IterationLimit',30);
        
        lossvals(i,k) = loss(nca,Xvalid,yvalid,'LossFunction','mse');
    end
end

λ の各値について、分割から得られる平均損失を計算します。

meanloss = mean(lossvals,2);

平均損失と λ の値をプロットします。

figure
plot(lambdavals,meanloss,'ro-')
xlabel('Lambda')
ylabel('Loss (MSE)')
grid on

Figure contains an axes object. The axes object with xlabel Lambda, ylabel Loss (MSE) contains an object of type line.

損失の値が最小になる λ の値を求めます。

[~,idx] = min(meanloss)
idx = 17
bestlambda = lambdavals(idx)
bestlambda = 0.0059
bestloss = meanloss(idx)
bestloss = 0.0590

最良の λ の値を使用して、回帰用の NCA 特徴選択モデルを当てはめます。

nca = fsrnca(Xtrain,ytrain,'FitMethod','exact', ...
    'Solver','lbfgs','Lambda',bestlambda);

選択された特徴量をプロットします。

figure
plot(nca.FeatureWeights,'ro')
xlabel('Feature Index')
ylabel('Feature Weight')
grid on

Figure contains an axes object. The axes object with xlabel Feature Index, ylabel Feature Weight contains a line object which displays its values using only markers.

特徴量の重みはほとんどがゼロになります。fsrnca は、最も関連性がある 4 つの特徴量を特定しています。

テスト セットの損失を計算します。

L = loss(nca,Xtest,ytest)
L = 0.0571

正則化パラメーター λ の調整により、無関係な特徴量がさらに除外され、性能が向上しました。

この例では、UCI Machine Learning Repository [5] にあるアワビのデータ [3][4] を使用します。

データをダウンロードして、'abalone.csv' という名前で現在のフォルダに保存します。

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data';
websave('abalone.csv',url);

データをテーブルに読み込みます。最初の 7 行を表示します。

tbl = readtable('abalone.csv','Filetype','text','ReadVariableNames',false);
tbl.Properties.VariableNames = {'Sex','Length','Diameter','Height', ...
    'WWeight','SWeight','VWeight','ShWeight','NoShellRings'};
tbl(1:7,:)
ans=7×9 table
     Sex     Length    Diameter    Height    WWeight    SWeight    VWeight    ShWeight    NoShellRings
    _____    ______    ________    ______    _______    _______    _______    ________    ____________

    {'M'}    0.455      0.365      0.095      0.514     0.2245      0.101       0.15           15     
    {'M'}     0.35      0.265       0.09     0.2255     0.0995     0.0485       0.07            7     
    {'F'}     0.53       0.42      0.135      0.677     0.2565     0.1415       0.21            9     
    {'M'}     0.44      0.365      0.125      0.516     0.2155      0.114      0.155           10     
    {'I'}     0.33      0.255       0.08      0.205     0.0895     0.0395      0.055            7     
    {'I'}    0.425        0.3      0.095     0.3515      0.141     0.0775       0.12            8     
    {'F'}     0.53      0.415       0.15     0.7775      0.237     0.1415       0.33           20     

このデータセットには、4177 個の観測値が含まれています。目標は、8 つの物理的な測定値からアワビの年齢を予測することです。最後の変数は貝殻の輪の数で、アワビの年齢を示します。最初の予測子は、カテゴリカル変数です。テーブルの最後の変数は、応答変数です。

fsrnca 用に予測子変数と応答変数を準備します。tbl の最後の列には、応答変数である貝殻の輪の数が含まれています。1 番目の予測子変数 sex はカテゴリカルです。ダミー変数を作成しなければなりません。

y = table2array(tbl(:,end));
X(:,1:3) = dummyvar(categorical(tbl.Sex));
X = [X,table2array(tbl(:,2:end-1))];

4 分割の交差検証を使用して、NCA モデルの正則化パラメーターを調整します。はじめに、データを 4 つの分割に分割します。

rng('default') % For reproducibility
n = length(y);
cvp = cvpartition(n,'kfold',4);
numtestsets = cvp.NumTestSets;

cvpartition はデータを 4 つの分割に分割します。各分割で、データの約 3/4 が学習セットとして、1/4 がテスト セットとして割り当てられます。

最適な λ (正則化パラメーター) の値を決定するため、さまざまな値の λ を生成してモデルを当てはめます。各当てはめから損失を収集するためのベクトルを作成します。

lambdavals = linspace(0,25,20)*std(y)/n;
lossvals = zeros(length(lambdavals),numtestsets);

lossvals の行は λ の値に、列は分割に対応します。

λ の各値を使用した各分割のデータに、fsrnca を使用した回帰用の NCA モデルを当てはめます。各分割のテスト データを使用して、各モデルの損失を計算します。

for i = 1:length(lambdavals)
   for k = 1:numtestsets
       Xtrain = X(cvp.training(k),:);
       ytrain = y(cvp.training(k),:);
       Xtest = X(cvp.test(k),:);
       ytest = y(cvp.test(k),:);

       nca = fsrnca(Xtrain,ytrain,'FitMethod','exact', ...
				 'Solver','lbfgs','Lambda',lambdavals(i),'Standardize',true);

       lossvals(i,k) = loss(nca,Xtest,ytest,'LossFunction','mse');
    end
end

分割の平均損失を計算します。つまり、lossvals の 2 番目の次元で平均を計算します。

meanloss = mean(lossvals,2);

4 分割による平均損失に対して λ をプロットします。

figure
plot(lambdavals,meanloss,'ro-')
xlabel('Lambda')
ylabel('Loss (MSE)')
grid on

平均損失が最小になる λ の値を求めます。

[~,idx] = min(meanloss);
bestlambda = lambdavals(idx)
bestlambda = 0.0071

最良の損失値を計算します。

bestloss = meanloss(idx)
bestloss = 4.7799

最適な λ の値を使用して、すべてのデータに NCA モデルを当てはめます。

nca = fsrnca(X,y,'FitMethod','exact','Solver','lbfgs', ...
    'Verbose',1,'Lambda',bestlambda,'Standardize',true);
 o Solver = LBFGS, HessianHistorySize = 15, LineSearchMethod = weakwolfe

|====================================================================================================|
|   ITER   |   FUN VALUE   |  NORM GRAD  |  NORM STEP  |  CURV  |    GAMMA    |    ALPHA    | ACCEPT |
|====================================================================================================|
|        0 |  2.469168e+00 |   1.266e-01 |   0.000e+00 |        |   4.741e+00 |   0.000e+00 |   YES  |
|        1 |  2.375166e+00 |   8.265e-02 |   7.268e-01 |    OK  |   1.054e+01 |   1.000e+00 |   YES  |
|        2 |  2.293528e+00 |   2.067e-02 |   2.034e+00 |    OK  |   1.569e+01 |   1.000e+00 |   YES  |
|        3 |  2.286703e+00 |   1.031e-02 |   3.158e-01 |    OK  |   2.213e+01 |   1.000e+00 |   YES  |
|        4 |  2.279928e+00 |   2.023e-02 |   9.374e-01 |    OK  |   1.953e+01 |   1.000e+00 |   YES  |
|        5 |  2.276258e+00 |   6.884e-03 |   2.497e-01 |    OK  |   1.439e+01 |   1.000e+00 |   YES  |
|        6 |  2.274358e+00 |   1.792e-03 |   4.010e-01 |    OK  |   3.109e+01 |   1.000e+00 |   YES  |
|        7 |  2.274105e+00 |   2.412e-03 |   2.399e-01 |    OK  |   3.557e+01 |   1.000e+00 |   YES  |
|        8 |  2.274073e+00 |   1.459e-03 |   7.684e-02 |    OK  |   1.356e+01 |   1.000e+00 |   YES  |
|        9 |  2.274050e+00 |   3.733e-04 |   3.797e-02 |    OK  |   1.725e+01 |   1.000e+00 |   YES  |
|       10 |  2.274043e+00 |   2.750e-04 |   1.379e-02 |    OK  |   2.445e+01 |   1.000e+00 |   YES  |
|       11 |  2.274027e+00 |   2.682e-04 |   5.701e-02 |    OK  |   7.386e+01 |   1.000e+00 |   YES  |
|       12 |  2.274020e+00 |   1.712e-04 |   4.107e-02 |    OK  |   9.461e+01 |   1.000e+00 |   YES  |
|       13 |  2.274014e+00 |   2.633e-04 |   6.720e-02 |    OK  |   7.469e+01 |   1.000e+00 |   YES  |
|       14 |  2.274012e+00 |   9.818e-05 |   2.263e-02 |    OK  |   3.275e+01 |   1.000e+00 |   YES  |
|       15 |  2.274012e+00 |   4.220e-05 |   6.188e-03 |    OK  |   2.799e+01 |   1.000e+00 |   YES  |
|       16 |  2.274012e+00 |   2.859e-05 |   4.979e-03 |    OK  |   6.628e+01 |   1.000e+00 |   YES  |
|       17 |  2.274011e+00 |   1.582e-05 |   6.767e-03 |    OK  |   1.439e+02 |   1.000e+00 |   YES  |
|       18 |  2.274011e+00 |   7.623e-06 |   4.311e-03 |    OK  |   1.211e+02 |   1.000e+00 |   YES  |
|       19 |  2.274011e+00 |   3.038e-06 |   2.528e-04 |    OK  |   1.798e+01 |   5.000e-01 |   YES  |

|====================================================================================================|
|   ITER   |   FUN VALUE   |  NORM GRAD  |  NORM STEP  |  CURV  |    GAMMA    |    ALPHA    | ACCEPT |
|====================================================================================================|
|       20 |  2.274011e+00 |   6.710e-07 |   2.325e-04 |    OK  |   2.721e+01 |   1.000e+00 |   YES  |

         Infinity norm of the final gradient = 6.710e-07
              Two norm of the final step     = 2.325e-04, TolX   = 1.000e-06
Relative infinity norm of the final gradient = 6.710e-07, TolFun = 1.000e-06
EXIT: Local minimum found.

選択された特徴量をプロットします。

figure
plot(nca.FeatureWeights,'ro')
xlabel('Feature Index')
ylabel('Feature Weight')
grid on

無関係な特徴量の重みはゼロになります。この図に従うと、特徴量 1、3 および 9 は選択されません。

パラメーター推定に回帰変数サブセット法を、予測に完全独立条件法を使用して、ガウス過程回帰 (GPR) モデルを当てはめます。ARD 二乗指数カーネル関数を使用します。これにより、個々の重みが各予測子に割り当てられます。予測子を標準化します。

gprMdl = fitrgp(tbl,'NoShellRings','KernelFunction','ardsquaredexponential', ...
      'FitMethod','sr','PredictMethod','fic','Standardize',true)
gprMdl = 
  RegressionGP
           PredictorNames: {'Sex'  'Length'  'Diameter'  'Height'  'WWeight'  'SWeight'  'VWeight'  'ShWeight'}
             ResponseName: 'NoShellRings'
    CategoricalPredictors: 1
        ResponseTransform: 'none'
          NumObservations: 4177
           KernelFunction: 'ARDSquaredExponential'
        KernelInformation: [1×1 struct]
            BasisFunction: 'Constant'
                     Beta: 11.4959
                    Sigma: 2.0282
        PredictorLocation: [10×1 double]
           PredictorScale: [10×1 double]
                    Alpha: [1000×1 double]
         ActiveSetVectors: [1000×10 double]
            PredictMethod: 'FIC'
            ActiveSetSize: 1000
                FitMethod: 'SR'
          ActiveSetMethod: 'Random'
        IsActiveSetVector: [4177×1 logical]
            LogLikelihood: -9.0019e+03
         ActiveSetHistory: [1×1 struct]
           BCDInformation: []


  Properties, Methods

学習済みのモデルについて学習データの回帰損失 (再代入損失) を計算します。

L = resubLoss(gprMdl)
L = 4.0306

fsrnca を使用した最小の交差検証済み損失は、GPR モデルと ARD カーネルを使用して得られた損失と同程度です。

入力引数

すべて折りたたむ

モデルを学習させるために使用する標本データ。テーブルとして指定します。Tbl の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。

データ型: table

応答変数の名前。Tbl 内の変数の名前で指定します。table 内の残りの変数は予測子です。

データ型: char | string

応答変数および予測子変数サブセットの説明モデル。"Y~x1+x2+x3" という形式の string または文字ベクトルとして指定します。この形式では、Y は応答変数を、x1x2 および x3 は予測子変数を表します。

モデルに学習をさせるための予測子として Tbl 内の変数のサブセットを指定するには、式を使用します。式を指定した場合、formula に現れない Tbl 内の変数は使用されません。

式の変数名は Tbl の変数名 (Tbl.Properties.VariableNames) であり、有効な MATLAB® 識別子でなければなりません。関数 isvarname を使用して Tbl の変数名を検証できます。変数名が有効でない場合、関数 matlab.lang.makeValidName を使用してそれらを変換できます。

データ型: char | string

予測子変数の値。n 行 p 列の行列を指定します。n は観測値の個数、p は予測子変数の個数です。

データ型: single | double

応答値。長さ n の実数数値ベクトルを指定します。n は観測値の個数です。

データ型: single | double

名前と値の引数

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

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

例: 'Solver','sgd','Weights',W,'Lambda',0.0003 は、ソルバーとして確率的勾配降下を、観測値の重みとしてベクトル W の値を指定し、正則化パラメーターとして 0.0003 を設定します。

当てはめオプション

すべて折りたたむ

モデルの当てはめ方式。'FitMethod' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

  • 'exact' — すべてのデータを使用して当てはめを実行します。

  • 'none' — 当てはめを行いません。fsrnca を呼び出すときに指定した特徴量の重みの初期値を使用して NCA モデルの汎化誤差を評価する場合に、このオプションを使用します。

  • 'average' — データをサブセットに分割し、exact 法を使用して各分割を当てはめ、特徴量の重みの平均を返します。名前と値のペアの引数 NumPartitions を使用して分割数を指定できます。

例: 'FitMethod','none'

'FitMethod','average' オプションで使用するデータの分割数。'NumPartitions' と 2 ~ n の整数値から構成されるコンマ区切りのペアとして指定します。n は観測値の個数です。

例: 'NumPartitions',15

データ型: double | single

過適合を防止するための正則化パラメーター。'Lambda' と非負のスカラーから構成されるコンマ区切りのペアとして指定します。

観測値の個数 n が大きくなると、過適合の可能性が小さくなり、必要な正則化の量も少なくなります。正則化パラメーターを調整する方法の詳細については、回帰用の NCA の正則化パラメーターの調整を参照してください。

例: 'Lambda',0.002

データ型: double | single

カーネルの幅。'LengthScale' と正の実数スカラーから構成されるコンマ区切りのペアとして指定します。

すべての予測子が同じスケールである場合、長さスケールの値は 1 が妥当です。X 内の予測子の大きさが非常に異なる場合は、'Standardize',true を使用して予測子の値を標準化し、'LengthScale',1 を設定することを検討してください。

例: 'LengthScale',1.5

データ型: double | single

カテゴリカル予測子のリスト。次の表のいずれかの値として指定します。

説明
正の整数のベクトルベクトルの各エントリは、カテゴリカル変数が含まれている予測子データ (X) の列に対応するインデックス値です。
logical ベクトルtrue というエントリは、予測子データ (X) の対応する列がカテゴリカル変数であることを意味します。
文字行列行列の各行は table X 内の予測子変数の名前です。名前は PredictorNames のエントリに一致しなくてはなりません。文字行列の各行が同じ長さになるように、名前を余分な空白で埋めてください。
文字ベクトルの cell 配列または string 配列配列の各要素は table X 内の予測子変数の名前です。名前は PredictorNames のエントリに一致しなくてはなりません。
"all"すべての予測子がカテゴリカルです。

既定では、予測子データがテーブル内にある場合、fsrnca は、その変数が logical ベクトル、categorical ベクトル、文字配列、string 配列のいずれか、あるいは文字ベクトルの cell 配列である場合に、変数を categorical であると見なします。予測子データが行列である場合、fsrnca はすべての予測子が連続的であると見なします。他の予測子をカテゴリカル予測子として指定するには、名前と値の引数 CategoricalPredictors を使用してそれらを指定します。

特定されたカテゴリカル予測子に対して、fsrnca はカテゴリカル変数に順序が設定されていないか順序が設定されているかに応じて、2 つの異なる方式を使用してダミー変数を作成します。

  • 順序付けのないカテゴリカル変数の場合、fsrnca は、そのカテゴリカル変数の各レベルについて 1 つずつダミー変数を作成します。

  • 順序付けされたカテゴリカル変数の場合、fsrnca は、カテゴリの数よりも 1 つ少ないダミー変数を作成します。詳細については、ダミー変数の自動作成を参照してください。

X が table の場合、カテゴリカル予測子を順序付きにすることも順序なしにすることもできます。X が行列の場合、fsrnca はカテゴリカル予測子を順序なしとして扱います。

例: CategoricalPredictors="all"

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

予測子変数名。一意な名前の string 配列または一意な文字ベクトルの cell 配列として指定します。PredictorNames の機能は、学習データの提供方法によって決まります。

  • X を行列として指定する場合、PredictorNames を使用して X 内の予測子変数に名前を割り当てることができます。

    • PredictorNames 内の名前の順序は、X の予測子の順序に一致しなければなりません。つまり、PredictorNames{1}X(:,1) の名前、PredictorNames{2}X(:,2) の名前であり、他も同様です。また、size(X,2)numel(PredictorNames) は等しくなければなりません。

    • 既定では PredictorNames{'X1','X2',...} です。

  • X を table として指定する場合、PredictorNames を使用して学習に使用する予測子変数を指定できます。つまり、fsrnca は、学習中に PredictorNames の予測子変数と応答変数のみを使用します。

    • PredictorNamesX.Properties.VariableNames のサブセットでなければならず、応答変数の名前を含めることはできません。

    • 既定では、すべての予測子変数の名前が PredictorNames に格納されます。

    • 学習用の予測子は、PredictorNamesY の式の string ('y ~ x1 + x2 + x3' など) の両方ではなく、いずれか一方を使用して指定します。

例: "PredictorNames={"SepalLength","SepalWidth","PetalLength","PetalWidth"}

データ型: string | cell

応答変数名。文字ベクトルまたは string スカラーとして指定します。

  • Y を指定した場合、ResponseName を使用して応答変数の名前を指定できます。

  • ResponseVarName または formula を指定した場合、ResponseName を使用できません。

例: ResponseName="response"

データ型: char | string

特徴量の重みの初期値。M 行 1 列の正の数値のベクトルとして指定します。ここで、M はカテゴリカル変数用にダミー変数が作成された後の予測子変数の数です (詳細については、CategoricalPredictors を参照)。

特徴量の重みを最適化する正則化された目的関数は、凸型ではありません。このため、特徴量の重みの初期値が異なると結果が異なることがあります。通常は特徴量の重みの初期値をすべて 1 に設定すると良好に機能しますが、状況によっては rand(M,1) を使用するランダムな初期値の方が解の品質が向上する場合があります。

データ型: double | single

観測値の重み。'Weights' と正の実数スカラーによる n 行 1 列のベクトルから構成されるコンマ区切りのペアとして指定します。一部の観測値の重要度を他の観測値に比べて大きくするには、観測値の重みを使用します。既定の重みは、同じ重要度をすべての観測値に割り当てます。

データ型: double | single

予測子データの標準化のインジケーター。'Standardize'false または true から構成されるコンマ区切りのペアとして指定します。詳細は、標準化の影響を参照してください。

例: 'Standardize',true

データ型: logical

収束概要表示の詳細レベル インジケーター。'Verbose' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

  • 0 — 収束概要なし

  • 1 — 勾配のノルムと目的関数の値を収束概要に含める

  • 1 より大きい値 — 当てはめアルゴリズムに応じた、より多くの収束情報

    'minibatch-lbfgs' ソルバーを使用する場合に詳細レベルを 1 より大きい値にすると、中間的なミニバッチ LBFGS の当てはめによる反復ログが収束情報に含まれます。

例: 'Verbose',1

データ型: double | single

特徴量の重みを推定するソルバーのタイプ。'Solver' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

  • 'lbfgs' — メモリ制限 Broyden-Fletcher-Goldfarb-Shanno (LBFGS) アルゴリズム

  • 'sgd' — 確率的勾配降下 (SGD) アルゴリズム

  • 'minibatch-lbfgs' — LBFGS アルゴリズムをミニバッチに適用した確率的勾配降下

既定値は、n ≤ 1000 の場合は 'lbfgs'、n > 1000 の場合は 'sgd' です。

例: 'solver','minibatch-lbfgs'

損失関数。'LossFunction' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

  • 'mad' — 平均絶対偏差

    l(yi,yj)=|yiyj|.

  • 'mse' — 平均二乗誤差

    l(yi,yj)=(yiyj)2.

  • 'epsiloninsensitive' — ε 許容損失関数。

    l(yi,yj)=max(0,|yiyj|ϵ).

    この損失関数は、平均二乗誤差または平均絶対偏差よりも外れ値に対してロバストです。

  • @lossfun — カスタム損失関数のハンドル。損失関数の形式は次のとおりです。

    function L = lossfun(Yu,Yv)
    % calculation of loss
    ...
    Yu は u 行 1 列のベクトル、Yv は v 行 1 列のベクトルです。L は、L(i,j)Yu(i) および Yv(j) の損失値となる u 行 v 列の行列です。

最小化対象の目的関数には、損失関数 l(yi,yj) が次のように含まれます。

f(w)=1ni=1nj=1,jinpijl(yi,yj)+λr=1pwr2,

ここで、w は特徴量の重みのベクトル、n は観測値の個数、p は予測子変数の個数です。pijxjxi の基準点である確率です。詳細については、回帰の場合の NCA 特徴選択を参照してください。

例: 'LossFunction',@lossfun

'LossFunction','epsiloninsensitive' オプションにおけるイプシロンの値。'LossFunction' と非負の実数スカラーから構成されるコンマ区切りのペアとして指定します。既定値は、応答変数の四分位数間範囲を使用した標本標準偏差の推定値です。

例: 'Epsilon',0.1

データ型: double | single

目的関数と勾配の計算に使用するメモリのサイズ (MB)。'CacheSize' と整数から構成されるコンマ区切りのペアとして指定します。

例: 'CacheSize',1500MB

データ型: double | single

LBFGS のオプション

すべて折りたたむ

ソルバーが 'lbfgs' である場合のヘッセ近似の履歴バッファー サイズ。'HessianHistorySize' と正の整数から構成されるコンマ区切りのペアとして指定します。ヘッセ行列の逆行列に対する近似を構築するために、各反復で最大 HessianHistorySize 回の最新の反復が使用されます。

例: 'HessianHistorySize',20

データ型: double | single

'lbfgs' ソルバーの初期ステップ サイズ。'InitialStepSize' と正の実数スカラーから構成されるコンマ区切りのペアとして指定します。既定では、初期ステップ サイズは自動的に決定されます。

データ型: double | single

直線探索法。'LineSearchMethod' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

  • 'weakwolfe' — 弱 Wolfe 直線探索

  • 'strongwolfe' — 強 Wolfe 直線探索

  • 'backtracking' — バックトラッキング直線探索

例: 'LineSearchMethod','backtracking'

直線探索の最大反復回数。'MaxLineSearchIterations' と正の整数から構成されるコンマ区切りのペアとして指定します。

例: 'MaxLineSearchIterations',25

データ型: double | single

lbfgs ソルバーの、勾配ノルムに対する収束の相対許容誤差。'GradientTolerance' と正の実数スカラーから構成されるコンマ区切りのペアとして指定します。

例: 'GradientTolerance',0.000002

データ型: double | single

SGD のオプション

すべて折りたたむ

'sgd' ソルバーの初期学習率。'InitialLearningRate' と正の実数スカラーから構成されるコンマ区切りのペアとして指定します。

ソルバー タイプとして 'sgd' を使用する場合、学習率は 'InitialLearningRate' で指定された値から始まって反復ごとに減衰します。

既定の 'auto' では、データの小規模なサブセットに対する実験を使用して初期学習率が決定されます。初期学習率を自動調整するための反復回数を指定するには、名前と値のペアの引数 NumTuningIterations を使用します。初期学習率の自動調整で使用する観測値の個数を指定するには、名前と値のペアの引数 TuningSubsetSize を使用します。

ソルバー タイプが 'minibatch-lbfgs' である場合、'InitialLearningRate' を非常に大きい値に設定できます。この場合、前回のミニバッチによる特徴量の重みの初期値を使用して、各ミニバッチに LBFGS が個別に適用されます。

選択した初期学習率によって目的値が各反復で減少していることを確認するには、mdl.FitInfo プロパティに格納されている Objective の値に対して Iteration をプロットします。

mdl.FeatureWeights に等しい 'InitialFeatureWeights'refit 法を使用すると、最新の解から始めて、さらに反復を実行することができます。

例: 'InitialLearningRate',0.9

データ型: double | single

'sgd' ソルバーの場合に各バッチで使用する観測値の個数。'MiniBatchSize' と 1 ~ n の正の整数から構成されるコンマ区切りのペアとして指定します。

例: 'MiniBatchSize',25

データ型: double | single

ソルバーが 'sgd' である場合に n 個の観測値すべてを通過する最大回数。'PassLimit' と正の整数から構成されるコンマ区切りのペアとして指定します。すべてのデータを 1 回通過することをエポックと呼びます。

例: 'PassLimit',10

データ型: double | single

'sgd' ソルバーの場合の収束概要を表示するバッチの頻度。'NumPrint' と正の整数から構成されるコンマ区切りのペアとして指定します。この引数は、'Verbose' の値が 0 より大きい場合に適用されます。コマンド ラインに表示される収束概要の各行について NumPrint 個のミニバッチが処理されます。

例: 'NumPrint',5

データ型: double | single

'sgd' ソルバーの調整反復回数。'NumTuningIterations' と正の整数から構成されるコンマ区切りのペアとして指定します。このオプションは、'InitialLearningRate','auto' の場合のみ有効です。

例: 'NumTuningIterations',15

データ型: double | single

初期学習率の調整に使用する観測値の個数。'TuningSubsetSize' と 1 ~ n の正の整数値から構成されるコンマ区切りのペアとして指定します。このオプションは、'InitialLearningRate','auto' の場合のみ有効です。

例: 'TuningSubsetSize',25

データ型: double | single

SGD または LBFGS のオプション

すべて折りたたむ

最大反復回数。'IterationLimit' と正の整数で構成されるコンマ区切りのペアとして指定します。既定値は、SGD の場合は 10000、LBFGS およびミニバッチ LBFGS の場合は 1000 です。

反復とは、バッチを 1 回通過することです。エポックとは、すべてのデータを 1 回通過することです。データが k 個のミニバッチに分割されている場合、どのエポックも k 回の反復に等しくなります。

例: 'IterationLimit',250

データ型: double | single

ステップ サイズに対する収束の許容誤差。'StepTolerance' と正の実数スカラーから構成されるコンマ区切りのペアとして指定します。'lbfgs' ソルバーは絶対ステップ許容誤差を、'sgd' ソルバーは相対ステップ許容誤差を使用します。

例: 'StepTolerance',0.000005

データ型: double | single

ミニバッチ LBFGS のオプション

すべて折りたたむ

ミニバッチ LBFGS の各ステップにおける最大反復回数。'MiniBatchLBFGSIterations' と正の整数から構成されるコンマ区切りのペアとして指定します。

例: 'MiniBatchLBFGSIterations',15

データ型: double | single

メモ

ミニバッチ LBFGS アルゴリズムは、SGD 法と LBFGS 法の組み合わせです。したがって、SGD ソルバーと LBFGS ソルバーに適用される名前と値のペアの引数は、すべてミニバッチ LBFGS アルゴリズムにも適用されます。

出力引数

すべて折りたたむ

回帰用の近傍成分分析モデル。FeatureSelectionNCARegression オブジェクトとして返されます。

参照

[1] Rasmussen, C. E., R. M. Neal, G. E. Hinton, D. van Camp, M. Revow, Z. Ghahramani, R. Kustra, and R. Tibshirani. The DELVE Manual, 1996, https://mlg.eng.cam.ac.uk/pub/pdf/RasNeaHinetal96.pdf.

[2] University of Toronto, Computer Science Department. Delve Datasets. http://www.cs.toronto.edu/~delve/data/datasets.html.

[3] Nash, W.J., T. L. Sellers, S. R. Talbot, A. J. Cawthorn, and W. B. Ford. "The Population Biology of Abalone (Haliotis species) in Tasmania. I. Blacklip Abalone (H. rubra) from the North Coast and Islands of Bass Strait." Sea Fisheries Division, Technical Report No. 48, 1994.

[4] Waugh, S. "Extending and Benchmarking Cascade-Correlation: Extensions to the Cascade-Correlation Architecture and Benchmarking of Feed-forward Supervised Artificial Neural Networks." University of Tasmania Department of Computer Science thesis, 1995.

[5] Lichman, M. UCI Machine Learning Repository. Irvine, CA: University of California, School of Information and Computer Science, 2013. http://archive.ics.uci.edu/ml.

バージョン履歴

R2016b で導入