当使用 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/