ausreißer einer Prozesskurve entfernen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Ich habe eine Kraft-Weg Kurve mit einigen Ausreißern. Das heißt ich habe eine Liniengraphen der an manchen Stellen von einem hohen Wert plötzlich auf Null runterläuft und im Anschluss dann gleich wieder auf den normalen bzw erwarteten Wert hochschießt. Bevor ich die Kurve in ein ML Algorithmus einspeisen, kann muss ich diese Ausreißer entfernen.
Mir ist aber leider keine Funktion aus Sklearn oder Tensorflow bekannt mit der ich das anstellen könnte.

Kann mir bitte jemand weiterhelfen.

Vielen Dank im Voraus!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und hast du mal außerhalb dieser beiden spezifischen Pakete gesucht? Das ist ja nun ein allgemeines Thema. Nicht nur ein ML bezogenes.
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Das habe ich. Die Methoden mit Pandas (anomalie detection mit querentil, zscores, etc) funktioniert bei meinem Dataset nicht. Ob eine Messung eine Anomalie ist oder nicht hängt bei Prozesskurven von den benachbarten Datapoints ab.
Bsp.: Null wäre zu Beginn des Prozesses, wobei keine Kraft wirkt, keine Anomalie. Wenn aber eine Kraft von 10kN wirkt und man zunächst 10kN misst, aber dann plötzlich 0kN gemessen werden, dann handelt es sich bei der Null um eine Anomalie.

Ich habe dazu 2 unsupervised ML von sklearn gefunden: sklearn.ensemble.IsolationForest und sklearn.neighbors.LocalOutlierFactor
Welche davon besser geeignet ist muss ich noch schauen.
cjteclab
User
Beiträge: 6
Registriert: Dienstag 14. Dezember 2021, 13:35

Ich kenne den Datensatz nicht, aber vielleicht hast du die Möglichkeit die Ausreißer einfach mittels "drop + condition" zu löschen.
df.drop(df[(df.column_weg > value_X) & (df.column_kraft == 0)].index, inplace=True)
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Lies dir mal diesen Artikel durch, wie man fehlende Werte noch behandeln kann, außer sie einfach zu entfernen.
Siehe Absatz "Fill Missing Values" , "2. bfill, ffill"
Besonders empfehlenswert wenn der Nullwert einen Zeitstempel hat und durch entfernen eine Lücke in einer Zeitreihe entstehen würde.

https://towardsdatascience.com/data-cle ... 8570c446ec
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Vielen Dank an beide.
(1) Ich habe die Ausreißer mit LocalOutlierFactor rausgesucht (mit IsolationForest habe ich nicht die gewünschten Ergebnisse erzielen können).
(2) Im Anschluss habe ich die Ausreißer mit np.nan gleichgesetzt.
(3)Und zum Schluss die np.nan werte mit der fillna befüllt.

Der Code dazu:

Code: Alles auswählen

# 1) Ausreißer finden
from sklearn.neighbors import LocalOutlierFactor
outlier_detection_model = LocalOutlierFactor(n_neighbors = 105)
outlier_label = outlier_detection_model.fit_predict(np.array(y_achse).reshape(-1,1))

# 2) Ausreißer mit np.nan gleichsetzen
y_achse[outlier_label ==-1] =np.nan

# 3) Ausreißer bzw. NaN ersetzen
y_achse = y_achse.fillna(method = "bfill")
Ich habe für die 5 Zeilen fast einen ganzen tag gebraucht :?
ist das normal?
Antworten