4 votes

Quel est l'ordre correct du vecteur antérieur dans fitensemble ?

Lors de l'utilisation de matlabs fitensemble pour apprendre un classificateur, je peux spécifier le paramètre prior ainsi que le paramètre classnames .

L'ordre des éléments dans les deux vecteurs doit-il être le même ? Et quelle est la valeur standard pour les classes vrai/faux ?

Pour être plus précis : supposons que la classe vraie a une probabilité préalable de 0,6, la classe fausse de 0,4 ; Dois-je utiliser ?

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

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

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

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

Je ne trouve pas la réponse dans le documentation .

La documentation de perfcurve est plus spécifique :

Précédent : Soit une chaîne de caractères, soit un tableau à deux éléments. Il représente les pour la classe positive et négative, respectivement. La valeur par défaut est 'empirique', c'est-à-dire que perfcurve dérive les probabilités a priori à partir des fréquences des classes. S'il est défini sur 'uniforme', perfcurve définit toutes les probabilités antérieures comme égales. probabilités antérieures.

1voto

Rashid Points 4248

ens = fitensemble(X,Y,method,nlearn,learners) crée un modèle d'ensemble qui prédit les réponses aux données. L'ensemble est constitué de modèles listés dans learners.

Première partie

Vous devez utiliser prior dans l'ordre alphabétique de vos étiquettes de classe.

Donc si les étiquettes sont ['A','B'] vous utilisez 'prior',[P(A) P(B)] ,

ou si les étiquettes sont ['true','false'] vous utilisez 'prior',[P(false) P(true)] ,

ou si les étiquettes sont [-1 10] vous utilisez 'prior',[P(-1) P(10)] .

Deuxième partie

A propos de la classnames cette option est utilisée pour que vous puissiez appeler fitensemble pour un nombre réduit de classes dans vos données.

Imaginez que vous avez quatre classes A,B,C,D donc votre Y sera quelque chose comme :

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

Vous pouvez maintenant écrire 'classnames',['A';'B'], si vous voulez fitensemble pour seulement deux classes et ce sera la même chose que 'classnames',['B';'A'], .

Je sais que c'est une réponse tardive, mais j'espère que cela vous aidera.

Exemple

J'ai utilisé la base de données 'fisheriris', qui comporte trois classes ( setosa', versicolor , virginica`).

parce qu'il a 150 cas et 50 de chaque classe, j'ai randomisé les données et sélectionné 100 échantillons.

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;

En trueprior = [0.32,0.30,0.38] montre les vraies probabilités antérieures.

Dans le code suivant, j'ai formé trois fitensembles le premier avec les options par défaut, de sorte que la probabilité antérieure est de empirical (est identique à trueprior ) ; le second est formé avec pprior réglé sur trueprior qui aura les mêmes résultats que le poing (parce que trueprior est dans l'ordre alphabétique des étiquettes de classe). La troisième est entraînée avec un ordre non-alphabétique et montre des résultats différents des deux premières.

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

J'ai également formé un fitensemble avec seulement deux classes utilisant classnames option

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

Comme preuve AdaBoosM1 qui ne supporte pas plus de deux classes fonctionne bien ici avec seulement deux classes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X