使用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会先设置 概率相等。
答案 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');
我还使用fitensemble
选项
classnames
只有两个班级
ada4 = fitensemble(meas,species,'AdaBoostM1',20,'tree','classnames',...
{'versicolor','virginica'});
作为一个不支持两个以上类的证明AdaBoosM1
,只有两个类可以正常工作。