This commit is contained in:
2025-06-02 13:54:55 +00:00
parent e861ff4fb0
commit 9a8754d670

View File

@@ -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