IIC2613 / Syllabus

Repositorio oficial Inteligencia Artificial 2020-2
6 stars 1 forks source link

T3 - Actividad 1 | Google colab se cae porque BoW (en el .toarray()) intenta pedir 40.8 GB de RAM #73

Open jmwielandt opened 3 years ago

jmwielandt commented 3 years ago

Hola, no puedo avanzar :c Cuando intento hacer CountVectorizer().fit_transform(corpus).toarray() como sale en el enunciado, se cae en el toarray() porque intenta alocar más de 40 GB de RAM. En mi computador probablemente también se caería y mucho antes así que tampoco es opción intentar correrlo en local.

¿Qué puedo hacer? 😭

PD: pongo todo el código en una línea pero en realidad lo tengo en varias. Es básicamente el mismo código del enunciado de hecho.

Juan-AAS commented 3 years ago

Hola, Ahora estoy viendo este error, te aviso a la brevedad.

Juan-AAS commented 3 years ago

Hola de nuevo. Ya, ahora me acuerdo del error. Exactamente el vocabulario es muy grande, por lo tanto aquí es conveniente hacer una selección de las palabras a utilizar según su frecuencia. Sería bueno preguntarse ¿qué es mejor, utilizar palabras con mayor frecuencia o con menor frecuencia? por eso uno pedía hacer un histograma de las frecuencia de las plabras ya que uno puede determinar si las palabras con menor frecuencia o mayor frecuencia pueden determinar una noticia falsa o verdadera.

Dicho lo anterior, puedes hacer una selección y quitar las palabras con una frecuencia mayor o menor a "N" (según tu criterio) y así reducirás el tamaño del vocabulario y no tendrás problemas de memoria la hacer "toarray()"

Espero te funcione y puedas seguir avanzando :)

furcelay commented 3 years ago

Hola!

Yo también tenía ese problema, me pedía 70GB de RAM si le pasaba todo el set de datos, en un principio lo solucioné pasándole solo una parte del set pero los resultados eran muy variables. Descubrí que se soluciona si evitas convertirlo a array, el método fit_transform retorna una sparse matrix (matriz con muchos ceros) que utiliza mucha menos memoria que un array y puede ser usada de forma equivalente. De todos modos tuve que reducir la dimensión así que también puedes eliminar las palabras poco frecuentes como dice @JAAS1993 .

Arcoirisky commented 3 years ago

Hola! Tengo un problema con eso, si lo dejo como matrix es posible pasar a la siguiente parte PERO al hacer el SVC.fit me dice que no puedo meterle matrices.

Funciona si es que les doy el toarray() pero ni dividiendo el dataTrain en 12 partes tengo un tamaño decente que me permita ejecutar el .toarray() sin que explote colab (y mi computador cuando lo intento hacer local)

Mi problema más grande es que literal intento dividirlo para poder ir transformándolo por partes pero es demasiado grande aún para un doceavo de los datos.

furcelay commented 3 years ago

Creo que tienes razón, de todos modos un feature space con dimensión 100000 creo que estaría super sobre-dimensionado, lo ideal sería reducir la dimensión o bien limitando el número de palabras en CountVectorizer o bien reduciendo la sparse matrix, yo lo hice con TruncatedSVD que está hecho para reducir este tipo de matrices y el resultado sí es un array pero si limitas la dimensión no da problemas de memoria.