Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

margin

クラス: ClassificationLinear

線形分類モデルの分類マージン

説明

m = margin(Mdl,X,Y) は、X 内の予測子データと Y 内の対応するクラス ラベルを使用して、バイナリ線形分類モデル Mdl分類マージンを返します。m には、Mdl 内の各正則化強度に対する分類マージンが格納されます。

m = margin(Mdl,X,Y,'ObservationsIn',dimension) は、予測子データにおける観測値の次元を、'rows' (既定) または 'columns' のいずれかで指定します。たとえば、'ObservationsIn','columns' と指定して、予測子データの列が観測値に対応することを示します。

m = margin(Mdl,Tbl,ResponseVarName) は、table Tbl に含まれている予測子データと Tbl.ResponseVarName に含まれているクラス ラベルを使用して、学習済みの線形分類器 Mdl の分類マージンを返します。

m = margin(Mdl,Tbl,Y) は、table Tbl 内の予測子データとベクトル Y 内のクラス ラベルを使用して、分類器 Mdl の分類マージンを返します。

入力引数

すべて展開する

バイナリ線形分類モデル。ClassificationLinear モデル オブジェクトとして指定します。ClassificationLinear モデル オブジェクトは、fitclinear を使用して作成できます。

予測子データ。n 行 p 列の非スパース行列またはスパース行列を指定します。この X の配置は、各行が個々の観測値に、各列が個々の予測子変数に対応することを示しています。

メモ

観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns' を指定すると、計算時間が大幅に短縮される可能性があります。

Y の長さと X の観測値数は同じでなければなりません。

データ型: single | double

クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列を指定します。

  • Y のデータ型は Mdl.ClassNames のデータ型と同じでなければなりません。(string 配列は文字ベクトルの cell 配列として扱われます)。

  • Y の各クラスは Mdl.ClassNames のサブセットでなければなりません。

  • Y が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

  • Y の長さは X または Tbl の観測値の数と等しくなければなりません。

データ型: categorical | char | string | logical | single | double | cell

予測子データにおける観測値の次元。'columns' または 'rows' として指定します。

メモ

観測値が列に対応するように予測子行列を配置して 'ObservationsIn','columns' を指定すると、最適化実行時間が大幅に短縮される可能性があります。table の予測子データに対して 'ObservationsIn','columns' を指定することはできません。

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

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

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

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

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

応答変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。応答変数が文字配列の場合、各要素は配列の 1 つの行に対応しなければなりません。

データ型: char | string

出力引数

すべて展開する

分類マージン。数値列ベクトルまたは行列として返されます。

m は n 行 L 列です。n は X 内の観測値数、L は Mdl 内の正則化強度の数 (numel(Mdl.Lambda)) です。

m(i,j) は、正則化強度が Mdl.Lambda(j) である学習済み線形分類モデルを使用した、観測値 i の分類マージンです。

すべて展開する

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

load nlpdata

X は予測子データのスパース行列、Y はクラス ラベルの categorical ベクトルです。データには 2 つを超えるクラスがあります。

モデルでは、ある Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できなければなりません。したがって、Statistics and Machine Learning Toolbox™ のドキュメンテーション Web ページに対応するラベルを識別します。

Ystats = Y == 'stats';

あるドキュメンテーション Web ページの単語数が Statistics and Machine Learning Toolbox™ ドキュメンテーションによるものであるかどうかを識別できるバイナリ線形分類モデルに学習をさせます。観測値の 30% をホールドアウトするように指定します。SpaRSA を使用して目的関数を最適化します。

rng(1); % For reproducibility 
CVMdl = fitclinear(X,Ystats,'Solver','sparsa','Holdout',0.30);
CMdl = CVMdl.Trained{1};

CVMdlClassificationPartitionedLinear モデルです。これには Trained プロパティが含まれています。これは 1 行 1 列の cell 配列で、学習セットにより学習させた ClassificationLinear モデルが格納されています。

学習データとテスト データを分割の定義から抽出します。

trainIdx = training(CVMdl.Partition);
testIdx = test(CVMdl.Partition);

学習標本とテスト標本のマージンを推定します。

mTrain = margin(CMdl,X(trainIdx,:),Ystats(trainIdx));
mTest = margin(CMdl,X(testIdx,:),Ystats(testIdx));

CMdl 内の正則化強度は 1 つなので、mTrainmTest はそれぞれ長さが学習観測値数およびテスト観測値数に等しい列ベクトルになります。

箱ひげ図を使用して、両方のマージンのセットをプロットします。

figure;
boxplot([mTrain; mTest],[zeros(size(mTrain,1),1); ones(size(mTest,1),1)], ...
    'Labels',{'Training set','Test set'});
h = gca;
h.YLim = [-5 60];
title 'Training- and Test-Set Margins'

Figure contains an axes object. The axes object with title Training- and Test-Set Margins contains 14 objects of type line. One or more of the lines displays its values using only markers

学習セットとテスト セットでは、マージンの分布が同じように見えます。

特徴選択を行う方法の 1 つとして、複数のモデルからテスト標本マージンを比較します。この基準のみに基づくと、マージンが大きい方が分類器として優れています。

NLP のデータセットを読み込みます。テスト標本のマージンの推定で説明されているようにデータを前処理します。

load nlpdata
Ystats = Y == 'stats';
X = X';
rng(1); % For reproducibility

テスト用に観測値の 30% をホールドアウトするデータ分割を作成します。

Partition = cvpartition(Ystats,'Holdout',0.30);
testIdx = test(Partition); % Test-set indices
XTest = X(:,testIdx);     
YTest = Ystats(testIdx);

Partition は、データセットの分割を定義する cvpartition オブジェクトです。

予測子変数の 10% を無作為に選択します。

p = size(X,1); % Number of predictors
idxPart = randsample(p,ceil(0.1*p));

2 つのバイナリ線形分類モデルに学習をさせます。1 つではすべての予測子を、もう 1 つではランダムな 10% の予測子を使用します。観測値が列に対応することを指定し、SpaRSA を使用して目的関数を最適化します。

CVMdl = fitclinear(X,Ystats,'CVPartition',Partition,'Solver','sparsa',...
    'ObservationsIn','columns');
PCVMdl = fitclinear(X(idxPart,:),Ystats,'CVPartition',Partition,'Solver','sparsa',...
    'ObservationsIn','columns');

CVMdl および PCVMdlClassificationPartitionedLinear モデルです。

学習済みの ClassificationLinear モデルを交差検証済みモデルから抽出します。

CMdl = CVMdl.Trained{1};
PCMdl = PCVMdl.Trained{1};

分類器ごとにテスト標本マージンを推定します。箱ひげ図を使用して、マージン セットの分布をプロットします。

fullMargins = margin(CMdl,XTest,YTest,'ObservationsIn','columns');
partMargins = margin(PCMdl,XTest(idxPart,:),YTest,...
    'ObservationsIn','columns');

figure;
boxplot([fullMargins partMargins],'Labels',...
    {'All Predictors','10% of the Predictors'});
h = gca;
h.YLim = [-20 60];
title('Test-Sample Margins')

Figure contains an axes object. The axes object with title Test-Sample Margins contains 14 objects of type line. One or more of the lines displays its values using only markers

CMdl のマージン分布は PCMdl のマージン分布より高い位置にあります。

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

NLP のデータセットを読み込みます。テスト標本のマージンの推定で説明されているようにデータを前処理します。

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

Partition = cvpartition(Ystats,'Holdout',0.30);
testIdx = test(Partition);
XTest = X(:,testIdx);
YTest = Ystats(testIdx);

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

Lambda = logspace(-8,1,11);

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

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


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

Mdl = CVMdl.Trained{1}
Mdl = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'logit'
              Beta: [34023x11 double]
              Bias: [-11.4326 -11.4326 -11.4326 -11.4326 -11.4326 -7.1040 -5.2091 -3.6615 -3.0587 -2.9610 -2.9610]
            Lambda: [1.0000e-08 7.9433e-08 6.3096e-07 5.0119e-06 3.9811e-05 3.1623e-04 0.0025 0.0200 0.1585 1.2589 10]
           Learner: 'logistic'


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

テスト標本のマージンを推定します。

m = margin(Mdl,X(:,testIdx),Ystats(testIdx),'ObservationsIn','columns');
size(m)
ans = 1×2

        9471          11

11 個の正則化強度があるので、m は 11 列になります。

各正則化強度に対するテスト標本のマージンをプロットします。ロジスティック回帰スコアは [0,1] の範囲にあるので、マージンは [-1,1] の範囲にあります。グリッド全体でマージンを最大化する正則化強度を識別しやすくするため、マージンのスケールを変更します。

figure;
boxplot(10000.^m)
ylabel('Exponentiated test-sample margins')
xlabel('Lambda indices')

Figure contains an axes object. The axes object with xlabel Lambda indices, ylabel Exponentiated test-sample margins contains 77 objects of type line. One or more of the lines displays its values using only markers

いくつかの Lambda の値では、100001 の付近でマージンの分布が密になっています。Lambda の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。

マージンの分布の中心が低下する直前にある正則化強度を選択します。

LambdaFinal = Lambda(5);

データセット全体を使用して線形分類モデルに学習をさせます。目的の正則化強度を指定します。

MdlFinal = fitclinear(X,Ystats,'ObservationsIn','columns',...
    'Learner','logistic','Solver','sparsa','Regularization','lasso',...
    'Lambda',LambdaFinal);

新しい観測値のラベルを推定するには、MdlFinal と新しいデータを predict に渡します。

詳細

すべて展開する

拡張機能

バージョン履歴

R2016a で導入