Welche Ausreißererkennung kann diese Ausreißer erkennen?


7

Ich habe einen Vektor und möchte darin Ausreißer erkennen.

Die folgende Abbildung zeigt die Verteilung des Vektors. Rote Punkte sind Ausreißer. Blaue Punkte sind normale Punkte. Gelbe Punkte sind ebenfalls normal.

Ich benötige eine Ausreißererkennungsmethode (eine nicht parametrische Methode), mit der nur rote Punkte als Ausreißer erkannt werden können. Ich habe einige Methoden wie IQR und Standardabweichung getestet, aber sie erkennen auch gelbe Punkte als Ausreißer.

Ich weiß, dass es schwierig ist, nur den roten Punkt zu erkennen, aber ich denke, es sollte einen Weg (sogar eine Kombination von Methoden) geben, um dieses Problem zu lösen.

Geben Sie hier die Bildbeschreibung ein

Punkte sind Messwerte eines Sensors für einen Tag. Die Werte des Sensors ändern sich jedoch aufgrund der Neukonfiguration des Systems (die Umgebung ist nicht statisch). Die Zeiten der Neukonfigurationen sind unbekannt. Blaue Punkte gelten für den Zeitraum vor der Neukonfiguration. Gelbe Punkte stehen für nach der Neukonfiguration, was zu Abweichungen in der Verteilung der Messwerte führt (sind jedoch normal). Rote Punkte sind das Ergebnis einer illegalen Änderung der gelben Punkte. Mit anderen Worten, es handelt sich um Anomalien, die erkannt werden sollten.

Ich frage mich, ob die Schätzung der Kernel-Glättungsfunktion ('pdf', 'Survivor', 'cdf' usw.) Abhilfe schaffen könnte oder nicht. Würde jemand über die Hauptfunktionalität (oder andere Glättungsmethoden) und die Rechtfertigung für die Verwendung in einem Kontext zur Lösung eines Problems helfen?


3
Was macht diese Ausreißer und nicht die gelben? Haben Sie Beispiele für Ausreißer oder haben Sie gerade ein Set bekommen? Sieht es diesem ähnlich? Wie viele Dimensionen?
Jan van der Vegt

Vielen Dank. Punkte sind Messwerte eines Sensors für einen Tag. Die Werte des Sensors ändern sich jedoch aufgrund von Systemrekonfigurationen (die Umgebung ist nicht statisch). Blaue Punkte gelten für den Zeitraum vor der Neukonfiguration. Gelbe Punkte stehen für nach der Neukonfiguration, was zu Abweichungen in der Verteilung der Messwerte führt (sind jedoch normal). Rote Punkte sind das Ergebnis einer illegalen Änderung von gelben Punkten. Es ist eine Dimension.
Arkan

1
Wie oft kommen diese Neukonfigurationen vor? Treten diese roten Punkte immer auf? Sie können sich einige Zeitreihen-Glättungsmethoden ansehen.
Jan van der Vegt

Es ist dynamisch und nichts ist definitiv. Nein. Rote Punkte sind Anomalien, die durch illegale Änderungen verursacht wurden und nicht immer auftreten. Würde ich Sie bitten, einige bekannte Methoden (Glättungsmethoden) zu nennen? Was ist ihre Hauptfunktionalität?
Arkan

Wenn Sie nach Ebenenverschiebungen suchen, können Sie Änderungen im Achsenabschnitt finden. Veröffentlichen Sie Ihre Daten Siehe Artikel von Balke Erkennen von Pegelverschiebungen in Zeitreihen Nathan S. Balke Journal of Business & Economic Statistics Vol. 3, No. 11, No. 1 (Jan. 1993), S. 81-92
Tom Reilly

Antworten:


3

Sie können Ihre Daten als Zeitreihen betrachten, in denen eine normale Messung einen Wert ergibt, der dem vorherigen Wert sehr nahe kommt, und eine Neukalibrierung einen Wert ergibt, der sich stark vom Vorgänger unterscheidet.

Hier sind simulierte Beispieldaten basierend auf der Normalverteilung mit drei verschiedenen Mitteln ähnlich Ihrem Beispiel. Geben Sie hier die Bildbeschreibung ein

Durch Berechnung der Differenz zum vorherigen Wert (eine Art Ableitung) erhalten Sie folgende Daten:

Geben Sie hier die Bildbeschreibung ein

Meine Interpretation Ihrer Beschreibung ist, dass Sie eine Neukalibrierung tolerieren (dh Punkte in größerem Abstand von Null, rot im Diagramm), aber sie müssen zwischen positiven und negativen Werten wechseln (dh entsprechend der Verschiebung vom blauen zum gelben Zustand und zurück).

Dies bedeutet, dass Sie einen Alarm einrichten können, bei dem ein zweiter roter Punkt entweder auf der negativen oder der positiven Seite angezeigt wird .


Ich freue mich sehr über Ihre Antwort. Ja, wir können sagen, es ist wie eine Neukalibrierung und dies ist eine gute Analogie. Ihr Ansatz ist gut. Ich habe es getestet. Das Ergebnis ist genau das, das Sie gezeichnet haben. Der erste rote Punkt ist der erste Punkt der gelben Punkte. Der zweite Punkt ist der erste Punkt der roten Punkte. Der dritte rote Punkt ist der letzte Punkt der roten Punkte. Daher ist es schwierig, aus diesen Daten Wissen zu gewinnen. Dies liegt daran, dass wir die roten Punkte nach dem ersten roten Punkt nicht diskutieren konnten. Möglicherweise müssen wir die Primärdaten visualisieren, um zu dem Schluss zu kommen, aber dies ist eine menschliche Intervention.
Arkan

@Marmite Bomber Es wäre schön, wenn Sie den Codeausschnitt teilen, um die Idee aus programmtechnischer Sicht zu erfassen.
Mario

@Mario gute Idee - lassen Sie mich sehen, ob ich es nach mehr als zwei Jahren finden kann;)
Marmite Bomber

@Mario siehe meine andere Antwort;)
Marmite Bomber

@MarmiteBomber danke für das Feedback, aber Mann, ich war an Python-Code interessiert!
Mario

0

Wenn Sie die Protokollierung verwenden, können Sie einen laufenden Durchschnitt verwenden, der zurückgesetzt wird, wenn sich die Konfiguration ändert. Dies hat jedoch die Schwäche, dass Sie mindestens einige Daten benötigen, bevor Sie einen solchen Ausreißer erkennen können.

Ihre Daten sehen eher "nett" aus (nicht zu viel Rauschen). Ich würde empfehlen, den Durchschnitt der letzten 10 bis 20 Punkte in derselben Konfiguration zu ermitteln. Wenn es sich bei diesen Werten um eine gezählte Größe handelt, können Sie einen Poisson-Fehler für einzelne Datenpunkte nehmen und den Fehler im Durchschnitt berechnen.

Wie viele historische Daten haben Sie? Wenn Sie viel haben, können Sie damit Ihre Alarmrate so einstellen, dass Sie ein akzeptables Verhältnis aller echten Ausreißer erhalten und gleichzeitig eine minimale Anzahl gefälschter Warnungen erhalten. Was akzeptabel ist, hängt vom spezifischen Problem ab. (Kosten für falsch positive oder nicht erkannte Ausreißer und deren Häufigkeit).


Vielen Dank. Leider sind die Neukonfigurationen unterschiedlich und dies lässt uns keine Alarmrate einstellen. Können Sie etwas mehr über die Mittelung der letzten Punkte erklären?
Arkan

Ich gehe davon aus, dass diese Datenpunkte in chronologischer Reihenfolge korrekt sind. Dann können Sie für jeden Punkt die Informationen der y-Achse (Daten in Ihrem Diagramm) der letzten XX Punkte verwenden. Sagen wir 10, aber das hängt natürlich ein wenig davon ab, wie Ihre Daten aussehen. Für diese 10 Punkte berechnen Sie dann den Durchschnitt oder besser, wenn Sie eine Fehlerschätzung für die einzelnen Messungen des gewichteten Fehlers haben.
El Burro

Sie können die Alarmrate weiterhin einstellen, da Sie einen Alarm nicht als Abweichung von einem festen Wert größer als X definieren, sondern als Abweichung von einem gleitenden Durchschnitt.
El Burro

Danke. Ja. Sie in chronologischer Reihenfolge. Ich frage mich, ob die Schätzung der Kernel-Glättungsfunktion eine Hilfe ist oder nicht.
Arkan

Ich würde vorschlagen, mit einem einfachen gleitenden Durchschnitt zu beginnen, der bei jeder Konfigurationsänderung zurückgesetzt wird, und zu prüfen, ob die Aufgabe erledigt wird. Wenn Sie die Informationen nicht zur Verfügung haben, wenn eine Konfigurationsänderung aufgrund des Aussehens erfolgt, sehe ich keine andere zuverlässige Option, um Gelb von Rot zu trennen. Zumindest im gegebenen Beispiel sieht es nicht so aus, als ob die Form zwischen beiden sehr unterschiedlich ist.
El Burro

0

Veranschaulichen wir den in der anderen Antwort vorgeschlagenen Ansatz anhand eines einfachen Beispiels

Daten empfangen

Wir werden diese Daten mit sieben Blöcken simulieren, die mit normaler Verteilung mit unterschiedlichen Mitteln erzeugt wurden.

Dies ist wichtig, da wir so sauber zwischen den Gruppen unterscheiden und die Bruchstellen einfach erkennen können. Bei dieser Antwort wird ein elementarer Schwellenwertansatz verwendet. Für Ihre realen Daten ist möglicherweise ein fortgeschrittener Weg erforderlich.

dt <- rbind(
data.frame(color=1, x =  round(runif(50, min = 0, max = 50)), y = rnorm (50,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 50, max = 65)), y = rnorm (15,mean=4.5, sd=.03)),
data.frame(color=2, x =  round(runif(15, min = 65, max = 80)), y = rnorm (15,mean=3.3, sd=.03)),
data.frame(color=1, x =  round(runif(70, min = 80, max = 150)), y = rnorm (70,mean=3.9, sd=.03)), 
data.frame(color=2, x =  round(runif(15, min = 150, max = 165)), y = rnorm (15,mean=3.3, sd=.03)), 
data.frame(color=3, x =  round(runif(15, min = 165, max = 180)), y = rnorm (15,mean=2.9, sd=.03)), 
data.frame(color=1, x =  round(runif(120, min = 180, max = 300)), y = rnorm (120,mean=3.9, sd=.03))
)
dt$color <- as.factor(dt$color)
dt <- as_tibble(dt)

Geben Sie hier die Bildbeschreibung ein

Leiten Sie die Bruchstellen ab

Mit einem einfachen Unterschied zum vorhergehenden Punkt erhalten lag(y) wir die Ausreißer. Sie werden anhand eines Schwellenwerts klassifiziert.

Geben Sie hier die Bildbeschreibung ein

Änderung der Verhaltensklassifizierung

Basierend auf den von Ihnen beschriebenen Regeln werden die Bruchstellen als OKund klassifiziert problem.

Die Regel besagt, dass keine zwei Änderungen in derselben Richtung zulässig sind. Der zweite Schritt in die vorherige Richtung wird als Problem angesehen.

Möglicherweise müssen Sie diese einfache Interpretation anpassen, wenn Ihre Logik fortgeschrittener ist.

## extract outliers and get previous value
dt2 <- filter(dt2, diff != 0) %>%
   mutate(cs = cumsum(diff),
          prev = lag(diff),
          cls = case_when(
                      diff * prev >  0 ~ "problem",
                      TRUE ~ "OK"))
## show 
dt2 %>% select(x,y,diff,prev,cls)                       
## # A tibble: 6 x 5
##       x     y  diff  prev cls    
##   <dbl> <dbl> <dbl> <dbl> <chr>  
## 1    50  4.53     1    NA OK     
## 2    66  3.32    -1     1 OK     
## 3    80  3.87     1    -1 OK     
## 4   151  3.32    -1     1 OK     
## 5   167  2.91    -1    -1 problem
## 6   180  3.87     1    -1 OK

Präsentation

Schließlich projizieren Sie die erkannten Ausreißer auf die Originaldaten

## project in the original data
ggplot(data=dt, mapping = aes(x=x, y=y) )  +
  geom_point(mapping = aes(color = color) )  +
  scale_color_manual(values=c("blue", "yellow", "red","green","red")) +
  theme(legend.position="none") +
  geom_vline(data=dt2, aes(xintercept=x, color=cls),
             linetype="dashed", size = 2)

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.