Main Content

kfoldEdge

学習で使用しない観測値の分類エッジ

説明

e = kfoldEdge(CVMdl) は、交差検証済みのバイナリ線形分類モデル CVMdl によって取得した交差検証済みの分類エッジを返します。つまり、他のすべての観測値を使用して学習させるときにホールドアウトした観測値の分類エッジを、kfoldEdge はすべての分割について推定します。

e には、CVMdl から構成される線形分類モデルの各正則化強度に対する分類エッジが格納されます。

e = kfoldEdge(CVMdl,Name,Value) は、1 つ以上の Name,Value 引数のペアによって指定された追加オプションを使用します。たとえば、エッジの計算に使用する分割を指定します。

入力引数

すべて展開する

交差検証済みバイナリ線形分類モデル。ClassificationPartitionedLinear モデル オブジェクトとして指定します。ClassificationPartitionedLinear モデル オブジェクトを作成するには、fitclinear を使用し、交差検証用の名前と値のペアの引数のいずれか 1 つ (CrossVal など) を指定します。

推定値を取得するため、kfoldEdge は線形分類モデルの交差検証に使用したものと同じデータ (X および Y) を適用します。

名前と値の引数

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

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

分類スコアの予測に使用する分割のインデックス。'Folds' と正の整数の数値ベクトルから構成されるコンマ区切りのペアとして指定します。Folds の要素は 1 から CVMdl.KFold の範囲でなければなりません。

例: 'Folds',[1 4 10]

データ型: single | double

エッジの集約レベル。'Mode''average' または 'individual' から構成されるコンマ区切りのペアとして指定します。

説明
'average'分割全体で平均した分類エッジを返す
'individual'各分割について分類エッジを返す

例: 'Mode','individual'

出力引数

すべて展開する

交差検証済みの分類エッジ。数値スカラー、ベクトルまたは行列として返されます。

交差検証済みモデルの正則化強度の個数を L (つまり、L は numel(CVMdl.Trained{1}.Lambda))、分割数 (CVMdl.KFold に格納) を F とします。

  • Mode'average' の場合、e は 1 行 L 列のベクトルになります。e(j) は、正則化強度 j を使用する交差検証済みモデルのすべての分割に対する平均分類エッジです。

  • それ以外の場合、eFL 列の行列になります。e(i,j) は、正則化強度 j を使用する交差検証済みモデルの分割 i に対する分類エッジです。

kfoldEdgee を推定するため、CVMdl を作成したデータを使用します (XY を参照)。

すべて展開する

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™ ドキュメンテーションによるものであるかどうかを識別できるバイナリ線形分類モデルの交差検証を行います。

rng(1); % For reproducibility 
CVMdl = fitclinear(X,Ystats,'CrossVal','on');

CVMdlClassificationPartitionedLinear モデルです。既定では、10 分割交差検証が実行されます。'KFold' 名前と値のペアの引数を使用して分割数を変更できます。

分割外のエッジの平均を推定します。

e = kfoldEdge(CVMdl)
e = 8.1243

あるいは、kfoldEdge 内の名前と値のペアの引数 'Mode','individual' を指定することで各分割エッジを取得できます。

特徴選択を実行する方法の 1 つは、複数のモデルの k 分割エッジを比較することです。この条件のみに基づくと、エッジが最高となる分類器が最善の分類器となります。

NLP のデータセットを読み込みます。k 分割交差検証エッジの推定で説明されているようにデータを前処理します。

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

2 つのデータセットを作成します。

  • fullX にはすべての予測子が含まれます。

  • partX には、無作為に選択した予測子の 1/2 が含まれます。

rng(1); % For reproducibility
p = size(X,1); % Number of predictors
halfPredIdx = randsample(p,ceil(0.5*p));
fullX = X;
partX = X(halfPredIdx,:);

2 つのバイナリ線形分類モデルを交差検証します。1 つではすべての予測子を、もう 1 つでは半分の予測子を使用します。観測値が列に対応することを指定し、SpaRSA を使用して目的関数を最適化します。

CVMdl = fitclinear(fullX,Ystats,'CrossVal','on','Solver','sparsa',...
    'ObservationsIn','columns');
PCVMdl = fitclinear(partX,Ystats,'CrossVal','on','Solver','sparsa',...
    'ObservationsIn','columns');

CVMdl および PCVMdlClassificationPartitionedLinear モデルです。

各分類器について k 分割エッジを推定します。

fullEdge = kfoldEdge(CVMdl)
fullEdge = 16.5629
partEdge = kfoldEdge(PCVMdl)
partEdge = 13.9030

k 分割エッジによれば、すべての予測子を使用する分類器の方がモデルとして優れています。

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

NLP のデータセットを読み込みます。k 分割交差検証エッジの推定で説明されているようにデータを前処理します。

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

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

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

5 分割の交差検証と各正則化強度を使用して、バイナリ線形分類モデルを交差検証します。SpaRSA を使用して目的関数を最適化します。目的関数の勾配の許容誤差を 1e-8 に下げます。

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


  Properties, Methods

CVMdlClassificationPartitionedLinear モデルです。fitclinear は 5 分割の交差検証を実装するので、各分割について学習させる 5 つの ClassificationLinear モデルが CVMdl に格納されます。

各分割および正則化強度のエッジを推定します。

eFolds = kfoldEdge(CVMdl,'Mode','individual')
eFolds = 5×11

    0.9958    0.9958    0.9958    0.9958    0.9958    0.9924    0.9769    0.9240    0.8323    0.8127    0.8127
    0.9991    0.9991    0.9991    0.9991    0.9991    0.9938    0.9780    0.9203    0.8262    0.8128    0.8128
    0.9992    0.9992    0.9992    0.9992    0.9992    0.9941    0.9781    0.9183    0.8267    0.8128    0.8128
    0.9974    0.9974    0.9974    0.9974    0.9974    0.9931    0.9773    0.9197    0.8486    0.8130    0.8130
    0.9976    0.9976    0.9976    0.9976    0.9976    0.9942    0.9782    0.9122    0.8397    0.8127    0.8127

eFolds は 5 行 11 列のエッジの行列です。行は分割に、列は Lambda の正則化強度に対応します。eFolds を使用して、性能が低い分割、つまり非常に低いエッジを特定します。

各正則化強度について、すべての分割に対する平均エッジを推定します。

e = kfoldEdge(CVMdl)
e = 1×11

    0.9978    0.9978    0.9978    0.9978    0.9978    0.9935    0.9777    0.9189    0.8347    0.8128    0.8128

各正則化強度について 5 分割エッジの平均をプロットすることにより、モデルがどの程度一般化を行うかを判断します。グリッド全体で 5 分割エッジを最大化する正則化強度を特定します。

figure;
plot(log10(Lambda),log10(e),'-o')
[~, maxEIdx] = max(e);
maxLambda = Lambda(maxEIdx);
hold on
plot(log10(maxLambda),log10(e(maxEIdx)),'ro');
ylabel('log_{10} 5-fold edge')
xlabel('log_{10} Lambda')
legend('Edge','Max edge')
hold off

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Edge, Max edge.

いくつかの Lambda の値で同じようにエッジが高くなっています。Lambda の値が大きくなると、予測子変数がスパースになります。これは分類器の品質として優れています。

エッジが低下する直前にある正則化強度を選択します。

LambdaFinal = Lambda(5);

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

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

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

詳細

すべて展開する

バージョン履歴

R2016a で導入

すべて展開する