Umstellung auf Branchen-Gruppen für ML-Features
- Feature Engineering: Der ML-Prozess verwendet nun übergeordnete Branchen-Gruppen anstelle der detaillierten Einzelbranchen als kategoriales Feature. - Branchen-Mapping: Eine neue Logik liest eine externe Mapping-Datei (`Branchen.csv`), um die vom KI-System vorgeschlagenen Detailbranchen (aus Spalte AL) ihren jeweiligen Branchen-Gruppen zuzuordnen. - Reduzierte Dimensionalität: Durch das Clustering der Branchen wird die Anzahl der One-Hot-encodierten Features signifikant reduziert. Dies erhöht die statistische Aussagekraft jeder Kategorie und soll die Generalisierungsfähigkeit und Genauigkeit des Modells verbessern. - Code-Anpassungen: Die Methode `prepare_data_for_modeling` wurde angepasst, um das Branchen-Mapping durchzuführen und das One-Hot-Encoding auf den neuen Branchen-Gruppen anzuwenden. Die Methode `_predict_technician_bucket` muss entsprechend angepasst werden, um dieselbe Logik für die Vorhersage zu spiegeln.
This commit is contained in:
@@ -108,6 +108,22 @@ IMPUTER_FILE = "median_imputer.pkl"
|
|||||||
PATTERNS_FILE_TXT = "technician_patterns.txt" # Alt (Optional beibehalten)
|
PATTERNS_FILE_TXT = "technician_patterns.txt" # Alt (Optional beibehalten)
|
||||||
PATTERNS_FILE_JSON = "technician_patterns.json" # Neu (Empfohlen)
|
PATTERNS_FILE_JSON = "technician_patterns.json" # Neu (Empfohlen)
|
||||||
|
|
||||||
|
def load_branch_mapping(file_path='Branchen.csv'):
|
||||||
|
try:
|
||||||
|
df_mapping = pd.read_csv(file_path, sep=';', usecols=['Branch Group', 'Branch'])
|
||||||
|
# Erstelle ein Dictionary: { 'Branch-Detail': 'Branch-Group' }
|
||||||
|
# .str.strip() um führende/endende Leerzeichen zu entfernen
|
||||||
|
branch_map_dict = pd.Series(df_mapping['Branch Group'].values, index=df_mapping['Branch'].str.strip()).to_dict()
|
||||||
|
logger.info(f"Branchen-Mapping aus '{file_path}' erfolgreich geladen ({len(branch_map_dict)} Einträge).")
|
||||||
|
return branch_map_dict
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"FEHLER beim Laden der Branchen-Mapping-Datei '{file_path}': {e}")
|
||||||
|
return {}
|
||||||
|
|
||||||
|
# In Config-Klasse oder global aufrufen:
|
||||||
|
BRANCH_MAPPING = load_branch_mapping()
|
||||||
|
|
||||||
|
|
||||||
# --- Globale Konfiguration Klasse ---
|
# --- Globale Konfiguration Klasse ---
|
||||||
class Config:
|
class Config:
|
||||||
"""Zentrale Konfigurationseinstellungen."""
|
"""Zentrale Konfigurationseinstellungen."""
|
||||||
@@ -9110,7 +9126,20 @@ class DataProcessor:
|
|||||||
|
|
||||||
# Greife auf 'branche_ki' zu und weise das Ergebnis auch wieder 'branche_ki' zu
|
# Greife auf 'branche_ki' zu und weise das Ergebnis auch wieder 'branche_ki' zu
|
||||||
df_filtered.loc[:, branche_col_internal] = df_filtered[branche_col_internal].astype(str).fillna('Unbekannt').str.strip()
|
df_filtered.loc[:, branche_col_internal] = df_filtered[branche_col_internal].astype(str).fillna('Unbekannt').str.strip()
|
||||||
|
|
||||||
|
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
# +++ NEU: Mapping von Detail-Branche zu Branch-Group +++++++++++++++++++
|
||||||
|
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
# Wende das Mapping an. Wenn eine Branche nicht im Mapping ist, wird sie als 'Sonstige' oder 'Unbekannt' behandelt.
|
||||||
|
# Verwende das global geladene BRANCH_MAPPING Dictionary
|
||||||
|
df_filtered.loc[:, 'Branchen_Gruppe'] = df_filtered[branche_col_internal].map(BRANCH_MAPPING).fillna('Sonstige')
|
||||||
|
|
||||||
|
self.logger.info("Mapping zu 'Branchen_Gruppe' durchgeführt.")
|
||||||
|
self.logger.debug(f"Verteilung der Branchen-Gruppen:\n{df_filtered['Branchen_Gruppe'].value_counts(normalize=True).sort_index().round(3)}")
|
||||||
|
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
# +++ ENDE NEUER BLOCK ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
# Verwende den korrekten internen Namen für das One-Hot Encoding
|
# Verwende den korrekten internen Namen für das One-Hot Encoding
|
||||||
df_encoded = pd.get_dummies(df_filtered, columns=[branche_col_internal], prefix='Branche', dummy_na=False)
|
df_encoded = pd.get_dummies(df_filtered, columns=[branche_col_internal], prefix='Branche', dummy_na=False)
|
||||||
self.logger.info(f"One-Hot Encoding fuer '{branche_col_internal}' durchgefuehrt...")
|
self.logger.info(f"One-Hot Encoding fuer '{branche_col_internal}' durchgefuehrt...")
|
||||||
|
|||||||
Reference in New Issue
Block a user