Me gustaría hacer una regresión logística en R en un dato de 100 GB, ¿alguna buena idea de cómo hacerlo?

Alquile una instancia EC2 de 240 GB en Amazon Web Services.
Como regla general, R requiere 3 veces más RAM que los datos almacenados en la memoria. Probablemente podría ajustar su regresión logística con un muestreo mínimo (o incluso no) de esta manera.

Si la base glm ahoga, recomendaría consultar el paquete bigglm :
bigglm en su gran conjunto de datos en código abierto R, simplemente funciona, similar a SAS

Por último, también puede ejecutar un GLM en H20 a través de R:
H2O: aprendizaje automático escalable rápido para aplicaciones inteligentes

Si bien es probable que pueda resolver su problema específico con el muestreo, hay momentos en que esto no es deseable. Para algunas clases de problemas, el error del conjunto de pruebas podría continuar disminuyendo significativamente a medida que aumenta el número de ejemplos de capacitación.

Puede usar el descenso de gradiente estocástico (SGD) para realizar una regresión logística con una pequeña huella de memoria. Debería poder ejecutar esto en su computadora portátil personal (suponiendo que pueda acceder al conjunto de datos). SGD requiere que lea solo una muestra a la vez, y cada actualización es lineal en cuanto a la cantidad de características. Si bien SGD requiere mucha menos memoria, la estimación de su parámetro seguirá convergiendo al mismo valor que obtendría al hacer los mínimos cuadrados habitualmente reponderados. Intentaré describir el algoritmo a continuación.

Primero, inicialice cada coeficiente [math] \ beta_i [/ ​​math] a cero. Luego, para cada muestra [matemática] x [/ matemática] en su conjunto de datos:

  1. Lea la muestra [matemáticas] x [/ matemáticas].
  2. Haga una predicción con su modelo actual para obtener [math] \ hat {\ pi} (x) = \ frac {1} {1 + \ exp {(- \ beta ^ Tx)}} [/ math].
  3. Observe la verdadera respuesta [matemáticas] \ pi [/ matemáticas].
  4. Actualice los pesos: [math] \ beta_i \ leftarrow \ beta_i + \ eta (\ pi – \ hat {\ pi}) x_i [/ ​​math].

Aquí, [matemáticas] \ eta [/ matemáticas] se denomina tasa de aprendizaje. Puede probar diferentes valores para [matemática] \ eta [/ matemática], pero un punto de partida conservador sería [matemática] \ eta = \ frac {1} {t} [/ matemática] donde [matemática] t [/ matemática] es la cantidad de muestras que has leído hasta ahora. También puede elegir una tasa de aprendizaje constante. Esta parte requiere algo de paciencia. Pruebe diferentes tasas de aprendizaje e inspeccione la evolución de sus coeficientes.

La complejidad de los mínimos cuadrados reponderados de forma iterativa es [matemática] O (nd ^ 2 + d ^ 3) [/ matemática], mientras que la complejidad de SGD es [matemática] O (nd) [/ matemática]. Si n es muy grande, SGD a veces convergerá a una buena estimación de parámetros antes de leer todo el conjunto de datos.

Sería bueno saber cuántos predictores tiene, cuántas filas de datos tiene y si algunos de sus predictores tienen información muy baja en ciertas áreas “predictivas” de la distribución. Pero en términos generales, solo tome una muestra aleatoria de los datos para que pueda ajustarse al modelo deseado. Su primer objetivo debe ser reducir el número de predictores, para que pueda obtener un tamaño de muestra más grande. En la mayoría de las situaciones, creará un modelo con una gran cantidad de datos que es tan bueno como un modelo construido con 100 conciertos.

Otro agradecimiento para el muestreo. Si es emprendedor, podría calcular el tamaño de muestra necesario para asegurarse de que sus estimaciones de muestreo se encuentren dentro de las estimaciones verdaderas (las que tienen los datos completos) con un 95% de confianza (por ejemplo).

Para datos tan grandes, el muestreo podría ser una buena idea. Sin embargo, no se satisfaga con un solo modelo, cree varios con diferentes muestras y vea si predicen de manera similar. Para leer los datos, use los paquetes bigtable / ff en R que le permitirán usar el disco en lugar de RAM,

Editar: también puedes comprar muGLM de Mu Sigma. 🙂

En primer lugar, es importante saber cuántas filas y columnas tiene, encontré en este sitio Modelar un conjunto de datos muy grande (1.8 Millones de filas x 270 Columnas) en R que 1.8 millones de filas x 270 columnas equivalen a un vector de tamaño 81.5 Gb , aquí se explica que puede usar el paquete biglm como se dice en los comentarios anteriores del Dr. Benjamin. Sin embargo, si se enfrenta con la siguiente advertencia, por ejemplo:
[alcanzó getOption (“max.print”) – omitió 5671 filas]]
antes de importar sus datos a R, para aumentar su espacio de trabajo en R, puede usar el siguiente código:
> opciones (max.print = 5.5E8)
> datos <-read.spss ("..")
Pero, es evidente que tiene un gran tamaño de muestra, por lo que en esta condición a veces, por ejemplo, incluso un R2 pequeño (es decir, 0.2) puede ser significativo, o quiero decir que las estimaciones pueden ser solo como parámetros en sí mismos. Entonces, tal vez sea mejor tomar una muestra aleatoria de sus datos, calcular el tamaño de muestra requerido como lo dice el profesor Caffo y también hacer un análisis de validación cruzada para asegurarse de que sus estimaciones sean válidas.

Descargue una versión de prueba de SPSS (Stats o Modeler) utilizando la funcionalidad de integración R. SPSS gestionará las cargas de procesamiento.

Por supuesto, podría hacer la Regresión de registro en cualquier prueba de software.

Como dice Mike, probablemente no sea necesario usar todos los casos para entrenar al modelo.

Si quiere hacerlo de todos modos, aquí hay una descripción de cómo hacer una regresión logística en Hadoop http://www.win-vector.com/blog/2 … y Spark https://spark.apache.org/example

En R probablemente tenga que usar una biblioteca como Revolution R que pueda acceder a grandes marcos de datos que no están completamente en la memoria.

Una estrategia que puede usar es mantener toda la clase minoritaria (generalmente el evento predicho) y una submuestra de la clase mayoritaria (tome una muestra de los no eventos). Por lo tanto, si sus 100 GB están compuestos principalmente por eventos que no son eventos, puede ahorrar mucho en muestras, descartando mucha información redundante.

Algunas otras buenas ideas para ejecutar GLM con grandes conjuntos de datos en R:

Historial rápido 2: GLM, R y grandes conjuntos de datos

Mis opciones preferidas son

1. Spark (Métodos lineales – spark.mllib)

2. H2o (modelo lineal generalizado)

¿Alguien sabe cómo hacerlo usando efectos aleatorios también?

Si quiero usar solo efectos fijos, puedo probar paquetes como speedglm, muy rápido.

Pero, ¿y si quiero agregar efectos aleatorios?

lme4, glmmML, nlme … pueden manejar efectos aleatorios pero son muy lentos y solo funcionan con pequeños conjuntos de datos.

Spark tampoco tiene ninguna opción para efectos aleatorios.