diff --git a/brancheneinstufung.py b/brancheneinstufung.py index e268cd75..d0481fea 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -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