Fehler in partial_fit in scikit learn

8

Beim Training mit einer partial_fit-Funktion in scikit learn erhalte ich den folgenden Fehler, ohne dass das Programm endet, wie ist das möglich und was sind die Rückwirkungen davon, obwohl sich das trainierte Modell korrekt verhält und korrekte Ergebnisse liefert. Ist das etwas, worüber man sich Sorgen machen muss?

%Vor%

Ich verwende die folgende modifizierte Trainingsfunktion, da ich eine konstante Liste von labels \ classes pflegen muss, da partial_fit das Hinzufügen neuer Klassen \ labels bei nachfolgenden Läufen nicht erlaubt, die Klasse prior ist in jedem Batch von Trainingsdaten gleich:

%Vor%

Auch beim zweiten Aufruf von partial_fit wird der folgende Fehler für die Klassenanzahl = 2000 ausgegeben, und die Trainingsbeispiele sind 3592 beim Aufruf von model = self.train (featureset, classes = labels, partially = partially):

%Vor%

Wohin gehe ich aufgrund des Fehlers falsch? Bedeutet das, dass ich falsch dimensionierte Daten einlege? Ich habe versucht zu folgen, ich rufe jetzt an:

%Vor%

jedes Mal, wenn die Teilanpassung aufgerufen wird. Früher habe ich FitTransform für jeden Teilanruf verwendet. Ist das richtig?

%Vor%

Nach vielen Versuchen war es mir möglich, den folgenden Code zu bekommen, indem ich den ersten Aufruf verrechnete, aber ich hatte angenommen, dass die eingelegten Dateien des Klassifizierers nach jeder Iteration an Größe zunehmen würden, aber ich bekomme für jeden Stapel die gleiche PKL-Datei was nicht möglich ist:

%Vor%

Hier ist der gesamte Code:

%Vor%     
stackit 21.09.2015, 13:54
quelle

2 Antworten

3

1. Der Code%

Sie erhalten diese Warnung, weil RuntimeWarning für 0 aufgerufen wird:

%Vor%

Das liegt daran, dass in einem Aufruf einige Klassen überhaupt nicht dargestellt werden (sie haben eine Zählung von 0) und daher wird np.log auf 0 aufgerufen. Sie brauchen sich darüber keine Gedanken zu machen.

2. Klasse Prioren

  

Ich verwende die folgende modifizierte Trainingsfunktion, da ich eine konstante Liste von labels \ classes pflegen muss, da partial_fit das Hinzufügen neuer Klassen \ labels bei nachfolgenden Läufen nicht erlaubt, die Klasse prior ist in jedem Batch der Trainingsdaten gleich / p>

  • Sie haben recht, dass Sie die Liste der Labels / Klassen von Anfang an übergeben müssen, wenn Sie np.log verwenden.
  • Ich bin nicht sicher, ob die Klasse in jeder Charge von Trainingsdaten dieselbe ist. Das könnte verschiedene Bedeutungen haben, es wäre schön, wenn Sie erklären könnten, was Sie hier gemeint haben.
    In der Zwischenzeit ist das Standardverhalten für Klassifizierer wie partial_fit , dass Priors zu den Daten passen (im Grunde berechnen sie Frequenzen). Bei Verwendung von MultinomialNB wird diese Berechnung inkrementell durchgeführt, sodass Sie dasselbe Ergebnis erhalten, als hätten Sie einen einzelnen partial_fit -Aufruf verwendet.

3. Dein Fehler

  

Auch beim zweiten Aufruf von partial_fit wird der folgende Fehler für die Klassenanzahl = 2000 ausgegeben und die Trainingsbeispiele sind 3592 beim Aufruf von model = self.train (featureset, classes = labels, partially = partially)

Hier brauchen wir mehr Details. Ich bin verwirrt, dass fit von Form X ist und doch in der Traceback von Form (n_samples, n_features) zu sein scheint. Das bedeutet (2000,11430) hat 2000 Samples.

Der Fehler bedeutet in der Tat, dass die Dimensionen Ihrer Eingaben inkonsistent sind. Ich würde vorschlagen, X , X.shape nach der Vektorisierung für jeden y.shape -Aufruf zu drucken.

Sie sollten auch nicht partial_fit oder fit auf dem Vektorizer aufrufen, der fit_transform für jeden X Aufruf umwandelt: Sie sollten einmal anpassen und dann X transformieren Stellen Sie sicher, dass Sie konsistente Dimensionen für Ihr transformiertes X erhalten.

4. Ihre 'frühere' Lösung

Hier ist der Code, den Sie uns mitgeteilt haben:

%Vor%

Soweit ich das beurteilen kann, ist daran nicht viel falsch, aber wir brauchen wirklich mehr Kontext dafür, wie Sie es hier benutzen Ein Nitpick: Ich denke, es wäre klarer, wenn Sie die Variable partial_fit als Klassenattribut verwenden, da diese Variable für jeden classes -Aufruf identisch sein muss.
Hier könnten Sie etwas falsch machen, wenn Sie dem Konstruktor partial_fit Argument andere Werte übergeben.

Weitere Informationen, die uns helfen könnten:

  • Drucke von X.shape, y.shape.
  • Kontext: Wie verwenden Sie den von Ihnen bereitgestellten Code?
  • Was verwendest du für classes , _vectorizer ? Mit welchem ​​Klassifikator arbeiten Sie letztendlich?
ldirer 30.09.2015 11:43
quelle
1

Das Problem hier, glaube ich, kann in dem Fehler

gesehen werden %Vor%

Beachten Sie die (2000,11430) (2000, 10728 ) (2000,11430), Sie liefern ein Dataset mit einer anderen Anzahl von Features, daher kann es die Anzahl der Features seit sie nicht bestimmen sind im zweiten Satz anders, und dies gibt den Fehler. Es zeigt nur den Fehler an und stürzt nicht ab, da der Fehler höchstwahrscheinlich in einem try catch -Block abgefangen wird.

Wahrscheinlich möchten Sie der Funktion partial_fit keine anderen Features (Attribute) geben. Ihr Algorithmus funktioniert immer noch, weil er auf die verbleibenden zwei Chuncks passt, aber der zweite Chunck wird höchstwahrscheinlich ignoriert.

    
Bas van Stein 30.09.2015 08:13
quelle