【问题标题】:What is the correct order of the prior vector in fitensemble?fitensemble 中先验向量的正确顺序是什么?
【发布时间】:2013-08-18 16:52:03
【问题描述】:

当使用 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 设置所有先前的 概率相等。

【问题讨论】:

  • 感谢@Dan 的编辑。尴尬。

标签: matlab random-forest


【解决方案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');

我还使用classnames 选项训练了一个只有两个班级的fitensemble

ada4 = fitensemble(meas,species,'AdaBoostM1',20,'tree','classnames',...   
       {'versicolor','virginica'});

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

【讨论】:

  • 奇数...然后应该自动对集成的 ClassNames 属性进行排序。如果您可以在答案的开头给出一个简短的使用摘要,那就更有用了。
  • 完美。我只是在完全随机的数据上使用了 predict 和一个集合,并且可以确认你的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2017-06-28
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多