主要内容

改进判别分析模型

奇异数据的处理

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

提示

若要获得无故障的判别分析分类器,请设置DiscrimType名称-值对“pseudoLinear”“pseudoQuadratic”fitcdiscr

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

示例:奇异协方差矩阵

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

加载爆米花X =爆米花(:,[1 2]);X (:, 3) = 0;% a零方差列Y = popcorn(:,3);ppcrn = fitcdiscr (X, Y);使用ClassificationDiscriminant的错误(第635行)Predictor x3具有零方差。要么排除这个预测器,要么将'discrimType'设置为' pseudoolinear '或'diagLinear'。在classreg.learning错误。FitTemplate/fit(第243行)obj = this.MakeFitObject(X,Y,W,this.ModelParameters,fitArgs{:});fitcdiscr(第296行)this = fit(temp,X,Y);

要进行线性判别分析,请使用pseudoLineardiagLinear判别类型:

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 fishiris obj = fitcdiscr(meas,species);resuberror = resubLoss(obj) resuberror = 0.0200

替换误差很低,也就是说obj对几乎所有的Fisher虹膜数据进行了正确分类。错误分类的总数为:

resuberror * obj。NumObservations ans = 3.0000

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

R = confmat (obj. y,resubPredict(obj)) R = 50 0 0 0 48 2 0 1 49 obj. R = 50 0 0 0 48类名ans = 'setosa' 'versicolor' 'virginica'
  • R(1,:) = [50 0 0]意味着obj正确地分类了所有50个濑蝶。

  • R(2,:) = [0 48 2]意味着obj对48个彩虹膜进行了正确的分类,将2个彩虹膜错误地分类为virginica。

  • R(3,:) = [0 1 49]意味着obj对49个鸢尾属植物进行了正确的分类,并将1个鸢尾属植物错误地分类为彩色鸢尾。

交叉验证

通常,判别分析分类器是稳健的,当预测因子的数量远远少于观察数时,不会表现出过度训练。然而,交叉验证您的分类器以确保其稳定性是一个很好的实践。

鉴别分析分类器的交叉验证

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

加载样例数据。

负载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 fishiris obj = fitcdiscr(meas,species);resuberror = resubLoss(obj) resuberror = 0.0200 R = confmat (obj. y,resubPredict(obj)) R = 50 00 0 48 20 1 49 obj. resuberror = 0.0200 R = confmat (obj. y,resubPredict(obj))类名ans = 'setosa' 'versicolor' 'virginica'

    R(2,:) = [0 48 2]意味着obj对48个彩虹膜进行了正确的分类,将2个彩虹膜错误地分类为virginica。

  2. 更改成本矩阵,以减少将五彩鸢尾花分类为virginica的错误:

    obj.Cost(2、3)= 10;R2 = confmat (obj. y,resubPredict(obj)) R2 = 50 0 0 0 50 0 0 7 43

    obj现在正确地分类了所有的彩色虹膜,代价是增加了对虹膜的错误分类的数量17

示例:设置可选优先级

考虑Fisher虹膜数据。数据中每一种虹膜都有50个。假设,在一个特定的地区,你有历史数据表明,处女病的流行程度是其他类型的五倍。创建一个包含此信息的分类器。

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

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

    R(3,:) = [0 1 49]意味着obj对49个鸢尾属植物进行了正确的分类,并将1个鸢尾属植物错误地分类为彩色鸢尾。

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

    obj。先验= [1 1 5];R2 = confmat (obj. y,resubPredict(obj)) R2 = 50 0 0 0 46 4 0 0 50

    新的分类器正确地分类了所有的鸢尾花,代价是增加了多色鸢尾花的错误分类数量24

另请参阅

功能

对象

相关的话题

Baidu
map