Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

selectModels

クラス: ClassificationLinear

正則化されたバイナリ線形分類モデルのサブセットの選択

説明

SubMdl = selectModels(Mdl,idx) は、さまざまな正則化強度を使用して学習を行った一連のバイナリ線形分類モデル (Mdl) から、学習済みのバイナリ線形分類モデルのサブセットを返します。インデックス (idx) は Mdl.Lambda の正則化強度に対応し、どのモデルを返すかを指定します。

入力引数

すべて展開する

さまざまな正則化強度を使用して学習を行ったバイナリ線形分類モデル。ClassificationLinear モデル オブジェクトとして指定します。ClassificationLinear モデル オブジェクトは、fitclinear を使用して作成できます。

Mdl は 1 つのモデル オブジェクトですが、numel(Mdl.Lambda) = L ≥ 2 の場合、Mdl は L 個の学習済みモデルであると考えることができます。

正則化強度に対応するインデックス。正の整数の数値ベクトルを指定します。idx の値は [1,L] の範囲になければなりません。L = numel(Mdl.Lambda) です。

データ型: double | single

出力引数

すべて展開する

さまざまな正則化強度を使用して学習を行ったバイナリ線形分類モデルのサブセット。ClassificationLinear モデル オブジェクトとして返されます。

すべて展開する

ロジスティック回帰学習器を使用する線形分類モデルに適した LASSO ペナルティの強度を決定するため、検定標本の分類誤差率を比較します。

NLP のデータセットを読み込みます。カスタムな分類損失の指定で説明されているようにデータを前処理します。

load nlpdata
Ystats = Y == 'stats';
X = X'; 

rng(10); % For reproducibility
Partition = cvpartition(Ystats,'Holdout',0.30);
testIdx = test(Partition);
XTest = X(:,testIdx);
YTest = Ystats(testIdx);

10-610-0.5 の範囲で対数間隔で配置された 11 個の正則化強度を作成します。

Lambda = logspace(-6,-0.5,11);

各正則化強度を使用するバイナリ線形分類モデルに学習をさせます。SpaRSA を使用して目的関数を最適化します。目的関数の勾配の許容誤差を 1e-8 に下げます。

CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns',...
    'CVPartition',Partition,'Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8)
CVMdl = 
  classreg.learning.partition.ClassificationPartitionedLinear
    CrossValidatedModel: 'Linear'
           ResponseName: 'Y'
        NumObservations: 31572
                  KFold: 1
              Partition: [1x1 cvpartition]
             ClassNames: [0 1]
         ScoreTransform: 'none'


  Properties, Methods

学習済みの線形分類モデルを抽出します。

Mdl = CVMdl.Trained{1}
Mdl = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'logit'
              Beta: [34023x11 double]
              Bias: [1x11 double]
            Lambda: [1x11 double]
           Learner: 'logistic'


  Properties, Methods

MdlClassificationLinear モデル オブジェクトです。Lambda は正則化強度のシーケンスなので、Mdl はそれぞれが Lambda の各正則化強度に対応する 11 個のモデルであると考えることができます。

検定標本の分類誤差を推定します。

ce = loss(Mdl,X(:,testIdx),Ystats(testIdx),'ObservationsIn','columns');

11 個の正則化強度があるので、ce は 1 行 11 列の分類誤差率のベクトルです。

Lambda の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。データセット全体を使用し、モデルの交差検証を行ったときと同じオプションを指定して、各正則化強度について線形分類モデルに学習をさせます。モデルごとに非ゼロの係数を特定します。

Mdl = fitclinear(X,Ystats,'ObservationsIn','columns',...
    'Learner','logistic','Solver','sparsa','Regularization','lasso',...
    'Lambda',Lambda,'GradientTolerance',1e-8);
numNZCoeff = sum(Mdl.Beta~=0);

同じ図に、各正則化強度についての検定標本の誤差率と非ゼロ係数の頻度をプロットします。すべての変数を対数スケールでプロットします。

figure;
[h,hL1,hL2] = plotyy(log10(Lambda),log10(ce),...
    log10(Lambda),log10(numNZCoeff + 1)); 
hL1.Marker = 'o';
hL2.Marker = 'o';
ylabel(h(1),'log_{10} classification error')
ylabel(h(2),'log_{10} nonzero-coefficient frequency')
xlabel('log_{10} Lambda')
title('Test-Sample Statistics')
hold off

予測子変数のスパース性と分類誤差の低さのバランスがとれている正則化強度のインデックスを選択します。この場合、10-410-1 の値で十分なはずです。

idxFinal = 7;

選択した正則化強度のモデルを Mdl から選択します。

MdlFinal = selectModels(Mdl,idxFinal);

MdlFinal は、1 つの正則化強度が含まれている ClassificationLinear モデルです。新しい観測値のラベルを推定するには、MdlFinal と新しいデータを predict に渡します。

ヒント

複数のバイナリ線形分類予測モデルを構築する方法の 1 つに、次のようなものがあります。

  1. データの一部を検定用にホールドアウトします。

  2. fitclinear を使用してバイナリ線形分類モデルに学習をさせます。名前と値のペアの引数 'Lambda' を使用して正則化強度のグリッドを指定し、学習データを与えます。fitclinear は 1 つの ClassificationLinear モデル オブジェクトを返しますが、これには各正則化強度に対するモデルが含まれています。

  3. 各正則化モデルの品質を判断するため、返されたモデル オブジェクトとホールドアウトされたデータを loss などに渡します。

  4. 満足できる正則化モデルのサブセットのインデックス (idx) を識別し、返されたモデルとインデックスを selectModels に渡します。selectModels は 1 つの ClassificationLinear モデル オブジェクトを返しますが、これには numel(idx) 個の正則化モデルが含まれています。

  5. 新しいデータのクラス ラベルを予測するため、データと正則化モデルのサブセットを predict に渡します。

R2016a で導入