2012-04-15 16 views
1

Ich verwende Cross-Valind-Funktion auf eine sehr kleine Daten ... Allerdings beobachte ich, dass es mir falsche Ergebnisse für die gleiche gibt. Soll das passieren?Warum scheitert crossvalind?

Ich habe Matlab R2012a und hier ist meine Ausgabe

crossvalind('KFold',1:1:11,5) 

ans = 

2 
5 
1 
3 
2 
1 
5 
3 
5 
1 
5 

Beachten Sie die Abwesenheit von set 4 .. Ist das ein Fehler? Ich habe mindestens 2 Elemente pro Satz erwartet, aber es gibt mir 0 in einem ... und es passiert viel, dass die Werte nicht gleichmäßig in den Mengen verteilt sind.

Antwort

2

Die Hilfe für crossvalind besagt, dass das von Ihnen verwendete Formular lautet: crossvalind(METHOD, GROUP, ...). In diesem Fall ist GROUP das z. die Klassenbezeichnungen Ihrer Daten. Also 1:11, da das zweite Argument hier verwirrend ist, weil es keinen Hinweis darauf gibt, dass zwei Beispiele dasselbe Label haben. Ich denke, das ist genug ungewöhnlich, dass Sie nicht überrascht sein sollten, wenn die Funktion etwas Seltsames tut.

Ich habe versucht zu tun:

numel(unique(crossvalind('KFold', rand(11, 1) > 0.5, 5))) 

und es gab zuverlässig 5 als Ergebnis, das ist das, was ich erwarten würde; mein Beispiel würde einem Zwei-Klassen-Problem entsprechen (ich würde annehmen, dass Sie in der Regel etwas wie numel(unique(group)) <= numel(group)/folds wollen) - meine Hypothese wäre, dass es versucht, ein Beispiel für jede Klasse in der K-ten Falte zu haben, und mindestens 2 Beispiele in jedem anderen, mit einem Unterschied zwischen Falten Größen von nicht mehr als 1 - aber ich habe nicht in den Code geschaut, um dies zu überprüfen.

Es ist möglich, dass Sie tun bedeuten:

crossvalind('KFold', 11, 5); 

die 5 Falten für 11 Datenpunkte berechnen würde - dies nicht versucht, etwas klug mit Etiketten zu tun, so dass Sie sicher sein würde, dass es sei K Falten.

jedoch in Ihr Problem, wenn Sie wirklich nur sehr wenige Datenpunkte haben, dann ist es wahrscheinlich besser zu machen leave-one-out Kreuzvalidierung, die Sie mit tun könnte:

crossvalind('LeaveMOut', 11, 1); 

obwohl eine bessere Methode wäre:

for leave_out=1:11 
    fold_number = (1:11) ~= leave_out; 
    <code here; where fold_number is 0, this is the leave-one-out example. fold_number = 1 means that the example is in the main fold.> 
end 
Verwandte Themen