主要内容

分类

这个例子展示了如何使用判别分析、朴素贝叶斯分类器和决策树执行分类。假设您有一个数据集,其中包含对不同变量(称为预测器)及其已知的类标签的测量结果。如果你获得了新的观测值的预测值,你能确定这些观测值可能属于哪一类吗?这就是分类的问题。

费雪的虹膜数据

Fisher的虹膜数据包括150个虹膜标本的萼片长度、萼片宽度、花瓣长度和花瓣宽度的测量。三个物种各有50个标本。载入数据,看看不同物种的萼片测量值有何不同。您可以使用包含萼片测量的两列。

负载fisheririsf =图;gscatter(量(:1)量(:,2),物种,“rgb”osd的);包含(“花萼长度”);ylabel (萼片宽的);

图中包含一个axes对象。坐标轴对象包含3个line类型的对象。这些物品代表了彩色,彩色,处女。

1) N =大小(量;

假设您测量了虹膜的萼片和花瓣,并需要根据这些测量结果确定其种类。解决这个问题的一种方法被称为鉴别分析。

线性和二次判别分析

fitcdiscr函数可以使用不同类型的判别分析进行分类。首先使用默认的线性判别分析(LDA)对数据进行分类。

lda = fitcdiscr(量(:,1:2),物种);ldaClass = resubPredict (lda);

具有已知类标签的观测值通常称为训练数据。现在计算替换误差,它是训练集上的错误分类误差(错误分类观察的比例)。

ldaResubErr = resubLoss (lda)
ldaResubErr = 0.2000

你也可以在训练集中计算混淆矩阵。混淆矩阵包含关于已知类标签和预测类标签的信息。一般来说,混淆矩阵中的(i,j)元素是已知类标签为i类、预测类为j的样本数量,对角元素代表正确分类的观测值。

图ldaResubCM = confusichart(物种,ldaClass);

图包含一个类型为confusimatrixchart的对象。

在150个训练观测值中,有20%或30个观测值被线性判别函数误分类。你可以通过在分类错误的点上画X来判断它们是哪些。

图(f) bad = ~strcmp(ldaClass,species);持有;情节(量(坏,1),量(坏,2),“kx”);持有

图中包含一个axes对象。axis对象包含4个line类型的对象。这些物品代表了彩色,彩色,处女。

该函数将平面划分为用线划分的区域,并将不同的区域分配给不同的物种。可视化这些区域的一种方法是创建一个网格(x, y)值,并将分类函数应用到该网格。

(x, y) = meshgrid (4: .1:8, 2: .1:4.5);x = x (:);y = y (:);J =分类([x y],meas(:,1:2),种);gscatter (x, y, j,“伽马线暴”‘草地’

图中包含一个axes对象。坐标轴对象包含3个line类型的对象。这些物品代表了五彩缤纷,色彩斑斓,童贞。

对于某些数据集,不同类的区域没有很好地用线分隔。在这种情况下,线性判别分析是不合适的。相反,您可以对我们的数据尝试二次判别分析(QDA)。

计算二次判别分析的替换误差。

qda = fitcdiscr(量(:,1:2),物种,“DiscrimType”“二次”);qdaResubErr = resubLoss (qda)
qdaResubErr = 0.2000

你已经计算了替换误差。通常人们更感兴趣的是测试误差(也称为泛化误差),它是一个独立集合上的预期预测误差。事实上,替换误差很可能会低估测试误差。

在这种情况下,您没有另一个标记数据集,但可以通过交叉验证来模拟一个。分层的10倍交叉验证是估计分类算法测试误差的常用方法。它将训练集随机分为10个互不相交的子集。每个子集的大小和类比例与训练集大致相同。删除一个子集,使用其他9个子集训练分类模型,并使用训练过的模型对删除的子集进行分类。您可以通过每次删除一个子集来重复此操作。

由于交叉验证随机划分数据,其结果取决于初始的随机种子。要在本例中重现精确的结果,执行以下命令:

rng (0,“旋风”);

第一次使用cvpartition生成10个不相交的分层子集。

cp = cvpartition(物种,“KFold”, 10)
cp = K-fold交叉验证分区NumObservations: 150 NumTestSets: 10 TrainSize: 135 135 135 135 135 135 135 135 135 135 TestSize: 15 15 15 15 15 15 15 15 15 15 15 15 15

crossval而且kfoldLoss方法可以利用给定的数据分区估计LDA和QDA的误分类误差cp

使用10倍分层交叉验证估计LDA的真实测试误差。

cvlda = crossval (lda,“CVPartition”, cp);ldaCVErr = kfoldLoss (cvlda)
ldaCVErr = 0.2000

LDA交叉验证误差与该数据上的LDA替换误差值相同。

用10倍分层交叉验证估计QDA的真实检验误差。

cvqda = crossval (qda,“CVPartition”, cp);qdaCVErr = kfoldLoss (cvqda)
qdaCVErr = 0.2200

QDA的交叉验证误差略大于LDA。这表明,一个更简单的模型可能比一个更复杂的模型获得相当或更好的性能。

朴素贝叶斯分类器

fitcdiscr函数还有另外两种类型,“DiagLinear”而且“DiagQuadratic”.它们类似于“线性”而且“二次”,但用对角协方差矩阵估计。这些对角线选择是朴素贝叶斯分类器的特定示例,因为它们假设变量在给定类标签的条件下是独立的。朴素贝叶斯分类器是最流行的分类器之一。虽然一般情况下,变量之间类-条件独立的假设是不正确的,朴素贝叶斯分类器已经被发现在许多数据集的实践中工作得很好。

fitcnb函数可以用来创建更一般类型的朴素贝叶斯分类器。

首先用高斯分布对每个类中的每个变量建模。你可以计算替换误差和交叉验证误差。

nbGau = fitcnb(meas(:,1:2),物种);nbGauResubErr = resubLoss (nbGau)
nbGauResubErr = 0.2200
nbGauCV = crossval (nbGau,“CVPartition”, cp);nbGauCVErr = kfoldLoss (nbGauCV)
nbGauCVErr = 0.2200
labels = predict(nbGau, [x y]);gscatter (x, y,标签,“伽马线暴”‘草地’

图中包含一个axes对象。坐标轴对象包含3个line类型的对象。这些物品代表了五彩缤纷,色彩斑斓,童贞。

到目前为止,您假设每个类的变量具有多元正态分布。通常这是一个合理的假设,但有时你可能不愿意做这样的假设,或者你可能清楚地看到它是无效的。现在试着用核密度估计来建模每个类中的每个变量,这是一种更灵活的非参数技术。这里我们将内核设置为盒子

nbKD = fitcnb(meas(:,1:2),物种,“DistributionNames”“内核”“内核”“盒子”);nbKDResubErr = resubLoss (nbKD)
nbKDResubErr = 0.2067
nbKDCV = crossval (nbKD,“CVPartition”, cp);nbKDCVErr = kfoldLoss (nbKDCV)
nbKDCVErr = 0.2133
labels = predict(nbKD, [x y]);gscatter (x, y,标签,“rgb”osd的

图中包含一个axes对象。坐标轴对象包含3个line类型的对象。这些物品代表了彩色,彩色,处女。

对于该数据集,具有核密度估计的朴素贝叶斯分类器比具有高斯分布的朴素贝叶斯分类器获得了更小的再替代误差和交叉验证误差。

决策树

另一种分类算法是基于决策树。决策树是一组简单的规则,例如“如果萼片长度小于5.45,则将该标本归类为setosa。”决策树也是非参数的,因为它们不需要对每个类中变量的分布进行任何假设。

fitctree函数创建决策树。为虹膜数据创建一个决策树,看看它如何将虹膜分类为物种。

T = fitctree(meas(:,1:2),物种,“PredictorNames”, {“SL”“西南”});

看看决策树方法是如何划分平面的很有趣。使用与上面相同的技术来可视化分配给每个物种的区域。

[grpname,node] = predict(t,[x y]);grpname gscatter (x, y,“伽马线暴”‘草地’

图中包含一个axes对象。坐标轴对象包含3个line类型的对象。这些物品代表了五彩缤纷,色彩斑斓,童贞。

另一种可视化决策树的方法是绘制决策规则和类分配的图表。

视图(t)“模式”“图”);

{

这棵看起来杂乱的树使用一系列形式为“SL < 5.45”的规则将每个样本划分为19个终端节点中的一个。要确定一个观察的物种分配,从顶部节点开始并应用规则。如果这个点满足规则,你走左边的路,如果不满足,你走右边的路。最终到达一个终端节点,将观测结果分配给三种物种中的一种。

计算决策树的替换误差和交叉验证误差。

dtResubErr = resubLoss (t)
dtResubErr = 0.1333
cvt = crossval (t)“CVPartition”, cp);dtCVErr = kfoldLoss (cvt)
dtCVErr = 0.3000

对于决策树算法,交叉验证误差估计明显大于替换误差。这表明生成的树过度拟合了训练集。换句话说,这是一棵对原始训练集分类很好的树,但树的结构对这个特定的训练集很敏感,因此它在新数据上的性能可能会下降。对于新数据,通常可以找到比复杂树性能更好的简单树。

试着修剪这棵树。首先计算原始树的各个子集的替换误差。然后计算这些子树的交叉验证误差。图表显示,再替换误差过于乐观。它总是随着树大小的增长而减少,但是超过一定的点,增加树的大小会增加交叉验证错误率。

resubcost = resubLoss (t)“子树”“所有”);(成本、secost ntermnodes bestlevel] = cvloss (t)“子树”“所有”);情节(ntermnodes、成本“b -”ntermnodes resubcost,“r——”)图(gcf);包含(“终端节点数量”);ylabel (“成本(误分类错误)”)传说(交叉验证的“Resubstitution”

图中包含一个axes对象。坐标轴对象包含两个line类型的对象。这些对象代表交叉验证、替换。

你应该选择哪棵树?一个简单的规则是选择交叉验证错误最小的树。虽然这可能是令人满意的,但如果简单的树大致与更复杂的树一样好,您可能更喜欢使用简单的树。对于本例,取一个与最小值有一个标准误差的最简单树。方法使用的默认规则cvloss的方法ClassificationTree

你可以在图上通过计算临界值来显示这一点,临界值等于最小成本加上一个标准误差。计算的“最佳”级别cvloss方法是这个截止点下最小的树。(注意,bestlevel=0对应于未修剪的树,因此您必须添加1以将其用作输出的向量的索引cvloss.)

[mincost, minloc] = min(成本);截断= mincost + secst (minloc);持有Plot ([0 20], [cutoff cutoff],凯西:”)情节(ntermnodes (bestlevel + 1)、成本(bestlevel + 1),“莫”)传说(交叉验证的“Resubstitution”'Min + 1 std. err.'“最好的选择”)举行

图中包含一个axes对象。axis对象包含4个line类型的对象。这些对象表示交叉验证,替换,最小值+ 1 std. err。,最好的选择。

最后,您可以查看修剪后的树,并为其计算估计的错误分类错误。

pt =修剪(t)“水平”, bestlevel);视图(pt,“模式”“图”

{

成本(bestlevel + 1)
ans = 0.2467

结论

这个例子展示了如何在MATLAB®中使用统计和机器学习工具箱™函数进行分类。

这个例子并不是对Fisher虹膜数据的一个理想分析,事实上,使用花瓣测量代替或加上萼片测量可能会导致更好的分类。此外,本示例并不打算比较不同分类算法的优缺点。您可能会发现,对其他数据集执行分析并比较不同的算法是有指导意义的。还有实现其他分类算法的Toolbox函数。例如,你可以使用TreeBagger为决策树的集合执行引导聚合,如示例中所述使用TreeBagger的分类树的引导聚合(Bagging)

Baidu
map