TATECHATLAS
◎ Deutsch
Mathematik und Modelle / Anleitung

Evaluierung von Multi-Output-Regression in scikit-learn

Erfahren Sie, wie Sie den Parameter multioutput in scikit-learn verwenden, um Fehler pro Zielvariable abzurufen oder benutzerdefinierte Gewichtungen für Multi-Output-Regressionsprognosen anzuwenden.

Auf dieser Seite

Um ein Modell mit mehreren Output-Serien in scikit-learn zu evaluieren, verwenden Sie den Parameter multioutput innerhalb unterstützter Metriken wie mean_absolute_error oder r2_score. Durch die Einstellung multioutput='raw_values' wird ein Array zurückgegeben, das den individuellen Score für jeden Output-Stream enthält, was eine detaillierte Diagnose ermöglicht. Um einen einzelnen gewichteten Score zu berechnen, bei dem bestimmte Outputs kritischer sind, übergeben Sie ein array-ähnliches Objekt von Gewichten (z. B. [0.3, 0.7]) an den multioutput-Parameter. Dies ersetzt das Standardverhalten 'uniform_average', welches alle Zielvariablen als gleich wichtig behandelt.

Verständnis von Multi-Output-Regressionsmetriken

In der Multi-Target-Regression sagt ein Modell mehrere kontinuierliche Variablen gleichzeitig voraus. Standard-Evaluierungsmetriken geben typischerweise einen einzelnen Skalar zurück, was eine schlechte Leistung in einem spezifischen Output verbergen kann, wenn andere gut abschneiden. Scikit-learn löst dies durch Mechanismen, die den Fehler entweder pro Output aufschlüsseln oder sie mithilfe spezifischer Gewichtungsstrategien aggregieren.

Die Wahl der Metrik sollte mit dem Zielfunktional übereinstimmen. Wenn das Ziel beispielsweise darin besteht, den Mittelwert einer Verteilung vorherzusagen, ist eine quadratische Verlustfunktion angemessen. Wenn das Ziel der Median ist, wird ein absoluter Verlust bevorzugt. In Multi-Output-Szenarien muss diese Konsistenz über alle Zieldimensionen hinweg beibehalten werden.

Stellen Sie bei der Verwendung benutzerdefinierter Gewichte für Multi-Output-Metriken sicher, dass die Gewichte in der Summe 1,0 ergeben, um die ursprüngliche Skala der Metrik und deren Interpretierbarkeit als gewichteter Durchschnitt beizubehalten.

Verwendung von raw_values für die Evaluierung pro Output

Die Option 'raw_values' ist essenziell, um zu diagnostizieren, welche spezifische Zielvariable dazu führt, dass ein Modell unterdurchschnittlich abschneidet. Anstatt die Ergebnisse zu mitteln, gibt scikit-learn ein Array zurück, bei dem jedes Element der für eine Output-Spalte berechneten Metrik entspricht.

Dies ist besonders nützlich, wenn Zielvariablen unterschiedliche Skalen oder unterschiedliche Rauschpegel haben, da verhindert wird, dass der Fehler einer Variable mit hoher Magnitude den Gesamtscore dominiert.

from sklearn.metrics import mean_absolute_error; import numpy as np; y_true = np.array([[0.5, 1], [-1, 1], [7, -6]]); y_pred = np.array([[0, 2], [-1, 2], [8, -5]]); scores = mean_absolute_error(y_true, y_pred, multioutput='raw_values'); print(scores) # Illustrative output: [0.5, 1. ]

Implementierung benutzerdefinierter Gewichtung für mehrere Outputs

Wenn bestimmte Output-Serien geschäftskritischer sind als andere, ist ein gleichmäßiger Durchschnitt irreführend. Scikit-learn ermöglicht die Übergabe eines Arrays von Gewichten an den multioutput-Parameter. Der resultierende Score ist die gewichtete Summe der einzelnen Fehler.

Wenn beispielsweise der zweite Output doppelt so wichtig ist wie der erste, können Gewichte wie [0.33, 0.67] angewendet werden. Dies stellt sicher, dass der finale Skalar die priorisierte Bedeutung spezifischer Zielvariablen widerspiegelt.

from sklearn.metrics import mean_absolute_error; import numpy as np; y_true = np.array([[0.5, 1], [-1, 1], [7, -6]]); y_pred = np.array([[0, 2], [-1, 2], [8, -5]]); weighted_mae = mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]); print(weighted_mae) # Illustrative output: 0.85

Vergleich von gewichteter und gleichmäßiger Mittelwertbildung

Die gleichmäßige Mittelwertbildung ('uniform_average') ist das Standardverhalten und behandelt jeden Output als gleich gewichtet. Dies ist geeignet, wenn alle Ziele von gleicher Natur und Bedeutung sind.

Im Gegensatz dazu erlaubt die gewichtete Mittelwertbildung dem Benutzer, Fehler in spezifischen Dimensionen stärker zu bestrafen. Der Vergleich von 'raw_values' mit einem gewichteten Durchschnitt hilft zu bestimmen, ob ein globaler Score durch einen einzigen problematischen Output verzerrt wird oder ob das Modell über alle Ziele hinweg konsistent mittelmäßig ist.

Anwendung der Multi-Output-Logik auf verschiedene Metriken

Nicht alle scikit-learn-Metriken unterstützen den multioutput-Parameter. Gängige Regressionsmetriken wie der Mean Absolute Error (MAE), Root Mean Squared Error (RMSE) und der R2-Score unterstützen ihn.

Einige robuste Metriken, wie beispielsweise median_absolute_error, unterstützen jedoch keine Multi-Output-Inputs. In solchen Fällen müssen Benutzer manuell über die Output-Spalten iterieren und die Metrik für jede einzelne berechnen.

Erstellung benutzerdefinierter Scorer für gewichtetes Multi-Output

Um eine gewichtete Multi-Output-Metrik innerhalb von GridSearchCV oder cross_val_score zu verwenden, müssen Sie die Metrik mit make_scorer umschließen. Da der multioutput-Parameter ein Keyword-Argument ist, muss er während der Erstellung des Scorers übergeben werden.

Da diese Metriken typischerweise Verluste sind (bei denen niedriger besser ist), muss der Parameter greater_is_better in make_scorer auf False gesetzt werden, um sicherzustellen, dass der Suchalgorithmus den negierten Verlust korrekt maximiert.

from sklearn.metrics import make_scorer, mean_absolute_error; from sklearn.model_selection import GridSearchCV; from sklearn.linear_model import LinearRegression; weighted_mae_scorer = make_scorer(mean_absolute_error, multioutput=[0.3, 0.7], greater_is_better=False); grid = GridSearchCV(LinearRegression(), param_grid={}, scoring=weighted_mae_scorer)

Gleichzeitige Evaluierung mehrerer Metriken

Für eine umfassende Ansicht können Sie mehrere Leistungsindikatoren mit cross_validate verfolgen. Durch die Übergabe eines Dictionarys an den scoring-Parameter können Sie sowohl den gewichteten Aggregatwert als auch andere Metriken wie R2 gleichzeitig überwachen.

Dies ermöglicht es dem Entwickler zu sehen, ob die Verbesserung des gewichteten MAE auf Kosten der insgesamt erklärten Varianz (R2) über alle Outputs hinweg geht.

from sklearn.model_selection import cross_validate; from sklearn.metrics import make_scorer, mean_absolute_error; from sklearn.linear_model import LinearRegression; import numpy as np; X = np.random.rand(10, 3); y = np.random.rand(10, 2); scoring_dict = {'weighted_mae': make_scorer(mean_absolute_error, multioutput=[0.3, 0.7], greater_is_better=False), 'r2': 'r2'}; results = cross_validate(LinearRegression(), X, y, scoring=scoring_dict, cv=2); print(results['test_weighted_mae'])

Auswahl konsistenter Scoring-Funktionen

Konsistenz beim Scoring bedeutet, dass die Metrik mit dem Zielfunktional der Vorhersage übereinstimmen sollte. Wenn das Modell darauf trainiert ist, den Mittelwert vorherzusagen, sind RMSE oder MAE angemessen.

Achten Sie bei Multi-Output-Aufgaben darauf, dass die Gewichtungsstrategie nicht unbeabsichtigt die statistische Bedeutung der Metrik ändert. Beispielsweise sollte RMSE beim Mitteln vorsichtig behandelt werden, da die Quadratwurzel bei der Übersetzung von MSE zu RMSE erhalten bleiben muss, um die ursprüngliche Fehlerskala beizubehalten.

Was Sie prüfen sollten

  • Überprüfen Sie, ob y_true und y_pred passende Formen (n_samples, n_outputs) haben.
  • Bestätigen Sie, dass die gewählte Metrik den multioutput-Parameter unterstützt.
  • Stellen Sie sicher, dass greater_is_better=False in make_scorer für fehlerbasierte Metriken gesetzt ist.
  • Prüfen Sie, ob die Länge des Gewichts-Arrays mit der Anzahl der Output-Spalten übereinstimmt.

Der multioutput-Parameter wird nicht von allen Metriken unterstützt, insbesondere nicht von median_absolute_error. Er erfordert, dass die Ziel- und Vorhersage-Arrays passende Dimensionen haben.

Quellen

  1. scikit-learn: model evaluation ↗
  2. scikit-learn: mean_absolute_error ↗
  3. scikit-learn: root_mean_squared_error ↗
Nach oben ↑