bugfix
This commit is contained in:
@@ -9309,92 +9309,44 @@ class DataProcessor:
|
||||
|
||||
|
||||
# Speichern Sie den Imputer (wird fuer Vorhersagen benoetigt).
|
||||
self.imputer = imputer # Speichern Sie ihn in der Instanz fuer spaetere Vorhersagen
|
||||
self.imputer = imputer
|
||||
try:
|
||||
# Stellen Sie sicher, dass das Verzeichnis fuer den Output existiert.
|
||||
os.makedirs(os.path.dirname(imputer_out), exist_ok=True) # Erstellt das Verzeichnis, falls es nicht existiert
|
||||
# Speichern Sie den Imputer mit pickle
|
||||
imputer_dir = os.path.dirname(imputer_out)
|
||||
if imputer_dir and not os.path.exists(imputer_dir): # Nur erstellen, wenn dirname nicht leer ist
|
||||
os.makedirs(imputer_dir, exist_ok=True)
|
||||
with open(imputer_out, 'wb') as f:
|
||||
pickle.dump(imputer, f)
|
||||
self.logger.info(f"Imputer erfolgreich gespeichert in '{imputer_out}'.") # <<< GEÄNDERT
|
||||
self.logger.info(f"Imputer erfolgreich gespeichert in '{imputer_out}'.")
|
||||
except Exception as e:
|
||||
# Fange Fehler beim Speichern ab und logge sie.
|
||||
self.logger.error(f"FEHLER beim Speichern des Imputers in '{imputer_out}': {e}") # <<< GEÄNDERT
|
||||
# Logge den Traceback.
|
||||
self.logger.debug(traceback.format_exc()) # <<< GEÄNDERT
|
||||
# Fahren Sie fort, aber loggen Sie den Fehler
|
||||
self.logger.error(f"FEHLER beim Speichern des Imputers in '{imputer_out}': {e}")
|
||||
self.logger.debug(traceback.format_exc())
|
||||
|
||||
|
||||
# Transformieren Sie Trainings- und Testdaten mit dem gefitteten Imputer.
|
||||
X_train_imputed = imputer.transform(X_train)
|
||||
X_test_imputed = imputer.transform(X_test)
|
||||
|
||||
# Konvertieren Sie die Ergebnisse (Numpy Arrays) zurueck zu DataFrames, behalten Sie die Spaltennamen.
|
||||
X_train_imputed = pd.DataFrame(X_train_imputed, columns=feature_columns)
|
||||
X_test_imputed = pd.DataFrame(X_test_imputed, columns=feature_columns)
|
||||
self.logger.info("Numerische Features imputiert.") # <<< GEÄNDERT
|
||||
|
||||
|
||||
# 4. Decision Tree Training
|
||||
# Definieren Sie das Decision Tree Modell.
|
||||
# Wichtige Hyperparameter zum Tunen: max_depth, min_samples_split, min_samples_leaf.
|
||||
# class_weight='balanced' ist hilfreich bei ungleicher Klassenverteilung (wahrscheinlich bei Buckets).
|
||||
dt_classifier = DecisionTreeClassifier(random_state=42, class_weight='balanced')
|
||||
# Optional: Hyperparameter-Tuning mit GridSearchCV
|
||||
# param_grid = {'max_depth': [None, 10, 20, 30], 'min_samples_split': [2, 5, 10], 'min_samples_leaf': [1, 2, 5]}
|
||||
# grid_search = GridSearchCV(dt_classifier, param_grid, cv=5, scoring='accuracy')
|
||||
# grid_search.fit(X_train_imputed, y_train)
|
||||
# dt_classifier = grid_search.best_estimator_
|
||||
# self.logger.info(f"Beste Parameter gefunden durch GridSearchCV: {grid_search.best_params_}")
|
||||
|
||||
|
||||
self.logger.info("Starte Training des Decision Tree Modells...") # <<< GEÄNDERT
|
||||
# Fitten Sie das Modell auf den imputierten Trainingsdaten.
|
||||
dt_classifier.fit(X_train_imputed, y_train)
|
||||
self.logger.info("Modelltraining abgeschlossen.") # <<< GEÄNDERT
|
||||
|
||||
|
||||
# Speichern Sie das trainierte Modell.
|
||||
self.model = dt_classifier # Speichern Sie es in der Instanz fuer spaetere Vorhersagen
|
||||
# Speichern Sie das trainierte Modell
|
||||
self.model = dt_classifier
|
||||
try:
|
||||
# Stellen Sie sicher, dass das Verzeichnis fuer den Output existiert.
|
||||
os.makedirs(os.path.dirname(model_out), exist_ok=True) # Erstellt das Verzeichnis, falls es nicht existiert
|
||||
# Speichern Sie das Modell mit pickle
|
||||
model_dir = os.path.dirname(model_out)
|
||||
if model_dir and not os.path.exists(model_dir): # Nur erstellen, wenn dirname nicht leer ist
|
||||
os.makedirs(model_dir, exist_ok=True)
|
||||
with open(model_out, 'wb') as f:
|
||||
pickle.dump(dt_classifier, f)
|
||||
self.logger.info(f"Decision Tree Modell erfolgreich gespeichert in '{model_out}'.") # <<< GEÄNDERT
|
||||
self.logger.info(f"Decision Tree Modell erfolgreich gespeichert in '{model_out}'.")
|
||||
except Exception as e:
|
||||
# Fange Fehler beim Speichern ab und logge sie.
|
||||
self.logger.error(f"FEHLER beim Speichern des Modells in '{model_out}': {e}") # <<< GEÄNDERT
|
||||
# Logge den Traceback.
|
||||
self.logger.debug(traceback.format_exc()) # <<< GEÄNDERT
|
||||
# Fahren Sie fort
|
||||
self.logger.error(f"FEHLER beim Speichern des Modells in '{model_out}': {e}")
|
||||
self.logger.debug(traceback.format_exc())
|
||||
|
||||
|
||||
# Speichern Sie die Liste der Feature-Spalten (fuer die Vorhersage)
|
||||
self._expected_features = feature_columns # Speichern Sie diese Liste in der Instanz fuer _predict_technician_bucket
|
||||
# Speichern Sie die Liste der Feature-Spalten
|
||||
self._expected_features = feature_columns_ml # Stellen Sie sicher, dass feature_columns_ml hier korrekt ist
|
||||
try:
|
||||
# Speichern als JSON fuer bessere Lesbarkeit und um zusaetzliche Infos (wie Klassen) zu speichern.
|
||||
# PATTERNS_FILE_JSON wird aus Config (Block 1) geholt.
|
||||
patterns_data = {"feature_columns": feature_columns, "target_classes": list(dt_classifier.classes_)}
|
||||
# Stellen Sie sicher, dass das Verzeichnis fuer den Output existiert.
|
||||
os.makedirs(os.path.dirname(patterns_out), exist_ok=True) # Erstellt das Verzeichnis, falls es nicht existiert
|
||||
# Speichern Sie die JSON-Datei
|
||||
patterns_data = {"feature_columns": feature_columns_ml, "target_classes": list(dt_classifier.classes_)}
|
||||
patterns_dir = os.path.dirname(patterns_out)
|
||||
if patterns_dir and not os.path.exists(patterns_dir): # Nur erstellen, wenn dirname nicht leer ist
|
||||
os.makedirs(patterns_dir, exist_ok=True)
|
||||
with open(patterns_out, 'w', encoding='utf-8') as f:
|
||||
json.dump(patterns_data, f, indent=4, ensure_ascii=False)
|
||||
self.logger.info(f"Erwartete Feature-Spalten und Klassen erfolgreich gespeichert in '{patterns_out}'.") # <<< GEÄNDERT
|
||||
|
||||
# Optional: Speichern als einfache Textdatei (wie im Originalcode)
|
||||
# patterns_out_txt = patterns_out.replace('.json', '.txt')
|
||||
# with open(patterns_out_txt, 'w', encoding='utf-8') as f:
|
||||
# for col in feature_columns: f.write(f"{col}\n")
|
||||
# self.logger.info(f"Erwartete Feature-Spalten (txt) erfolgreich gespeichert in '{patterns_out_txt}'.")
|
||||
|
||||
json.dump(patterns_data, f, indent=4, ensure_ascii=False)
|
||||
self.logger.info(f"Erwartete Feature-Spalten und Klassen erfolgreich gespeichert in '{patterns_out}'.")
|
||||
except Exception as e:
|
||||
# Fange Fehler beim Speichern ab und logge sie.
|
||||
self.logger.error(f"FEHLER beim Speichern der Feature-Spalten in '{patterns_out}': {e}") # <<< GEÄNDERT
|
||||
# Logge den Traceback.
|
||||
self.logger.debug(traceback.format_exc()) # <<< GEÄNDERT
|
||||
self.logger.error(f"FEHLER beim Speichern der Feature-Spalten in '{patterns_out}': {e}")
|
||||
self.logger.debug(traceback.format_exc())
|
||||
# Fahren Sie fort
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user