Para comparar el rendimiento de la computadora en métodos estadísticos con grandes datos , solo podemos generar datos aleatorios y medir el rendimiento en eso, ¿verdad? Bueno, podría ser que los datos simulados no actúen igual que los datos reales. Vamos a averiguar.
Regresión logística
Supongamos que estamos comparando la regresión logística. Así que creamos algunos regresores como aleatorios uniformes y creamos una respuesta categórica que se ve afectada por los regresores. Utilizamos un millón de filas. Aquí hay un ejemplo de un script para hacer eso:
dt = newTable ("BenchmarkLogistic.jmp");
dt <
dt <
dt <
dt <
dt <
Si (RandomUniform () <1 / (1 + Exp (- (: X1-X2 + X3))), "Y", "N")));
Ahora ejecutamos Fit Model en JMP y la hora.
startTime = TickSeconds ();
Modelo de ajuste(
Y (: YCat),
Efectos (: X1,: X2,: X3),
Personalidad (Logística Nominal),
Ejecución (Pruebas de relación de verosimilitud (1), Pruebas de Wald (0))
);
firstTime = TickSeconds () - startTime; show (firstTime);
En mi máquina, esto se ejecuta en 6.53 segundos . No está mal para un millón de filas.
Quería transferir estos datos a otro sistema para compararlos, pero era una molestia tener todos esos lugares decimales en los números uniformes aleatorios. El punto de referencia debería funcionar igual de bien si los redondeo a un lugar decimal, así que cambié mi secuencia de comandos del generador de datos agregando una función de Ronda.
dt = newTable ("BenchmarkLogistic2.jmp");
dt <
dt <
dt <
dt <
dt <
Si (RandomUniform () <1 / (1 + Exp (- (: X1-X2 + X3))), "Y", "N")));
Ahora ejecuto la misma regresión logística con todo lo mismo excepto el redondeo, y toma 1 segundo . Si, corre seis veces más rápido mediante el uso de datos redondeados!
¿La máquina tiene que trabajar más duro haciendo aritmética con más decimales? Por supuesto no. Ni siquiera usa aritmética decimal. Se convierte a binario, y los bits se extienden tanto como con los datos sin redondear.
Entonces, ¿qué explica el misterio?
Bueno, resulta que con solo 11 valores posibles para cada X, ya que hay tres X, solo hay 1,331 combinaciones únicas para las tres variables. La plataforma logística en realidad descubre todas las combinaciones únicas en los datos. Y cuando hay muchas coincidencias, puede combinar observaciones y simplemente iterar a través de combinaciones únicas. Así que para logística, la mayor parte de la computación se realizó en 1,331 combinaciones en lugar de las 1 millones de filas. Por lo tanto, sólo un segundo en lugar de 6,53 segundos.
Entonces, ¿cuál es la lección para usar Logística? Incluso si tiene muchos datos, es el número de combinaciones únicas de valores lo que cuenta más que el número de filas.
¿Y cuál es la lección para usar datos simulados? Si espera un pequeño número de niveles, incluso si la variable es continua, debe simular con ese pequeño número de valores únicos, en lugar de una distribución aleatoria continua.
Ahora, con un pequeño número de regresores, es fácil aprovechar las combinaciones únicas. Pero a medida que aumenta el número de regresores, es cada vez menos probable que pueda contraer los datos en un pequeño número de combinaciones únicas.
Otras plataformas de montaje
¿Las otras plataformas de montaje hacen esta agrupación? La personalidad de los Mínimos cuadrados también busca combinaciones únicas, pero no para acelerar los cálculos. Necesita encontrarlos por falta de test de ajuste. Pero resulta que si tiene decenas de millones de filas, puede pasar segundos obteniendo esta prueba de falta de ajuste, y la prueba no suele ser interesante para casos grandes de todos modos. Entonces, para acelerar las cosas, cuando el número de filas es de 20,000 o más, cambia el valor predeterminado por falta de ajuste para que esté desactivado, de modo que no invierta todo ese tiempo haciendo algo que normalmente no se desea.
¿Qué pasa con los datos en otros casos, como los árboles de decisión? ¿Hay alguna diferencia si los datos simulados son únicos o redondeados? Si lo hace Cuando se clasifica por esos valores de X, aprovecha los vínculos colocándolos de lado para que no sea necesario volver a compararlos, por lo que cuantos menos valores tenga, más rápido será el ordenamiento.
Agrupación
¿Qué pasa con el agrupamiento? ¿Importa cómo se generan aleatoriamente los datos para medir la velocidad?
Decidí generar cuatro conjuntos de datos simulados para ver si los detalles hacen una diferencia. Comencé con datos puros, independientes, normales, aleatorios: 10,000 filas por 50 columnas. El tiempo para agrupar fue 28.83 segundos .
Ahora, en el mundo real, los datos no son independientes. Está correlacionado. Así que la siguiente ejecución fue el mismo tipo de datos, pero transformados para estar altamente correlacionados; Cada columna tuvo una correlación de .95 con las otras. El tiempo para agrupar que era solo 4.18 segundos - más de seis veces más rápido !
¿Por qué ese sería el caso? Resulta que con esas correlaciones, si toma componentes principales, el 95% de la variación está en el primer componente principal. Entonces, si observas distancias entre puntos y recorres el bucle de distancia cuando obtuviste más de la distancia con la que comparabas, entonces la mayoría de las veces, solo hay que mirar el primer elemento para saber Que cierta distancia no es la más pequeña. En cluster jerárquico, siempre hacemos una valor singular de descomposición (SVD) de los datos antes de agruparlos para que el algoritmo se ejecute más rápido. El SVD es generalmente mucho más barato que el agrupamiento jerárquico, por lo que este es un precio que generalmente vale la pena pagar.
Pero el mundo real tiene datos en grupos, de lo contrario no estaríamos haciendo agrupaciones. ¿Va más rápido si los datos están en grupos naturales en lugar de distribuirse de manera más uniforme en todo el espacio? Generamos un conjunto de datos no correlacionados pero agrupados, donde hubo 100 grupos bien separados con 100 puntos en cada grupo. El tiempo para agrupar que era solo 2.83 segundos . Cuando los datos se agrupan de forma natural, la búsqueda de vecinos cercanos es más rápida, ya que organiza mejor el espacio.
¿Qué pasa si combinas la aglomeración y las altas correlaciones? En ese caso, el tiempo se reduce a 0.98 segundos , 29 veces más rápido que cuando empezamos, a pesar de que los datos eran del mismo tamaño y distribución marginal.
|
| Aleatorios no correlacionados |
|
28.833|
| Correlacionado al azar |
|
4.183|
| Clumpy incorrelacionado |
|
2.833|
| Clumpy correlacionado |
|
0.983
Ahora, ¿qué sucede si realizó estos mismos puntos de referencia en un programa de agrupación en clúster diferente? Los algoritmos de agrupamiento jerárquico clásico son lentos, siempre toman algo proporcional al tiempo n ^ 3 * p. Pero con el uso de SVD por parte de JMP y una versión del método de Ward más cercana al vecino, es mucho más rápido que el método clásico, aunque depende de la velocidad de los datos, mientras que el método clásico es mucho más consistente y, por supuesto, mucho mas lento
// Aleatorio no correlacionado
dtUncorr = asTable (J (10000,50, RandomNormal ()));
startTime = TickSeconds ();
dtUncorr <
timeUnCorr = TickSeconds () - startTime;
// Aleatorio correlacionado
theCorr = .05 * Identity (50) +. 95 * J (50,50);
dtCorr = asTable (J (10000,50, RandomNormal ()) * Cholesky (theCorr) `);
startTime = TickSeconds ();
dtCorr <
timeCorr = TickSeconds () - startTime;
// Grupos agrupados aleatorios no correlacionados 100, 100 por grupo
dtClumped =
AsTable (DirectProduct (J (100,50,20 * RandomUniform ()), J (100,1,1)) +. 1 * J (10000,50, RandomNormal ()));
startTime = TickSeconds ();
dtClumped <
timeClumped = TickSeconds () - startTime;
// Grupos agrupados correlacionados aleatoriamente 100, 100 por grupo
datos = DirectProduct (J (100,50,20 * RandomUniform () - 10), J (100,1,1)) +. 1 * J (10000,50, RandomNormal ());
dtClumpedCorr = AsTable (data * Cholesky (theCorr) `); datos = 0;
startTime = TickSeconds ();
dtClumpedCorr <
timeClumpedCorr = TickSeconds () - startTime;
Categorizar
¿Qué pasa con otros lugares en JMP? ¿Importa cuáles son las características de los datos?
Si lo hace En general, las cosas van más rápido con las categorías si no hay demasiadas. Si hay menos de 5,000 niveles de una categoría, utiliza métodos de matrices asociativas para crear categorías y también aprovecha el multihilo. Sin embargo, si hay más de 5,000 niveles, y especialmente si hay millones de niveles, la carga de asignación de memoria se vuelve costosa, y en su lugar utiliza métodos de clasificación.
Conclusión
Si necesita comparar el rendimiento de un método utilizando datos simulados, es muy importante saber qué propiedades simular: es mejor tratar de duplicar las propiedades de los datos a los que desea aplicarlos eventualmente.
En breve, depende ; Los detalles importan.
JMP hace un gran esfuerzo para aprovechar las propiedades típicas de los datos reales.
Nota: Esto es parte de una serie de estadísticas de publicaciones de blog de John Sall. Leer todo su Grandes publicaciones de estadísticas .