主要内容

分类

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

费雪的虹膜数据

费雪的虹膜上的测量数据由花萼长度,萼片宽,花瓣长度和花瓣宽度150虹膜样本。有50每三个物种的标本。加载数据,看看花萼测量不同物种之间。您可以使用两个列包含花萼测量。

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

图包含一个坐标轴对象。坐标轴对象包含3线类型的对象。杂色的,这些对象代表setosa virginica。

1)N =大小(量;

假设你衡量一个萼片和花瓣从虹膜,你需要确定它的物种的基础上测量。解决这个问题的一个方法是判别分析。

线性和二次判别分析

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

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

观察结果与已知的类标签通常称为训练数据。现在计算resubstitution错误,误分类错误(观察分类错误的比例)在训练集上。

ldaResubErr = resubLoss (lda)
ldaResubErr = 0.2000

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

图ldaResubCM = confusionchart(物种,ldaClass);

图包含一个ConfusionMatrixChart类型的对象。

150年的训练观察,20%或30观察由线性判别函数分类错误的。你可以看到哪些他们通过更进一步的画X点。

图(f)坏= ~比较字符串(ldaClass,物种);持有;情节(量(坏,1),量(坏,2),“kx”);持有;

图包含一个坐标轴对象。坐标轴对象包含4线类型的对象。杂色的,这些对象代表setosa virginica。

函数把平面分成区域除以线,和不同地区分配给不同的物种。想象这些地区的一个方法是创建一个网格(x, y)值,并应用网格的分类函数。

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

图包含一个坐标轴对象。坐标轴对象包含3线类型的对象。这些对象代表杂色的,setosa virginica。

对于一些数据集,各种类的地区由行不分离。是这样时,线性判别分析是不合适的。相反,你可以试一试二次判别分析(QDA)我们的数据。

计算resubstitution误差二次判别分析。

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

你有计算resubstitution错误。通常人们更感兴趣的是测试误差(也称为泛化误差),预期的预测误差在一个独立集。事实上,resubstitution误差可能会低估测试误差。

在这种情况下你没有另一个标签的数据集,但你可以模拟一个通过交叉验证。一个分层10倍交叉验证是一个流行的选择估计试验误差分类算法。它随机将训练集划分为10个不相交的子集。每个子集都有大致相等的大小和比例大致相同的类的训练集,移除一个子集,使用其他九个子集训练分类模型,并使用训练模型分类的子集。你可以重复这个通过删除每个十一次一个子集。

因为交叉验证随机划分数据,其结果依赖于初始随机种子。复制的结果在这个例子中,执行以下命令:

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

crossvalkfoldLoss方法可以估计误分类误差对LDA和QDA使用给定的数据分区cp

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

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

LDA交叉验证错误有相同的值作为LDA resubstitution错误数据。

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

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

QDA比LDA稍大的交叉验证错误。它显示了一个简单的模型可能会相当,或更好的性能比一个更复杂的模型。

朴素贝叶斯分类器

fitcdiscr函数有其他两个其他类型,“DiagLinear”“DiagQuadratic”。他们是相似的“线性”“二次”,但对角协方差矩阵的估计。这些对角选择特定的朴素贝叶斯分类器的例子,因为他们假设变量条件独立给定的类标签。朴素贝叶斯分类器是最受欢迎的分类器。虽然class-conditional独立变量之间的假设是不正确的在一般情况下,朴素贝叶斯分类器被发现在许多数据集在实践中工作得很好。

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

第一个模型每个变量在每个类使用高斯分布。你可以计算出resubstitution错误和交叉验证错误。

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

图包含一个坐标轴对象。坐标轴对象包含3线类型的对象。这些对象代表杂色的,setosa virginica。

到目前为止,你认为每个类的变量有一个多元正态分布。通常这是一个合理的假设,但有时你可能不愿意做这样的假设或你可以清楚地看到,它是无效的。现在尝试模型每个变量在每个类使用核密度估计,这是一个更灵活的非参数方法。在这里我们设置内核盒子

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

图包含一个坐标轴对象。坐标轴对象包含3线类型的对象。杂色的,这些对象代表setosa virginica。

对于这个数据集,朴素贝叶斯分类器与核密度估计变小resubstitution误差和交叉验证误差比高斯分布的朴素贝叶斯分类器。

决策树

另一个基于决策树分类算法。决策树是一组简单的规则,比如“如果花萼长度小于5.45,分类与setosa标本。”Decision trees are also nonparametric because they do not require any assumptions about the distribution of the variables in each class.

fitctree函数创建了一个决策树。iris数据创建一个决策树,看看它将虹膜的物种。

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

有趣的是如何决策树方法把飞机。使用与上面相同的方法来可视化区域分配给每个物种。

[grpname、节点]=预测(t (x, y));grpname gscatter (x, y,“伽马线暴”,‘草地’)

图包含一个坐标轴对象。坐标轴对象包含3线类型的对象。这些对象代表杂色的,setosa virginica。

可视化决策树的另一种方法是画一个图的决策规则和随堂作业。

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

{“字符串”:“图分类树查看器包含一个坐标轴对象和其他对象类型的uimenu, uicontrol。坐标轴对象包含60线类型的对象,文本。“,”泰克斯”:[],“乳胶”:[]}

这个cluttered-looking树使用的一系列规则的形式“SL < 5.45”分类每个标本的19个终端节点。确定物种作业观察,从顶部开始节点和适用规则。如果点满足规则取左边的路径,如果不是你把正确的道路。最终你到达一个终端节点分配的观察这三个物种之一。

计算resubstitution错误和决策树的交叉验证错误。

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

决策树算法,交叉验证错误估计是明显大于resubstitution错误。这表明overfits训练集生成的树。换句话说,这是一个树分类原始训练集,但树的结构敏感的这个特殊的训练集,这样可能会降低其性能的新数据。通常可以找到一个简单的执行比一个更复杂的树树新数据。

试着修剪树。首先计算各子集的resubstitution错误的原始树。然后计算这些点子树的交叉验证错误。图表显示resubstitution错误是过于乐观了。它总是减少随着树的大小,但到一定限度时,增加树大小增加了交叉验证错误率。

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

图包含一个坐标轴对象。坐标轴对象包含2线类型的对象。这些对象代表交叉验证,Resubstitution。

应该选择哪种树?一个简单的规则是选择最小的树交叉验证错误。虽然这可能是令人满意的,您可能更愿意使用简单的树,如果是约好一个更复杂的树。对于这个示例,把最简单的树,是在一个标准误差的最小值。这是使用的缺省规则cvloss的方法ClassificationTree

你可以展示这图上的计算的截断值等于最低成本加一个标准误差。计算的“最好”的水平cvloss方法是最小的树在此截止。(注意,bestlevel= 0对应unpruned树,所以你必须使用它作为一个加1索引向量输出cvloss。)

[mincost, minloc] = min(成本);截止= mincost + secost (minloc);持有情节(20[0]、[截止截止),凯西:”)情节(ntermnodes (bestlevel + 1)、成本(bestlevel + 1),“莫”)传说(交叉验证的,“Resubstitution”,“敏+ 1 std.犯错。”,“最好的选择”)举行

图包含一个坐标轴对象。坐标轴对象包含4线类型的对象。这些对象代表交叉验证,Resubstitution、最小值+ 1 std.犯错。,最好的选择。

最后,你可以看看修剪树,计算估计误分类错误。

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

{“字符串”:“图分类树查看器包含一个坐标轴对象和其他对象类型的uimenu, uicontrol。坐标轴对象包含18行类型的对象,文本。“,”泰克斯”:[],“乳胶”:[]}

成本(bestlevel + 1)
ans = 0.2467

结论

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

这个例子并不意味着是一个理想的费舍尔虹膜数据的分析,事实上,用花瓣测量代替,或除了,花萼测量可能会导致更好的分类。同时,这个例子不是为了比较不同的分类算法的优点和缺点。您可能会发现它有益的其他数据集上执行分析和比较不同的算法。也有工具箱函数,实现其他分类算法。例如,您可以使用TreeBagger执行引导聚合为一个决策树,作为所描述的例子引导使用TreeBagger聚合(装袋)的分类树