CNN optimieren - Problem: StratifiedKFold basiert auf Label von Zielvariable y und akzeptiert keine one-hot Codierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
CodeIt
User
Beiträge: 36
Registriert: Mittwoch 13. September 2017, 06:10

Hallo,
Ich versuche verschiedene Hyperparameter einer CNN mithilfe RandomizedSearchCV zu optimieren.
Da der Datensatz unbalanciert ist, verwende ich StratifiedKFold anstatt KFold, damit auch in den
Folds die ursprüngliche Klassenverteilung beibehalten wird.

Code: Alles auswählen

from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import RandomizedSearchCV
from keras.utils import to_categorical
from keras.wrappers.scikit_learn import KerasClassifier


seed = 7
np.random.seed(seed)
stratKFold = StratifiedKFold(n_splits=5, shuffle=True, random_state=seed)
model = KerasClassifier(build_fn=randomized_search_model, verbose=0)
randomized_Search = RandomizedSearchCV(estimator=model, 
                 param_distributions=params, cv=stratKFold, n_jobs=-1)

results = randomized_Search.fit(X,y)
Wenn ich diesen Code verwende, erhalte ich folgende Fehlermeldung

Code: Alles auswählen

ValueError: Supported target types are: ('binary', 'multiclass'). Got 'multilabel-indicator' instead.
Ich erhalte vermutlich diese Fehlermeldung, weil die Zielvariablen y zuvor
mithilfe von to_categorical zu one-hot encoded Klassenvektoren konvertiert wurden.
Wenn ich KFold anstatt StratifiedKFold verwende erhalte ich keine Fehlermeldung.

Da StratifiedKFold auf den Labeln von y basiert suche ich nach einer Lösung zu diesem
Problem.

Für jeden Tipp wäre ich sehr dankbar
Benutzeravatar
ThomasL
User
Beiträge: 1377
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Einfach Target y nicht in one-hot-encoded wandeln, da StratifiedKFold nicht damit arbeiten kann.
Die Aufgabe von StratifiedKFold ist doch, den unbalancierten Datensatz anhand der prozentualen Verteilung der Klassen von y zu balancieren.
Und das geht, wie die Fehlermeldung besagt, nur mit binary class 0 oder 1, oder multiclass, aber nicht wenn diese als one-hot codiert wurde.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
CodeIt
User
Beiträge: 36
Registriert: Mittwoch 13. September 2017, 06:10

Vielen Dank.
Habe Integer für das Target anstatt One-Hot verwendet und für die loss-Funktion sparse_categorical_crossentropy anstatt categorical_crossentropy
verwendet und es funktioniert.
Antworten