主要内容

改善判别分析模型

处理奇异数据

判别分析需要足够的数据来拟合具有可逆协方差矩阵的高斯模型。如果您的数据不足以唯一地拟合此类模型,fitcdiscr失败。介绍故障的处理方法。

提示

要获得无故障的判别分析分类器,请设置歧视型名称-值对到“pseudoLinear”“伪二次”在里面fitcdiscr

“伪”鉴别永远不会失败,因为它们使用协方差矩阵∑的伪逆k(见品脱).

例如:奇异协方差矩阵

当拟合分类器的协方差矩阵奇异时,fitcdiscr可以失败:

加载爆米花X=爆米花(:,[1 2]);X(:,3)=0;%a零方差列Y=爆米花(:,3);ppcrn=fitcdiscr(X,Y);使用ClassificationDiscriminant(第635行)时出错预测器x3的方差为零。排除此预测器或将“discrimType”设置为“伪线性”或“诊断线性”。classreg.learning.FitTemplate/fit中的错误(第243行)obj=this.MakeFitObject(X,Y,W,this.ModelParameters,fitArgs{:});fitcdiscr(第296行)中的错误this=fit(temp,X,Y);

要继续进行线性判别分析,请使用pseudoLinear对角线性判别类型:

ppcrn = fitcdiscr (X, Y,…“discrimType”、“pseudoLinear”);meanpredict = predict(ppcrn,mean(X)

选择一个判别类型

有六种类型的判别分析分类器:线性和二次,与对角线每种类型的变体。

提示

若要查看协方差矩阵是否奇异,请设置discrimType“线性”“二次”.如果矩阵是单数,则fitcdiscr方法失败“二次”,伽马射线属性为非零“线性”

为了获得一个二次分类器,即使你的协方差矩阵是奇异的,集合歧视型“伪二次”“diagQuadratic”

obj=fitcdiscr(X,Y,'DiscrimType','pseudoQuadratic')%或'diagcdiquadratic'

通过设置discrimType名称-值对为:

  • “线性”(默认)-估计所有类别的一个协方差矩阵。

  • “二次”-为每个类别估计一个协方差矩阵。

  • “对角线性”-使用对角线“线性”协方差矩阵,必要时用它的伪逆。

  • “diagQuadratic”-使用图的对角线“二次”协方差矩阵,并在必要时使用其伪逆。

  • “pseudoLinear”-使用函数的伪逆“线性”协方差矩阵,如有必要。

  • “伪二次”-使用该函数的伪逆“二次”协方差矩阵,如有必要。

fitcdiscr可能会失败“线性”“二次”分类器。如果失败,它将返回一个解释,如中所示处理奇异数据

fitcdiscr始终使用对角线和伪变量成功。有关伪逆的信息,请参见品脱

在构造分类器后,可以使用点表示法设置区分类型:

obj。DiscrimType = 'discrimType

您可以在线性类型之间或二次类型之间更改,但不能在线性类型和二次类型之间更改。

检查重新替换错误和混淆矩阵

重新提交错误是响应训练数据与预测基于输入训练数据的响应之间的差异。如果重新提交错误很高,则无法期望对分类器的预测是好的。但是,具有低重新提交错误不保证对新数据的良好预测。重新提交错误通常是对新数据上预测错误的过度乐观估算。

混淆矩阵显示在重新替换过程中出现的错误数量和类型K类,混淆矩阵R是一个K-借-K矩阵

R (i, j)=类的观察次数分类器预测为类的j

示例:判别分析分类器的重新替换错误

检验默认判别分析分类器对Fisher虹膜数据的再替换错误:

Load fisheries obj = fitcdiscr(meas,species);resuberror = resubLoss(obj) resuberror = 0.0200

重新替换错误非常低,这意味着obj几乎所有的费雪虹膜数据都能正确分类。误分类总数为:

resuberror*obj.numobervations ans=3.0000

要查看这三种错误分类的细节,请检查混淆矩阵:

(obj. y,resubPredict(obj))) (obj. y,resubPredict(obj))ClassNames ans = 'setosa' 'versicolor' 'virginica' '
  • R(1,:) = [50 0 0]方法obj正确分类所有50个刚玉鸢尾。

  • R(2,:)=[0482]方法obj正确分类48个花斑,错误分类2个花斑为处女。

  • R(3,:)=[0149]方法obj将49个维吉尼亚虹膜正确分类,并将一个维吉尼亚虹膜错误分类为花色。

交叉验证

通常,判别分析分类器是稳健的,并且当预测值的数量远小于观察值的数量时,不会表现出过度训练。然而,交叉验证分类器以确保其稳定性是一种很好的做法。

交叉验证判别分析分类器

这个例子展示了如何对二次判别分析分类器进行五重交叉验证。

加载示例数据。

负载鱼腥草

为数据创建二次判别分析分类器。

quadisc=fitcdiscr(MEA、物种、,“DiscrimType”“二次”);

查找分类器的重新替换错误。

qerror = resubLoss (quadisc)
qerror=0.0200

分类器做得很好。然而,在对新数据进行分类时,再替代误差可以是误差的一个乐观估计。所以继续交叉验证。

创建交叉验证模型。

cvmodel = crossval (quadisc,“kfold”5);

找出模型的交叉验证损失,即未折叠观测值的误差。

cverror=kfoldLoss(cvmodel)
cverror = 0.0200

交叉验证的损失与原始的再取代损失一样低。因此,您可以相信分类器是相当准确的。

更改成本和优先级

有时你想避免比其他人更多的错误分类错误。例如,可能更好地具有过敏的癌症检测而不是不统留的癌症检测。过敏检测提供了更荧光(不必要的测试或治疗)。不敏感的检测给出了更多的假阴性(可预防的疾病或死亡)。不适应的后果可以很高。因此,您可能希望设置成本以反映后果。

同样,训练数据Y可以有一个不代表它们的真实频率的类分布。如果你对真实频率有更好的估计,你可以在分类中包含这些知识之前财产。

例如:设置自定义误分类成本

以Fisher虹膜数据为例。假设将花斑鸢尾花分类为维京鸢尾花的成本是其他分类错误的10倍。从数据创建分类器,然后合并此开销,然后查看结果分类器。

  1. 加载Fisher虹膜数据并创建默认(线性)分类器,如中所示示例:判别分析分类器的重新替换错误

    Load fisheries obj = fitcdiscr(meas,species);resuberror = resubLoss(obj) resuberror = 0.0200 R = confusionmat(obj. y,resubPredict(obj)) R = 50 00 0 48 20 1 49 obj. resuberror (obj)ClassNames ans = 'setosa' 'versicolor' 'virginica' '

    R(2,:)=[0482]方法obj正确分类48个花斑,错误分类2个花斑为处女。

  2. 更改成本矩阵,以减少将花色虹膜分类为弗吉尼亚虹膜的错误:

    目标成本(2,3)=10;R2=confusionmat(对象Y,再预测(对象))R2=50 0 50 0 7 43

    obj现在能正确地分类所有花斑鸢尾,但代价是增加了弗吉尼亚鸢尾的错误分类数量17

示例:设置备选优先级

考虑Fisher虹膜数据。数据中有50种虹膜。假设在一个特定的地区,你有历史数据表明弗吉尼亚州的流行率是其他种类的五倍。创建包含此信息的分类器。

  1. 加载Fisher虹膜数据并创建默认(线性)分类器,如中所示示例:判别分析分类器的重新替换错误

    Load fisheries obj = fitcdiscr(meas,species);resuberror = resubLoss(obj) resuberror = 0.0200 R = confusionmat(obj. y,resubPredict(obj)) R = 50 00 0 48 20 1 49 obj. resuberror (obj)ClassNames ans = 'setosa' 'versicolor' 'virginica' '

    R(3,:)=[0149]方法obj将49个维吉尼亚虹膜正确分类,并将一个维吉尼亚虹膜错误分类为花色。

  2. 更改prior以匹配您的历史数据,并检查新分类器的混淆矩阵:

    对象优先级=[1 1 5];R2=混淆矩阵(对象Y,再预测(对象))R2=50 0 0 46 4 0 50

    新的分类器能正确地分类所有的维京鸢尾,但代价是增加了对花斑鸢尾的错误分类24

另请参阅

功能

对象

相关话题