应用案例

1 线性判别分析

执行线性判别分析可使用lda()函数,且该函数有三种执行形式,依次尝试使用。

(1)公式formula格式

我们使用nmkat变量作为待判别变量,其他剩余的变量作为特征变量,根据公式nmkat~使用训练集数据来运行lda()函数:

library(MASS)

library("MASS")

fitlda1<-lda(nmkat~.,datatrain)   #以公式格式执行判别分析

names(fitlda1)    #查看lda输出项名称

 判别分析--应用案例(线性判别分析)_混淆矩阵

结果分析:我们看到,可以根据lda()函数得到10项输出结果,分别为执行过程中所使用的先验概率prior、数据集中各类别的样本量counts、各变量在每一类别中的均值 means等。

fitlda1$prior   #查看本次执行过程中所使用的先验概率

 判别分析--应用案例(线性判别分析)_取值_02

fitlda1$counts    #查看数据集datatrain中各类别的样本量

 判别分析--应用案例(线性判别分析)_判别分析--应用案例(线性判别分析)_03

结果分析:由于我们在之前的抽样过程中采用的是nmkat各等级的等概率分层抽样方式,因此如上各类别的先验概率和样本量在5个等级中都是相等的。具体的,5类的先验概率都为0.2,之和为1,且训练集中每一类都抽出了144个样本。

fitlda1$means

 判别分析--应用案例(线性判别分析)_先验概率_04

结果分析:在如上的均值输出结果中,我们可以看到一些很能反映现实情况的数据特征。比如,对于占地面积wfl变量,它明显随着租金nmkat的升高而逐步提高,我们看到在租金为等级1(少于500马克)时,占地面积的均值仅为55.53平方米,而对于租金等级5(租金不低于1150 马克),平均占地面积则达到了92.24平方米。面积越大的房屋租金越贵,这是十分符合常识的。

执行fitlda1可直接将判别结果输出。

(2)数据框data.frame及矩阵matrix格式

由于这两种函数格式的主体参数都为x与grouping,我们放在一起实现,程序代码如下:

fitlda2<-lda(datatrain[,-12],datatrain[,12])

#设置属性变量(除第12个变量nmkat外)与待判别变量(第12个变量nmkat)的取值

fitlda2

判别分析--应用案例(线性判别分析)_判别分析--应用案例(线性判别分析)_05

2.判别规则可视化

我们首先使用plot()直接以判别规则fit_ldal为对象输出图形,如下图所示:

plot(fitlda1)

 判别分析--应用案例(线性判别分析)_先验概率_06

结果分析:从图可以看到,在所有4个线性判别式(Linear Discriminants,即 LD)下1至5这5个类别的分布情况,不同类别样本已用相应数字标出。

我们可以通过dimen参数的设定来控制输出图形中所使用的判别式个数当参数取值大于总共的判别式个数式,则默认取所有样式,比如下面分别以 dimen=1和2为例生成图形,分别如图所示:

plot(fitlda1,dimen=1)  #变量太多,画布显示不出来

plot(fitlda1,dimen=2)

 判别分析--应用案例(线性判别分析)_数据_07

结果分析:1类和5类比较分明,2,3,4类重叠很多。

3.对测试集待判别变量取值进行预测

下面我们来使用之前得到的判别规则fitldal来对测试集 datatest中的待判别变量nmkat 的类别进行预测。

prelda1<-predict(fitlda1,datatest)  #使用类别规则fitlda1预测datatest中nmkat变量的类别

prelda1$class  #输出datatest中个样本的预测结果

 判别分析--应用案例(线性判别分析)_判别分析--应用案例(线性判别分析)_08

prelda1$posterior  #输出个样本属于每一类别的后验概率

 判别分析--应用案例(线性判别分析)_判别分析--应用案例(线性判别分析)_09

结果分析:将class与 posterior的输出结果相结合来看,我们知道每一样本属于各类别的后验概率最高者为该样本被判定的类别。比如,posterior输出项中序号为“3”的样本属于第2类的概率最高,约为0.501,因此该样本在此次判别中被归为类别2。

为了进一步评价本次判别的效果,我们可以生成测试集中nmkat变量的预测结果与其实际类别的混淆矩阵,代码如下:

table(datatest$nmkat,prelda1$class)

 判别分析--应用案例(线性判别分析)_取值_10

table(datatest$nmkat)

 判别分析--应用案例(线性判别分析)_混淆矩阵_11

结果分析:由上面的混淆矩阵,行表示实际的类别,列表示预测判定的类别。在362个测试样本中,实际属于第1类的有75个,而由判定结果,75个样本中,有57个判定正确,14个错判成第2类,3个错判成第3类。且该矩阵的非对角线上的元素之和为120,也就是说120个样本被判错了,错误率则可以通过计算得到,为0.33=120/362。

其中,属于第3类的样本被错分的个数最多,共有31个(约占总量的一半)被错误分类。这之中有17个被错分入类别2,13个分入类别4。这很可能是由于类别3与类别2、4的样本之间相似度太高,表现在图形中即为有较大的重叠区域所导致的分类困难,正如我们在上图所看到的,2、3、4这三个中等租金额的样本点聚集在一起难以分割。

可以计算错误率来评价分类效果:

errorlda1<-sum(as.numeric(as.numeric(prelda1$class)!=as.numeric(datatest$nmkat)))/nrow(datatest)

errorlda1

 判别分析--应用案例(线性判别分析)_取值_12


作者:zhang-X​,转载请注明原文链接​