Main Content

refit

分類用の近傍成分分析 (NCA) モデルの再当てはめ

説明

mdlrefit = refit(mdl,Name=Value) は、1 つ以上の名前と値の引数で指定された修正パラメーターを使用して、モデル mdl を再度当てはめます。

すべて折りたたむ

関数 generateCheckerBoardData.m を使用してチェッカーボード データを生成します。

rng(2016,"twister"); % For reproducibility
pps = 1375;
[X,y] = generateCheckerBoardData(pps);
X = X + 2;

データをプロットする。

plot(X(y==1,1),X(y==1,2),"x")
hold on
plot(X(y==-1,1),X(y==-1,2),"x")
hold off

[n,p] = size(X)
n = 22000
p = 2

無関係な予測子をデータに追加します。

Q = 98;
Xrnd = unifrnd(0,4,n,Q);
Xobs = [X,Xrnd];

このコードにより、すべてが 0 と 4 の間で均等に分散している 98 個の追加予測子が作成されます。

データを学習セットとテスト セットに分割します。層化区分を作成し、各分割が似たクラス比率を持つようにするため、分割基準として length(y) ではなく y を使用します。

cvp = cvpartition(y,"Holdout",2000);

cvpartition は、テスト セットに追加する 2000 個の観測値を無作為に選択します。残りのデータは学習セットに追加されます。cvpartition オブジェクト cvp に格納されている割り当てを使用して、学習セットと検証セットを作成します。

Xtrain = Xobs(cvp.training(1),:);
ytrain = y(cvp.training(1),:);

Xval = Xobs(cvp.test(1),:);
yval = y(cvp.test(1),:);

特徴選択を行わない場合の誤分類誤差を計算します。

nca = fscnca(Xtrain,ytrain,FitMethod="none",Standardize=true, ...
    Solver="lbfgs");
loss_nofs = loss(nca,Xval,yval)
loss_nofs = 0.5165

FitMethod="none" オプションでは、既定の重み (すべてが 1) が使用されます。つまり、すべての特徴量が同じ重要度になります。

次に、分類用の近傍成分分析を使用して、λ=1/n で特徴選択を実行します。

w0 = rand(100,1);
n = length(ytrain)
n = 20000
lambda = 1/n;
nca = refit(nca,InitialFeatureWeights=w0,FitMethod="exact", ...
    Lambda=lambda,Solver="sgd");

目的関数の値と反復回数をプロットします。

plot(nca.FitInfo.Iteration,nca.FitInfo.Objective,"o")
hold on
plot(nca.FitInfo.Iteration,movmean(nca.FitInfo.Objective,10),".-")
hold off
xlabel("Iteration number")
ylabel("Objective value")

特徴選択を行った場合の誤分類誤差を計算します。

loss_withfs = loss(nca,Xval,yval)
loss_withfs = 0.0115

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

semilogx(nca.FeatureWeights,"o")
xlabel("Feature index")
ylabel("Feature weight")
grid on

特徴量の重みおよび相対的なしきい値を使用して、特徴量を選択します。

tol = 0.15;
selidx = find(nca.FeatureWeights > tol*max(1,max(nca.FeatureWeights)))
selidx = 2×1

     1
     2

特徴選択により結果が改善され、fscnca は 2 つの正しい特徴量が関連することを判別します。

入力引数

すべて折りたたむ

分類用の近傍成分分析モデル。FeatureSelectionNCAClassification オブジェクトとして指定します。

名前と値の引数

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

例: refit(mdl,Lambda=0.01) は、lambda 値を 0.01 にしてモデル mdl を再度当てはめます。

当てはめオプション

すべて折りたたむ

モデルの当てはめ方式。次のいずれかとして指定します。

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

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

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

例: FitMethod="none"

正則化パラメーター。非負のスカラー値として指定します。

n 個の観測値がある場合、NCA モデルの汎化誤差を最小化する最良の Lambda の値は 1/n の整数倍であると考えられます。

例: Lambda=0.01

データ型: double | single

特徴量の重みを推定するソルバーのタイプ。次のいずれかとして指定します。

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

  • "sgd" — 確率的勾配降下

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

例: Solver="minibatch-lbfgs"

特徴量の重みの初期値。p 行 1 列の正の実数スカラー値のベクトルとして指定します。

データ型: double | single

収束概要表示の詳細レベルのインジケーター。次のいずれかとして指定します。

  • 0 — 収束概要なし

  • 1 — 反復回数、勾配のノルム、目的関数の値を含む収束概要。

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

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

例: Verbose=2

データ型: double | single

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

すべて折りたたむ

ソルバーが lbfgs である場合の勾配ノルムに対する収束の相対許容誤差。正の実数スカラー値として指定します。

例: GradientTolerance=0.00001

データ型: double | single

SGD またはミニバッチ LBFGS のオプション

すべて折りたたむ

ソルバーが sgd である場合の初期学習率。正のスカラー値として指定します。

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

例: InitialLearningRate=0.8

データ型: double | single

ソルバーが "sgd" (確率的勾配降下) である場合の最大通過回数。正の整数値として指定します。1 回通過するごとに、size(mdl.X,1) 個の観測値が処理されます。

例: PassLimit=10

データ型: double | single

SGD、LBFGS またはミニバッチ LBFGS のオプション

すべて折りたたむ

最大反復回数。正の整数を指定します。

例: IterationLimit=250

データ型: double | single

出力引数

すべて折りたたむ

分類用の近傍成分分析モデル。FeatureSelectionNCAClassification オブジェクトとして返されます。結果を新しいモデルとして保存するか、mdl = refit(mdl,Name=Value) として既存のモデルを更新することができます。

バージョン履歴

R2016b で導入