Ausreißer in jeder Spalte entfernen (und entsprechende Zeile)

Mein Numpy Array enthält 10 Spalten und ca. 2 Millionen Zeilen.

Jetzt muss ich jede Spalte separat analysieren, Werte finden, die Ausreißer sind; Und lösche die gesamte entsprechende Zeile aus dem Array.

So würde ich beginnen, Spalte 0 zu analysieren; Finde Ausreißer in Zeile 10,20,100; Und entfernen Sie diese Zeilen. Als nächstes würde ich beginnen, Spalte 1 in dem jetzt getrimmten Array zu analysieren. Und denselben Prozess anwenden.

Natürlich kann ich an einen normalen manuellen Prozess denken, um dies zu tun (iterieren Sie durch jede Spalte, finden Sie Indizes, die Ausreißer sind, Zeile löschen, gehen Sie zu einer anderen Spalte), aber ich habe immer festgestellt, dass Numpy enthält einige schnelle nifty Tricks, um statistische zu erreichen Aufgaben wie diese.

Und wenn man ein bisschen auf die Laufzeitkosten der Methode ausarbeiten könnte; noch besser.

Ich bin nicht beschränkt auf die NumPy-Bibliothek hier, wenn SciPy hat etwas hilfreich dann keine Probleme mit ihm.

Vielen Dank!

2 Solutions collect form web for “Ausreißer in jeder Spalte entfernen (und entsprechende Zeile)”

Zwei sehr einfache Ansätze, die zweite mit ein wenig mehr Raffinesse:

arr = np.random.randn(2e6, 10) def remove_outliers(arr, k): mu, sigma = np.mean(arr, axis=0), np.std(arr, axis=0, ddof=1) return arr[np.all(np.abs((arr - mu) / sigma) < k, axis=1)] def remove_outliers_bis(arr, k): mask = np.ones((arr.shape[0],), dtype=np.bool) mu, sigma = np.mean(arr, axis=0), np.std(arr, axis=0, ddof=1) for j in range(arr.shape[1]): col = arr[:, j] mask[mask] &= np.abs((col[mask] - mu[j]) / sigma[j]) < k return arr[mask] 

Leistung hängt davon ab, wie viele Ausreißer Sie haben:

 In [38]: %timeit remove_outliers(arr, 1) 1 loops, best of 3: 1.13 s per loop In [39]: %timeit remove_outliers_bis(arr, 1) 1 loops, best of 3: 983 ms per loop In [40]: %timeit remove_outliers(arr, 2) 1 loops, best of 3: 1.21 s per loop In [41]: %timeit remove_outliers_bis(arr, 2) 1 loops, best of 3: 1.51 s per loop 

Und natürlich:

 In [42]: np.allclose(remove_outliers(arr, 1), remove_outliers_bis(arr, 1)) Out[42]: True In [43]: np.allclose(remove_outliers(arr, 2), remove_outliers_bis(arr, 2)) Out[43]: True 

Ich würde sagen, dass die Komplikation der zweiten Methode nicht rechtfertigt seine potenzielle Beschleunigung, aber YMMV …

Die bestmögliche Lösung hängt von den relativen Kosten für die Suche nach einem Ausreißer, das Löschen einer Zeile und die Häufigkeit der Ausreißer ab.

Wenn Ihre Ausreißerfrequenz nicht sehr hoch ist, würde ich folgendes tun:

  • Erstellen Sie eine boolesche Tabelle von Ausreißern (ein Element für jedes Element in der ursprünglichen Tabelle)
  • Summiere die Tabelle entlang der Achse (Summe jeder Zeile)
  • Erstellen Sie eine neue Tabelle, wo es nur die Zeilen gibt, in denen die Ausreißersumme 0 ist

Das Löschen von Zeilen von Eins-zu-eins dauert viel Zeit, und wenn Outlier-Finding ist nicht sehr teuer ist die zusätzliche Arbeit aufgrund möglicher Feststellung von mehreren Ausreißern in der gleichen Zeile ist nicht signifikant.

Als Code wäre das so:

 outliers = find_outliers(data) data_without_outliers = data[outliers.sum(axis=1) == 0] 

Wo find_outliers eine boolesche Tabelle des Ausreißerstatus erzeugt (dh True wenn das entsprechende Element in den ursprünglichen Array- data ein Ausreißer ist).

Meine Vermutung ist, dass die Leistung von Ihrem Ausreißer-Erkennungsalgorithmus abhängt. Wenn du es einfach und vektorisiert machst, dann ist das schnell.

  • Richtiger Weg, um das Konfidenzintervall mit scipy zu erhalten
  • In Python, wie kann ich Korrelation und statistische Signifikanz zwischen zwei Arrays von Daten zu berechnen?
  • Iteration über scipy spärliche Matrix nach Spalte
  • 3D-Matrix-Perspektive transformieren
  • Auswählen von Pandas-Spalten durch dtype
  • Es ist nicht möglich, `scipy.interpolate.RectBivariateSpline` mit` matplotlib.pyplot, plot_surface` zu ​​verwenden
  • Iterate zwei oder mehr Listen / numpy Arrays ... und vergleichen Sie jedes Element mit einander und vermeiden Schleifen in Python
  • Speichern / laden scipy sparse csr_matrix im tragbaren Datenformat
  • Anpassung einer Verteilung mit dem Histogramm mit scipy
  • Finde die Wurzel einer kubischen Funktion
  • Orthogonale Distanzregression in Python: Bedeutung der zurückgegebenen Werte
  • Python ist die beste Programmiersprache der Welt.