1 votos

Enfoque para agrupar un gran marco de datos (~7M * 60) con diferentes tipos de datos

Ayer publiqué una pregunta similar . Sin embargo, esta pregunta es distinta, ya que busco más bien la validación de mi planteamiento.

Tengo un marco de datos con unos 7M de filas y 60 características. Las características son una mezcla de tipos de datos que incluyen booleanos, moneda, cuentas/integros. Aquí están algunos campos de muestra cortar y pegar de mi otro post reciente:

  • (Moneda / Dinero) Gasto mensual del cliente en $
  • (Recuento) Cantidad de servicio x que el cliente tiene activo con nosotros
  • (Cuenta) Cantidad de servicio y que el cliente tiene con nosotros
  • (Booleano) ¿Es el cliente un cliente de servicios premium?
  • (Boolean) Es el cliente algún otro tipo de cliente boolean
  • (Tiempo) Permanencia del cliente en meses
  • (Tiempo, pero con un significado totalmente diferente) Tiempo medio mensual dedicado a utilizar nuestro centro de llamadas

Entré en este proyecto pensando en utilizar kmeans, ya que lo he utilizado antes y es sencillo e intuitivo de entender. Sin embargo, después de investigar un poco descubrí que kmeans es no se adapta realmente a distintos tipos de datos .

No obstante, tengo curiosidad por ver los conglomerados que devuelve, así que escalé todos mis datos para que estuvieran entre 0 y 1 (como tengo algunas características categóricas preprocesadas de 1 y 0, pensé que ayudaría transformar todos mis datos para que estuvieran entre 0 y 1).

Where pdata_scaled is my data frame with regular actual numbers and then being scaled to be between 0 and 1.
pdata_scaled[scale_features] <- lapply(pdata_scaled[scale_features], 
                                       function(x) {(x-min(x))/(max(x)-min(x))})

A continuación, ejecuto kmeans, añado el vector de conglomerados a mi marco de datos original, agrupo por conglomerados e informo de algunos datos resumidos sobre cada conglomerado.

Sin embargo, esta entrada sugiere utilizar la distancia de Gowers cuando se trabaja con datos de tipos mixtos.

Copiando el ejemplo proporcionado en la respuesta de ese post, he creado una matriz de distancias:

pdata_gower_distance_matrix <- cluster::daisy(select(pdata, -c(year_month, shopper_id)), metric = "gower")

Pregunta 1: A la hora de crear una matriz de distancias, ¿es mejor utilizar datos brutos o utilizar el marco de datos escalados?

No pude crear una matriz de distancia en mi marco de datos completo, finalmente pude crear una con una muestra de 10K filas solamente. Eso es una fracción del 1% de mis datos completos (0,14%).

Incluso con esta muestra de 10K filas / < 1% de todos mis datos, cuando intento ejecutar pamk clustering: ( consulte la documentación aquí )

pam_cluster <- pamk(pdata_gower_distance_matrix, 
                    krange = 10, 
                    criterion = "multiasw",
                    ns = 2,
                    usepam = F) 

La documentación dice que se ponga usepam en False para grandes conjuntos de datos, en cuyo caso se usa el método clara sobre pam:

" lógico. Si es TRUE, se utiliza pam; si no, clara (recomendado para grandes conjuntos de datos con 2.000 observaciones o más; disi con 2.000 observaciones o más; las matrices de disimilitud no pueden no pueden utilizarse con clara)".

Dado que parece llevar mucho tiempo clusterizar utilizando este método clara, y que pam no es adecuado para marcos de datos con más de 2K filas, esto es lo que estaba pensando como enfoque:

  1. Utilizar KMeans para determinar el número apropiado de conglomerados utilizando el gráfico de codos, ya que hacer algo similar con fpc::pamk() llevaría mucho tiempo.
  2. Cluster sobre una muestra, por ejemplo 10 o incluso 50K filas.
  3. Utilice un clasificador como Random Forrest de XGB para ajustar un modelo a los 10 o 50K datos agrupados, utilizando el vector de cluster como etiquetas.
  4. Predecir los conglomerados de los 6.990.000 restantes.

¿Es razonable mi planteamiento? ¿Hay alguna opción más sensata? La diferencia entre mi muestra, 10K o incluso 50K es tanto menor que mis datos completos que me incomoda.

Estoy limitado por la potencia de cálculo. Actualmente estoy trabajando en un Mac, dual core i5 16GB.

En cualquier momento voy a tener una máquina virtual con 8 núcleos y 47 GB, pero no estoy seguro de que eso cambie mucho las cosas?

¿Cómo debo agrupar mis 7 millones de registros de tipos de datos mixtos?

1voto

Amadiere Puntos 5606

Muchas de estas cosas (escalado, CLARA en lugar de PAM, etc.) son sólo hacks para poder invocar algún método x sobre sus datos.

Tienes que dar un paso atrás. ¿Qué hace realmente la función x? ¿Qué efecto tienen los hacks en el resultado de la función x? ¿Y cómo afecta todo esto a la solución de tu problema? A continuación, asegúrate de que realmente resolver el problema adecuado.

Muchas veces, las personas codifican las categorías porque consideran que es la única opción para que los datos sean "numéricos". Luego lo escalan todo porque han leído en alguna parte que esto puede ayudar. Pero, ¿qué están haciendo en realidad? Los resultados no serán mucho más significativos que un generador aleatorio...

Primero haz cuentas y estadísticas. Averigua cuál es la forma correcta de responder a tu problema. Después, haz el código.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X