Seite 1 von 1

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

Verfasst: Freitag 30. August 2019, 18:44
von CodeIt
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

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

Verfasst: Samstag 31. August 2019, 08:49
von ThomasL
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.

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

Verfasst: Sonntag 1. September 2019, 12:36
von CodeIt
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.