Per confrontare le prestazioni del computer con i metodi statistici con grandi dati , possiamo solo generare dati casuali e misurare le prestazioni su questo, giusto? Bene, potrebbe essere che i dati simulati potrebbero non agire come i dati reali. Scopriamolo.
Regressione logistica
Supponiamo che stiamo analizzando la regressione logistica. Quindi creiamo alcuni regressori come uniformi casuali e creiamo una risposta categorica influenzata dai regressori. Usiamo un milione di righe. Ecco un esempio di script per farlo:
dt = newTable ("BenchmarkLogistic.jmp");
dt <
dt <
dt <
dt <
dt <
Se (RandomUniform () <1 / (1 + exp (- (: X1-X2 + X3))), "Y", "N")));
Ora eseguiamo Fit Model in JMP e ora.
startTime = TickSeconds ();
Fit Model (
Y (: YCat),
Effetti (: X1,: X2,: X3),
Personalità (Logistica nominale),
Esegui (test rapporto di verosimiglianza (1), test Wald (0))
);
firstTime = TickSeconds () - startTime; mostra (firstTime);
Sulla mia macchina, questo viene eseguito 6,53 secondi . Non male per un milione di righe.
Volevo trasferire questi dati su un altro sistema per confrontarli, ma era una seccatura avere tutti quei numeri decimali nei numeri uniformi casuali. Il benchmark dovrebbe funzionare altrettanto bene se li arrotondassi a una cifra decimale, quindi ho modificato il mio script del generatore di dati aggiungendo una funzione Round.
dt = newTable ("BenchmarkLogistic2.jmp");
dt <
dt <
dt <
dt <
dt <
Se (RandomUniform () <1 / (1 + exp (- (: X1-X2 + X3))), "Y", "N")));
Ora eseguo la stessa regressione logistica con tutto lo stesso eccetto per l'arrotondamento, e ci vuole 1 secondo . Sì, funziona sei volte più veloce utilizzando dati arrotondati!
La macchina deve lavorare di più facendo aritmetica con più cifre decimali? Ovviamente no. Non usa nemmeno l'aritmetica decimale. Viene convertito in binario e i bit si estendono fino ai dati non circoscritti.
Quindi, cosa spiega il mistero?
Bene, si scopre che con solo 11 valori possibili per ogni X, poiché ci sono tre X, ci sono solo 1.331 combinazioni uniche per le tre variabili. La piattaforma logistica in realtà individua tutte le combinazioni uniche nei dati. E quando ci sono molte partite, è in grado di combinare le osservazioni e solo scorrere le combinazioni uniche. Quindi, per quanto riguarda la logistica, la maggior parte dell'informatica è stata eseguita su 1331 combinazioni anziché su 1 milione di righe. Quindi, solo un secondo invece di 6,53 secondi.
Allora, qual è la lezione per usare la logistica? Anche se disponi di molti dati, è il numero di combinazioni univoche di valori che conta più del numero di righe.
E qual è la lezione per l'utilizzo di dati simulati? Se ti aspetti un piccolo numero di livelli, anche se la variabile è continua, dovresti simulare con quel piccolo numero di valori univoci, invece che con una distribuzione casuale continua.
Ora con un piccolo numero di regressori, è facile trarre vantaggio dalle combinazioni uniche. Ma con l'aumentare del numero di regressori, è sempre meno probabile che si possano comprimere i dati in un numero limitato di combinazioni univoche.
Altre piattaforme di montaggio
Le altre piattaforme di montaggio fanno questo raggruppamento? Anche la personalità dei minimi quadrati cerca combinazioni uniche, ma non per accelerare i calcoli. Ha bisogno di trovarli per la mancanza di test di idoneità. Tuttavia, se si dispone di decine di milioni di righe, è possibile dedicare qualche secondo a questo test di mancanza di adattamento e il test di solito non è comunque interessante per i casi di grandi dimensioni. Quindi, per accelerare le cose, quando il numero di righe è 20.000 o più, cambia l'impostazione predefinita in modo che la mancanza di adattamento sia disattivata, in modo che non passi tutto il tempo a fare qualcosa che di solito non è voluto.
Che dire dei dati in altri casi, come alberi decisionali? Fa la differenza se i dati simulati sono unici o arrotondati? Sì, lo fa. Quando ordina i valori X, sfrutta le cravatte mettendole di lato in modo che non debbano essere confrontate di nuovo, quindi meno valori hai, più veloce è l'ordinamento.
Clustering
Che dire del clustering? È importante come i dati vengono generati casualmente per misurare la velocità?
Ho deciso di generare quattro serie di dati simulati per vedere se i dettagli fanno la differenza. Ho iniziato con dati puri, indipendenti, normali, casuali: 10.000 righe per 50 colonne. Era il momento di raggruppare 28,83 secondi .
Ora, nel mondo reale, i dati non sono indipendenti. È correlato. Quindi la prossima corsa era lo stesso tipo di dati, ma trasformata per essere altamente correlata; ogni colonna aveva una correlazione di .95 con le altre. Il momento di raggruppare solo quello 4,18 secondi - più di sei volte più veloce !
Perché dovrebbe essere così? Si scopre che con tali correlazioni, se si prendono i componenti principali, il 95% della variazione è nel primo componente principale. Quindi se guardi le distanze tra i punti - e scorri il ciclo della distanza quando hai ottenuto più della distanza a cui stavi confrontando - allora la maggior parte delle volte, deve solo guardare il primo elemento per sapere che una certa distanza non è la più piccola. Nel cluster gerarchico, facciamo sempre a Scomposizione di un valore singolo (SVD) dei dati prima di raggrupparli in modo che l'algoritmo funzioni più velocemente. Il SVD è generalmente molto più economico del clustering gerarchico, quindi questo è un prezzo che di solito vale la pena pagare.
Ma il mondo reale ha dati in gruppi, altrimenti non faremmo clustering. Andrà più veloce se i dati sono in cluster naturali piuttosto che diffondersi più uniformemente nello spazio? Abbiamo generato una serie di dati non correlati ma scomodi, in cui vi erano 100 gruppi ben separati con 100 punti in ciascun gruppo. Il momento di raggruppare solo quello 2,83 secondi . Quando i dati sono raggruppati in modo naturale, la ricerca dei vicini vicini è più veloce, perché organizza meglio lo spazio.
Cosa succede se si combinano il clumpiness e le alte correlazioni? In tal caso, il tempo scende a 0,98 secondi , 29 volte più veloce rispetto a quando abbiamo iniziato, anche se i dati erano della stessa dimensione e distribuzione marginale.
|
| Random non correlato |
|
28,833|
| Correlato casuale |
|
4.183|
| Clumpy non correlato |
|
2.833|
| Corrugato Clumpy |
|
0,983
Ora, cosa succede se hai eseguito questi stessi benchmark in un diverso programma di clustering? I classici algoritmi di clustering gerarchico sono lenti, assumendo sempre qualcosa di proporzionale al tempo n ^ 3 * p. Ma con l'uso di SVD di JMP e una versione molto vicina e vicina del metodo di Ward, è molto più veloce del metodo classico - anche se dipende dalla velocità dei dati, mentre il metodo classico è molto più coerente e, ovviamente, molto più lento.
// Uncorrelated Random
dtUncorr = asTable (J (10000,50, RandomNormal ()));
startTime = TickSeconds ();
dtUncorr <
timeUnCorr = TickSeconds () - startTime;
// Correlato casuale
theCorr = .05 * Identity (50) +. 95 * J (50,50);
dtCorr = asTable (J (10000,50, RandomNormal ()) * Cholesky (theCorr) `);
startTime = TickSeconds ();
dtCorr <
timeCorr = TickSeconds () - startTime;
// Uncorrelated Clumped Random 100 clumps, 100 per clump
dtClumped =
Astabile (DirectProduct (J (100,50,20 * RandomUniform ()), J (100,1,1)) + 1 * J (10000,50, CasualeNormale ()).);
startTime = TickSeconds ();
dtClumped <
timeClumped = TickSeconds () - startTime;
// Correlati Clumped Random 100 clumps, 100 per clump
data = DirectProduct (J (100,50,20 * RandomUniform () - 10), J (100,1,1)) +. 1 * J (10000,50, RandomNormal ());
dtClumpedCorr = AsTable (data * Cholesky (theCorr) `); data = 0;
startTime = TickSeconds ();
dtClumpedCorr <
timeClumpedCorr = TickSeconds () - startTime;
categorizzare
Che dire di altri posti in JMP? Ha importanza quali sono le caratteristiche dei dati?
Sì, lo fa. In generale, le cose vanno più velocemente con le categorie se non ce ne sono troppe. Se ci sono meno di 5.000 livelli di una categoria, usa metodi associativi di array per creare categorie e sfrutta anche il multithreading. Tuttavia, se ci sono più di 5.000 livelli, e soprattutto se ci sono milioni di livelli, il carico di allocazione della memoria diventa costoso e utilizza invece metodi di ordinamento.
Conclusione
Se è necessario eseguire il benchmark delle prestazioni di un metodo utilizzando dati simulati, è importante conoscere le proprietà con cui si simula: è preferibile provare a duplicare le proprietà dei dati a cui si desidera applicarle.
In breve, dipende ; i dettagli contano.
JMP prova piuttosto a sfruttare le proprietà tipiche dei dati reali.
Nota: Questo fa parte di una serie di blog di Big Sections di John Sall. Leggi tutti i suoi Messaggi di statistiche grandi .