Main Content

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

margin

クラス: ClassificationLinear

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

説明

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

m = margin(___,Name,Value) では、前の構文のいずれかと、1 つ以上の Name,Value ペア引数によって指定される追加オプションを使用します。たとえば、予測子データの列が観測値に対応することを指定できます。

入力引数

すべて展開する

バイナリ線形分類モデル。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 の観測値数は同じでなければなりません。

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

名前と値のペアの引数

オプションの Name,Value 引数のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

予測子データにおける観測値の次元。'ObservationsIn''columns' または 'rows' から構成されるコンマ区切りのペアとして指定します。

メモ

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

出力引数

すべて展開する

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

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'

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

特徴選択を行う方法の 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')

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 = 
  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 個のモデルであると考えることができます。

検定標本のマージンを推定します。

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')

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

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

LambdaFinal = Lambda(5);

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

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

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

詳細

すべて展開する

拡張機能

R2016a で導入