fitensemble中前一个向量的正确顺序是什么?

时间:2013-08-16 09:56:41

标签: matlab random-forest

使用matlabs fitensemble学习分类时,我可以指定参数prior以及参数classnames

两个向量中元素的顺序是否相同?真/假类的标准值是什么?

更具体一点:假设真正的类具有先验概率0.6,假等级0.4;我应该使用:

ens = fitensemble(...,'prior',[0.6 0.4])

ens = fitensemble(...,'prior',[0.4 0.6])

ens = fitensemble(...,'prior',[0.4 0.6],'classnames',[true false])

ens = fitensemble(...,'prior',[0.4 0.6],'classnames',[false,true])

我在documentation找不到答案。

perfcurve的文档更具体:

  

先前:包含两个元素的字符串或数组。它代表先前   正面和负面类别的概率。   默认为“经验”,即,perfcurve导出先验概率   从课堂频率。如果设置为“uniform”,则perfcurve会先设置   概率相等。

1 个答案:

答案 0 :(得分:1)

ens = fitensemble(X,Y,method,nlearn,learners)创建一个预测数据响应的集合模型。整体由学习者中列出的模型组成。

第一部分

您必须按类别标签的字母顺序使用prior

因此,如果标签为['A','B'],则使用'prior',[P(A) P(B)]

或如果标签为['true','false'],则使用'prior',[P(false) P(true)]

或如果标签为[-1 10],则使用'prior',[P(-1) P(10)]

第二部分

关于classnames,使用此选项,以便您可以为数据中较少的类调用fitensemble

想象一下,您有四个课程A,B,C,D,因此您的Y将会是这样的:

Y = [A;A;B;D;B;A;C;A;A;A;D, ... ];

现在,如果您只需要'classnames',['A';'B'],两个类,就可以写fitensemble,它与'classnames',['B';'A'],相同。

我知道这是一个迟到的答案,我希望它有所帮助。

示例

我使用了' fisheriris'数据库,有三个类(setosa', versicolor , virginica`)。

因为每个类有150个案例和50,我随机化了数据并选择了100个样本。

load fisheriris
rng(12);
idx = randperm(size(meas,1));
meas = meas(idx,:);
species = species(idx,:); 
meas = meas(1 : 100,:);
species = species(1 : 100,:);
trueprior = [ sum(strcmp(species,'setosa')),...
              sum(strcmp(species,'versicolor')),...
              sum(strcmp(species,'virginica'))] / 100;

trueprior = [0.32,0.30,0.38]显示真实的先验概率。

在下面的代码中,我训练了三个fitensembles,第一个使用默认选项,因此先验概率为empirical(与trueprior相同);第二个是训练时pprior设置为trueprior,其结果与拳头相同(因为trueprior按类别标签的字母顺序排列)。第三个是按非字母顺序训练的,并且显示的结果与前两个不同。

ada1 = fitensemble(meas,species,'AdaBoostM2',20,'tree');
subplot(311)
plot(resubLoss(ada1,'mode','individual'));
title('Resubstitution error for default prior (empirical)');
ada2 = fitensemble(meas,species,'AdaBoostM2',20,'tree','prior',trueprior);
subplot(312)
plot(resubLoss(ada2,'mode','individual'));
title('Resubstitution error for prior with alphabetical order of class labels');
ada3 = fitensemble(meas,species,'AdaBoostM2',20,'tree','prior',trueprior(end:-1:1));
subplot(313)
plot(resubLoss(ada3,'mode','individual'));
title('Resubstitution error for prior with random order');

enter image description here

我还使用fitensemble选项

训练classnames只有两个班级
ada4 = fitensemble(meas,species,'AdaBoostM1',20,'tree','classnames',...   
       {'versicolor','virginica'});

作为一个不支持两个以上类的证明AdaBoosM1,只有两个类可以正常工作。