Main Content

判別分析モデルの改善

特異データの取扱い

判別分析には、可逆共分散行列でガウス モデルを当てはめるのに十分なデータが必要です。このようなモデルを一意に当てはめるのにデータが不十分な場合、fitcdiscr は失敗します。ここでは、この失敗を処理するための方法を示します。

ヒント

失敗なしに判別分析分類器を取得するには、DiscrimType 名前と値のペアを fitcdiscr'pseudoLinear' または 'pseudoQuadratic' に設定します。

"疑似" 判別式は、共分散行列 Σk の疑似逆行列を使用するため、失敗しません (「pinv」を参照)。

例: 特異な共分散行列

近似した分類器の共分散行列が特異である場合、fitcdiscr は失敗する可能性があります。

load popcorn
X = popcorn(:,[1 2]);
X(:,3) = 0; % a zero-variance column
Y = popcorn(:,3);
ppcrn = fitcdiscr(X,Y);

Error using ClassificationDiscriminant (line 635)
Predictor x3 has zero variance. Either exclude this predictor or set 'discrimType' to
'pseudoLinear' or 'diagLinear'.

Error in classreg.learning.FitTemplate/fit (line 243)
            obj = this.MakeFitObject(X,Y,W,this.ModelParameters,fitArgs{:});

Error in fitcdiscr (line 296)
            this = fit(temp,X,Y);

線形判別分析を続けるには、pseudoLinear または diagLinear 判別タイプを使用します。

ppcrn = fitcdiscr(X,Y,...
    'discrimType','pseudoLinear');
meanpredict = predict(ppcrn,mean(X))

meanpredict =
    3.5000

判別タイプの選択

判別分析分類器には 6 つのタイプがあります。線形タイプと 2 次タイプがあり、さらにタイプごとに "対角" バリアントおよび "疑似" バリアントを含みます。

ヒント

共分散行列が特異かどうかを調べるには、discrimType'linear' または 'quadratic' に設定します。行列が特異である場合、メソッド fitcdiscr'quadratic' では失敗し、'linear' では Gamma プロパティが非ゼロとなります。

共分散行列が特異である場合にも 2 次分類器を取得するには、DiscrimType'pseudoQuadratic' または 'diagQuadratic' に設定します。

obj = fitcdiscr(X,Y,'DiscrimType','pseudoQuadratic') % or 'diagQuadratic'

discrimType 名前と値のペアを次のいずれかに設定して、分類器タイプを選択します。

  • 'linear' (既定) — すべてのクラスに対して、1 つの共分散行列を推定します。

  • 'quadratic' — クラスごとに 1 つの共分散行列を推定します。

  • 'diagLinear''linear' 共分散行列の対角を使用し、必要に応じて、その疑似逆行列を使用します。

  • 'diagQuadratic''quadratic' 共分散行列の対角を使用し、必要に応じて、その疑似逆行列を使用します。

  • 'pseudoLinear' — 必要に応じて、'linear' 共分散行列の疑似逆行列を使用します。

  • 'pseudoQuadratic' — 必要に応じて、'quadratic' 共分散行列の疑似逆行列を使用します。

fitcdiscr は、'linear' および 'quadratic' 分類器で失敗する場合があります。失敗する場合、特異データの取扱いで示したような説明が返されます。

fitcdiscr は、対角バリアントと疑似バリアントを使用すると必ず成功します。疑似逆行列の詳細は、pinv を参照してください。

分類器を作成した後で、ドット表記によって、判別タイプを設定することができます。

obj.DiscrimType = 'discrimType'

線形タイプ間または 2 次タイプ間での変更は可能ですが、線形タイプと 2 次タイプの間の変更はできません。

再代入誤差および混同行列の検査

"再代入誤差"は、応答学習データと、入力学習データに基づいて分類器で作成される応答の予測との差分です。再代入誤差が大きい場合には、分類器の予測結果が良好であることを期待することはできません。ただし、再代入誤差が小さい場合であっても、新しいデータに対する予測が必ずしも優れているとは限りません。再代入誤差では、新しいデータに対する予測誤差について過度に楽観的な推定が行われる場合が少なくありません。

"混同行列"は、再代入時に生じる誤差の数とタイプを示します。K クラスがある場合、混同行列 R は次の値をもつ KK 列の行列です。

R(i,j) = クラス j になると分類器が予測するクラス i の観測値の個数。

例: 判別分析分類器の再代入誤差

フィッシャーのアヤメのデータについて、既定の判別分析分類器の再代入誤差を検査します。

load fisheriris
obj = fitcdiscr(meas,species);
resuberror = resubLoss(obj)

resuberror =
    0.0200

再代入誤差は非常に小さく、つまり、obj はフィッシャーのアヤメのデータをほとんど正確に分類しています。誤分類の総数は、以下のとおりです。

resuberror * obj.NumObservations

ans =
    3.0000

3 種類の誤分類の詳細を見るには、混同行列を調べます。

R = confusionmat(obj.Y,resubPredict(obj))

R =
    50     0     0
     0    48     2
     0     1    49

obj.ClassNames

ans = 
    'setosa'
    'versicolor'
    'virginica'
  • R(1,:) = [50 0 0] は、obj が 50 のアヤメ (setosa) をすべて正しく分類していることを示しています。

  • R(2,:) = [0 48 2]obj が 48 のアヤメ (versicolor) を正しく分類し、2 つの アヤメ (versicolor) を誤分類していることを意味します。

  • R(3,:) = [0 1 49]obj が 49 のアヤメ (virginica) を正しく分類し、1 つの アヤメ (virginica) を誤分類していることを意味します。

交差検証

通常、判別分析分類器は堅牢で、予測子の数が観測の数よりもはるかに少ない場合でも過学習を示すことはありません。それでも、安定性を確保するために、交差検証を実施することをお勧めします。

判別分析分類器の交差検証

この例では、2 次判別分析分類器の 5 分割交差検証の実施方法を示します。

標本データを読み込みます。

load fisheriris

データの 2 次判別分析分類器を作成します。

quadisc = fitcdiscr(meas,species,'DiscrimType','quadratic');

分類器の再代入誤差を求めます。

qerror = resubLoss(quadisc)
qerror = 0.0200

分類器は適切に動作しています。それでも、再代入誤差では、新しいデータを分類するときに誤差について楽観的な推定が行われる場合があります。このため、交差検証に進みます。

交差検証済みモデルを作成します。

cvmodel = crossval(quadisc,'kfold',5);

モデルの交差検証損失、つまり、分割外の観測値の誤差を求めます。

cverror = kfoldLoss(cvmodel)
cverror = 0.0200

交差検証損失は、元の再代入損失と同じ程度の低さです。このため、分類器が適切な精度を保っていると信頼できます。

コストおよび事前確率の変更

特定の誤分類誤差をその他のものよりも低くする場合があります。たとえば、癌の検出の場合、感度が低すぎるよりも高すぎる方が適切な場合もあります。検出の感度が高すぎると、偽陽性 (不必要な検査や治療) が多くなります。検出の感度が低すぎると、偽陰性 (予防可能な疾患や死亡) が多くなります。感度の低い検出の結果の方がリスクが高くなる可能性があります。このため、結果を反映するようにコストを設定する場合があります。

同様に、学習データ Y は、真の頻度を表さないクラスの分布をもつ場合があります。真の頻度をより正確に推定できれば、この知識を分類 Prior のプロパティに含めることができます。

例: 誤分類コストのカスタム設定

フィッシャーのアヤメのデータを検討します。versicolor のアヤメを virginica と分類するコストは、他の分類誤差よりも 10 倍大きいとします。このデータから分類器を作成し、このコストを含めて、結果の分類器を表示します。

  1. フィッシャーのアヤメのデータを読み込み、例: 判別分析分類器の再代入誤差で示すように既定の (線形) 分類器を作成します。

    load fisheriris
    obj = fitcdiscr(meas,species);
    resuberror = resubLoss(obj)
    
    resuberror =
        0.0200
    
    R = confusionmat(obj.Y,resubPredict(obj))
    
    R =
        50     0     0
         0    48     2
         0     1    49
    
    obj.ClassNames
    
    ans = 
        'setosa'
        'versicolor'
        'virginica'

    R(2,:) = [0 48 2]obj が 48 のアヤメ (versicolor) を正しく分類し、2 つの アヤメ (versicolor) を誤分類していることを意味します。

  2. コスト行列を変更して、versicolor のアヤメを virginica と分類するエラーが少なくなるようにします。

    obj.Cost(2,3) = 10;
    R2 = confusionmat(obj.Y,resubPredict(obj))
    
    R2 =
        50     0     0
         0    50     0
         0     7    43

    これで、virginica のアヤメの誤分類の数が 1 から 7 に増える代わりに、obj は versicolor のアヤメをすべて正しく分類するようになります。

例: 代替事前確率の設定

フィッシャーのアヤメのデータを検討します。データには各種類のアヤメが 50 あります。特定の地域で、virginica が他の種類よりも 5 倍多く広まっていることを示す履歴データがあるとします。この情報を含む分類器を作成します。

  1. フィッシャーのアヤメのデータを読み込み、例: 判別分析分類器の再代入誤差で示すように既定の (線形) 分類器を作成します。

    load fisheriris
    obj = fitcdiscr(meas,species);
    resuberror = resubLoss(obj)
    
    resuberror =
        0.0200
    
    R = confusionmat(obj.Y,resubPredict(obj))
    
    R =
        50     0     0
         0    48     2
         0     1    49
    
    obj.ClassNames
    
    ans = 
        'setosa'
        'versicolor'
        'virginica'

    R(3,:) = [0 1 49]obj が 49 のアヤメ (virginica) を正しく分類し、1 つの アヤメ (virginica) を誤分類していることを意味します。

  2. 事前確率を履歴データに合うように変更し、新しい分類器の混同行列を調べます。

    obj.Prior = [1 1 5];
    R2 = confusionmat(obj.Y,resubPredict(obj))
    
    R2 =
        50     0     0
         0    46     4
         0     0    50

    これで、versicolor のアヤメの誤分類の数が 2 から 4 に増える代わりに、新しい分類器は versicolor のアヤメをすべて正しく分類するようになります。

参考

関数

オブジェクト

関連するトピック