当使用 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 的文档更具体:

最佳答案

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');

我还使用 fitensemble 选项训练了一个只有两个类的 classnames
ada4 = fitensemble(meas,species,'AdaBoostM1',20,'tree','classnames',...
       {'versicolor','virginica'});

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

关于matlab - fitensemble 中先验向量的正确顺序是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18270650/

10-12 21:38