En Verano de 2018 estuve haciendo una investigación sobre "Comparativa de costo
tiempo - espacio de 6 implementaciones de algoritmos en Python, de machine
learning para análisis de sentimientos" que básicamente es una comparación de 6 de algoritmos usados para
realizar estudios de mercado, esto es para saber cuáles son más convenientes de implementar.
De acuerdo con una investigación conducida por el Social
Media Examiner en 2015, "El
96% de los propietarios / publicistas de pequeñas empresas usan el marketing en
redes sociales, y el 92% de ellos está de acuerdo o muy de acuerdo con la
frase: 'El marketing en redes sociales es importante para mi negocio'".
El
análisis del sentimiento puede ser muy útil porque ayuda a las empresas a
destacar entre la multitud de competidores para llamar la atención de los
clientes. Es muy útil en los siguientes aspectos: optimiza la calidad del
producto conociendo la opinión de los consumidores, permite optimizar las
estrategias de las campañas de publicidad además de medir su efectividad y, por
si fuera poco, brinda información útil para la toma de decisiones durante una
crisis y así poder manejarla.
Como el Big Data se encuentra en el auge, para realizar éstos estudios de mercado se utilizan Bases de Datos muy, muy grandes por lo que cada algoritmo tiene un consumo diferente dependiendo de la cantidad de información que procesa.
El análisis de sentimientos en pocas palabras es poder distinguir si una reseña es buena o mala para así poder conocer la reputación de un producto, una película, etc.
Utilizando un repositorio público de datos, el cual
consiste de 10,000 reseñas de películas clasificadas como buenas o malas, se
extraen los adverbios de cada reseña y se toman como referencia los 5000 más
usados; luego se crea un set de datos analizando individualmente cada reseña y
extrayendo solo las palabras más usadas de ésta y poniéndole su clasificación
(positivo o negativo). Una vez concluido todo este proceso se guarda dicho set
de datos como un objeto binario que se puede reutilizar en todas las pruebas,
evitando así perder tiempo en volver a tratar las reseñas para cada
implementación y asegurándonos que se utilizan exactamente los mismos datos en
el mismo orden.
Después se entrena un modelo computacional implementando 6
algoritmos (Naive Bayes, Multinomial
Naive Bayes, Bernoulli Naive Bayes, Logistic Regression, Stochastic Gradient
Descent y Linear Support Vector
Classification) utilizando 1,000, 3,000, 7,000, y 10,000 registros de los
datos preprocesados, y se mide la memoria y el tiempo que consumió cada
implementación. Se toma el 90% de los datos de la muestra para entrenar el
modelo y el 10% para medir la confianza.
Para sacar el tiempo en segundos, se utiliza la librería
timeit, específicamente la función “timeit.time”; se ejecuta 10 veces cada
algoritmo y se saca un promedio. Se deshabilita el garbage collector, porque
también consume tiempo, y se mide el tiempo de CPU, no el tiempo natural.
print(mean(timeit.repeat(lambda: NaiveBayes(), number=1, repeat = 10)))
Aquí podemos ver cómo colocar un medidor de tiempo a la función "NaiveBayes()", lo que hace es repetir 10 veces esa función midiendo el tiempo que tardó y se promedian esos resultados para dar una respuesta lo más acertada posible.
Para
sacar la memoria en MB se utiliza la librería “memory_profiler” al momento de
llamar el script desde la terminal y se coloca la cabecera “@profile” a cada
función de la cual medimos la memoria, se corren 5 veces cada algoritmo por
separado y luego se promedia el resultado de la medición, esto es para evitar
que se quede en la memoria algún residuo del algoritmo anterior.
@profile
def BernoulliNaiveBayes(training_set):
BernoulliNB_classifier = SklearnClassifier(BernoulliNB())
BernoulliNB_classifier.train(training_set)
return BernoulliNB_classifier
Aquí podemos ver cómo medí la función de entrenamiento del clasificador "BernoulliNB()"
#!/bin/bash
script -c "python3 -m memory_profiler ./BernoulliNB.py &&
python3 -m memory_profiler ./BernoulliNB.py " pruebaMemoria.txt
Para sacar el resultado final, se imprimen los resultados del tiempo y se guardan en el archivo "pruebaMemoria.txt"; como ejemplo solo puse 2 resultados, pero en las pruebas originales si hice las 5 mediciones y lo promedié con la calculadora.
Para sacar la
confianza en porcentaje, se entrena el modelo una sola vez y se compara con el
10% de la muestra de datos.
Muestra
|
1,000
|
3,000
|
||||
Tiempo
|
Memoria
|
Confianza
|
Tiempo
|
Memoria
|
Confianza
|
|
Naive Bayes
|
7.7954
|
10.336 MiB
|
61.0
|
23.8049
|
10.348 MiB
|
64.6666
|
Multinomial NB
|
3.2346
|
1.617 MiB
|
61.0
|
9.3668
|
1.781 MiB
|
65.0
|
Bernoulli NB
|
3.2362
|
1.051 MiB
|
57.9999
|
9.3900
|
1.484 MiB
|
64.3333
|
Logistic Regression
|
3.2318
|
1.762 MiB
|
60.0
|
9.4182
|
1.430 MiB
|
67.0
|
SGD
|
3.3007
|
1.699 MiB
|
65.0
|
9.5515
|
1.066 MiB
|
61.0
|
Linear SVC
|
3.2260
|
1.051 MiB
|
65.0
|
9.3545
|
1.066 MiB
|
63.0
|
Muestra
|
7,000
|
10,000
|
||||
Tiempo
|
Memoria
|
Confianza
|
Tiempo
|
Memoria
|
Confianza
|
|
Naive Bayes
|
55.6481
|
10.387 MiB
|
71.2857
|
80.5001
|
10.375 MiB
|
71.3999
|
Multinomial
NB
|
21.5987
|
1.824 MiB
|
71.2857
|
33.4
|
2.242 MiB
|
71.8
|
Bernoulli NB
|
21.6255
|
1.816 MiB
|
71.7142
|
33.3727
|
2.617 MiB
|
72.1
|
Logistic Regression
|
21.5813
|
2.555 MiB
|
68.7142
|
33.380
|
3.641 MiB
|
71.1
|
SGD
|
21.8636
|
1.805 MiB
|
67.1428
|
33.8191
|
2.121 MiB
|
70.0
|
Linear SVC
|
21.4938
|
2.129 MiB
|
68.8571
|
33.3549
|
3.094 MiB
|
69.1999
|