主要内容

改进判别分析模型

处理奇异数据

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

提示

要获得一个正确的判别分析分类器,请设置DiscrimType名称-值对“pseudoLinear”“pseudoQuadratic”fitcdiscr

“伪”鉴别器从来不会失败,因为它们使用协方差矩阵Σ的伪逆k(见pinv).

例如:奇异协方差矩阵

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

load popcorn X = popcorn(:,[1 2]);X (:, 3) = 0;% a零方差列Y =爆米花(:,3);ppcrn = fitcdiscr (X, Y);使用分类判别器的误差(第635行)Predictor x3的方差为零。要么排除这个预测器,要么将“discritype”设置为“伪线性”或“diagLinear”。在classreg.learning错误。obj = this.MakeFitObject(X,Y,W,this.ModelParameters,fitArgs{:});Error in fitcdiscr (line 296) this = fit(temp,X,Y);

为了继续进行线性判别分析,使用apseudoLineardiagLinear判别类型:

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

选择一个判别类型

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

提示

看看协方差矩阵是否奇异,集合discrimType“线性”“二次”.如果矩阵是奇异的fitcdiscr方法失败“二次”,γ属性为非零“线性”

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

obj = fitcdiscr(X,Y,' discritype ',' pseudo二次')%或' diag二次'

属性来选择分类器类型discrimType名称-值对为:

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

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

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

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

  • “pseudoLinear”-使用的伪逆“线性”如果需要协方差矩阵。

  • “pseudoQuadratic”-使用的伪逆“二次”如果需要协方差矩阵。

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

fitcdiscr对角线和伪变量总是成功的。有关伪逆的信息,请参见pinv

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

obj。DiscrimType = 'discrimType

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

检查再替换错误和混淆矩阵

resubstitution错误是响应训练数据与分类器基于输入训练数据对响应做出的预测之间的差值。如果重新替换错误很高,就不能期望分类器的预测很好。然而,低的再替代误差并不能保证对新数据的良好预测。再替代误差通常是对新数据的预测误差的过于乐观的估计。

混淆矩阵显示在重新替换中产生的错误数量和类型。当有K类,混淆矩阵R是一个K——- - - - - -K矩阵

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

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

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

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

再替换错误很低,意思是obj几乎所有的费雪虹膜数据都能正确分类。误分类总数为:

resuberror * obj。NumObservations = 3.0000

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

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

  • R(2,:) = [0 48 2]意味着obj正确分类48个花斑,错误分类2个花斑为处女。

  • R(3,:) = [0 1 49]意味着obj正确分类49个维珍鸢尾,错误分类一个维珍鸢尾为花斑。

交叉验证

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

交叉验证判别分析分类器

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

加载示例数据。

负载fisheriris

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

quadisc = fitcdiscr(量、种类、“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,:) = [0 48 2]意味着obj正确分类48个花斑,错误分类2个花斑为处女。

  2. 更改成本矩阵,以减少将花斑虹膜分类为virginica的错误:

    obj.Cost(2、3)= 10;R2 = obj. y,resubPredict(obj)

    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,:) = [0 1 49]意味着obj正确分类49个维珍鸢尾,错误分类一个维珍鸢尾为花斑。

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

    obj。Prior = [1 1 5];R2 = obj. y,resubPredict(obj)

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

另请参阅

功能

对象

相关的话题