Warum skaliert die Stichprobe mit dem Datensatz und nicht mit der Stichprobengröße? (Pandas. Beispiel () Beispiel)

8

Bei der Stichprobenauswahl aus Verteilungen verschiedener Größen war ich überrascht zu beobachten, dass die Ausführungszeit hauptsächlich mit der Größe des Datensatzes zu skalieren scheint und nicht mit der Anzahl der Werte, die abgetastet werden. Beispiel:

%Vor%

Die Ausgabe ist:

%Vor%

Das scheint nicht intuitiv zu sein. Vielleicht bin ich dicht, aber das Problem scheint der Erstellung einer Liste von Zufallsindizes ähnlich zu sein, und ich hätte erwartet, dass die Anzahl der gesampelten Werte eine Rolle spielt und die Größe des Datasets nicht so wichtig ist. Ich habe eine oder zwei andere Implementierungen mit ähnlichen Ergebnissen versucht, und es fühlt sich an, als ob ich nur ein grundlegendes Problem vermisse.

Meine Fragen sind zweifach: (1) Ist das ein grundlegendes Problem oder eine Eigenart der Umsetzung in Pandas? (2) Gibt es einen wesentlich schnelleren Ansatz, um auf diese Weise aus großen Datensätzen Stichproben zu ziehen?

    
c_layton 25.03.2017, 01:21
quelle

2 Antworten

7

pandas.Series.sample() läuft in Ihrem Fall darauf hinaus:

%Vor%

Der langsame Teil ist rs.choice() :

%Vor%

Es dauert ungefähr 10 Sekunden, um eine einzelne Zufallszahl zu erzeugen! Wenn Sie das erste Argument mit 10 teilen, dauert es etwa 1 Sekunde. Das ist langsam!

Wenn du replace=True benutzt, ist es super schnell. Das ist also ein Workaround für Sie, wenn es Ihnen nichts ausmacht, doppelte Einträge in Ihren Ergebnissen zu haben.

Die NumPy-Dokumentation für choice(replace=False) sagt:

  

Dies entspricht np.random.permutation (np.arange (5)) [: 3]

Was das Problem ziemlich genau erklärt - es erzeugt eine riesige Auswahl an möglichen Werten, mischt sie und nimmt dann das erste N. Dies ist die Ursache Ihres Leistungsproblems und wurde hier bereits als Problem in NumPy gemeldet : Ссылка

Es ist anscheinend schwierig, in NumPy zu beheben, weil Leute sich darauf verlassen, dass das Ergebnis von choice() sich nicht ändert (zwischen Versionen von NumPy), wenn sie denselben zufälligen Startwert verwenden.

Da Ihr Anwendungsfall ziemlich eng ist, können Sie so etwas tun:

%Vor%

Das gibt viel schnellere Zeiten:

%Vor%     
John Zwinck 25.03.2017, 02:00
quelle
4

Das scheint ein internes Problem zu sein. Ich glaube, dass die Methode pandas sample numpy.random.choice aufruft. Werfen wir einen Blick darauf, wie sich numpy bei verschiedenen Array-Größen und Stichprobengrößen verhält.

Erstellen Sie Arrays

%Vor%

Zeit die Probe ohne Ersatz

%Vor%

Zeit die Probe mit Ersatz

%Vor%

Sehr interessant, wenn die Probe ohne Ersatz gemacht wird, nimmt das große Array fast 3 Größenordnungen länger und es ist genau drei Größenordnungen so groß. Dies deutet darauf hin, dass numpy das Array nach dem Zufallsprinzip sortiert und dann die ersten 10 Elemente nimmt.

Beim Sampling mit Ersatz wird jeder Wert unabhängig gewählt, so dass die Timings identisch sind.

    
Ted Petrou 25.03.2017 02:03
quelle

Tags und Links