Preprocesamiento

Los datos se preprocesan antes de la clasificación, agregando las distintas columnas usando funciones que permiten entregar información sobre la historia de actividad de cada cuenta. Esto se encuentra detallado en la pagina de clasificación. Las palabras se convierten a valores numéricos usando el método de bolsas de palabras. Es decir, cada cuenta tiene asociada una frecuencia de n-gramas encontrados dentro de sus tweets, y se usan estas frecuencias para realizar los ajustes. Debido a la diferencia entre este método y usar columnas numéricas, las clasificaciones se debieron realizar por separado. Finalmente, se normalizan los atributos numéricos que se usan para la clasificación.

Resultados hito 2

Decision Trees

Los mejores arboles encontrados para la clasificación numérica y de texto se encuentran a continuación, respectivamente:

Clasificación numérica

In [10]:
from IPython.display import Image
Image(filename='img-3class/decision_num_tree.png')
Out[10]:

Clasificación de texto

In [11]:
Image(filename='img-3class/decision_text.png')
Out[11]:

Superficies de decisión

Como la importancia de la región de origen no resultó ser muy importante para los clasificadores, se analizan las superficies de decisión con la region fija en Estados Unidos. Las dimensiones no mostradas se fijan en su promedio.

Election activity distance / Maximum following

Entre los mejores clasificadores numéricos, se observa en las superficies de clasificación que para cuentas que siguen a pocas cuentas, se requiere una mayor actividad cerca del dia de elección para poder tener una mayor popularidad. Las cuentas que siguen a una gran cantidad de personas son etiquetadas con popularidad muy alta, pero si su actividad cerca de la eleccion es muy alta, pasa a tener menor popularidad.

Usando random forest

In [12]:
Image(filename="img-3class/random_fortest_num_surf-Maximum following-Election Activity Distance.png")
Out[12]:

Usando k-neighbors

In [13]:
Image(filename="img-3class/kneigh_num_surf-Maximum following-Election Activity Distance.png")
Out[13]:

Maximum updates / Maximum followers

Ambos clasificadores etiquetan a las cuentas con poca actividad pero que siguen a una gran cantidad de cuentas en popularidad muy alta, y que las cuentas que siguen a pocas personas tienen baja popularidad.

El clasificador de k-neighbors muestra que mientras mayor es la actividad de la cuenta, más dificil se hace que la cuenta pase al percentil 50 de popularidad aumentando su cantidad de seguidos.

Usando random forest

In [14]:
Image(filename="img-3class/random_fortest_num_surf-Maximum updates-Maximum following.png")
Out[14]:

Usando k-neighbors

In [15]:
Image(filename="img-3class/kneigh_num_surf-Maximum updates-Maximum following.png")
Out[15]:

Importancia de parámetros

El clasificador de random forest ofrece la posibilidad de entregar la "importancia" de los parametros, que es determinada por como estas influencian los arboles creados. Para la clasificación numérica, entrega 20% a la actividad de la cuenta, 31% a la cantidad de cuentas que sigue, 6% a su región y 42% a su actividad cerca del dia de la elección. Para la clasificación de texto, se puede visualizar en una nube de palabras.

In [16]:
Image(filename="img-3class/word_cloud_1_3.png")
Out[16]:

Hito 3

Para el hito 3, se realizaron varios intentos para mejorar los resultados de los clasificadores.

Cambiar atributos

Al eliminar el atributo menos importante para la clasificación, la id del país, y al usar la tasa de crecimiento de la actividad de la cuenta y los seguidos por esta cuenta, se logra una pequeña mejoría en los resultados de los clasificadores. En específico, el clasificador de k-neighbohrs numérico es el mejor, con la siguiente matriz de confusion:

In [1]:
from IPython.display import Image
Image(filename='img_power/confusion_kneigh.png')
Out[1]:

Las superficies de decisión del clasificador muestran un punto donde teniendo cierta actividad cerca del dia de la elección y siguiendo una cantidad promedio de personas se puede lograr una popularidad alta:

In [2]:
Image(filename='img_power/kneigh_num_surf-slope following-Election Activity Score.png')
Out[2]:

Voting classifier

Se intenta implementar un voting classifier que combine los resultados de los 4 clasificadores con mejores resultados, que elige la clase de un objeto dado en base a sus decisiones. Sin embargo, no se logra ninguna mejoría en el desempeño de los clasificadores, y no permite extraer más información que los resultados de la clasificación.

Reducción de dimensionalidad

Hasta ahora, estamos dejando todo el texto de los tweets fuera de la clasificación, que previamente habiamos separado debido a que no era posible combinar ambos tipos de datos en su estado actual. Para este hito, se hace reducción de dimensionalidad para usar toda la información.

Selección de atributos

Como primer intento, se reducen las dimensones de texto a 100 seleccionando los 100 atributos en base a tests estadísticos sobre estas variables, por ejemplo, eligiendo las que tengan mayor varianza. Estos 100 atributos se combinan con los atributos numéricos, y se hace una clasificación usando toda la informacion.

El clasificador con mejores estadísticas es el de random forest, con la siguiente matriz de confusión:

In [3]:
Image(filename='img_power/confusion_random_forest.png')
Out[3]:

Se observa una mejora substancial para la clase de popularidad media, y una mejora en la clasificación de la popularidad alta. Además, las importancias de las 100 palabras elegidas se aprecian en la siguiente word cloud

In [4]:
Image(filename='img_power/word_cloud_1_3.png')
Out[4]:

Es importante destacar que la importancia de la palabra via nos dice que si una cuenta incluye links o fuentes frecuentemente es importante a la hora de elegir su popularidad.

Proyección de atributos

Luego, se probó realizar una proyección de los atributos usando truncanted SVD. La idea del algoritmo es descomponer la matriz de atributos en una forma que permita entregar información entre las relaciones entre los atributos, y se eliminan las relaciones menos fuertes. Al probar un distinto número de dimensiones, los mejores resultados se obtienen reduciendo el bag of words a 100 dimensiones. Al unirlo con los atributos numéricos, el clasificador random forest obtiene las mejores estadísticas, con la siguiente matriz de confusión:

In [5]:
Image(filename='img_power/confusion.png')
Out[5]:

Los resultados son muy buenos para las clases medias y bajas, y se observa una pequeña mejora en la clasificación de la clase alta, mucho mejor que lo que se obtuvo en el hito 2. Aún así, es relativamente baja pues esta es la clase de mayor interés.

Ya que los 100 atributos elegidos no corresponden a palabras o frases directamente, se pierde la información sobre la importancia de cada palabra.

Reducción a dos dimensiones

Usando el algoritmo t-SNE, se reducen las 103 dimensiones previamente definidas a 2. Este algoritmo hace la proyección a una dimensión mucho más baja, manteniendo la mayor cantidad de información sobre cada punto. En el gráfico a continuación se observan estas dos dimensiones.

In [6]:
Image(filename='img_power/2d.png')
Out[6]:

La clasificación con estos datos no da buenos resultados, pero parece ser un buens et de datos en el que realizar clustering.

Recursos

La gran cantidad de los recursos que se usaron en esta parte del protyecto vienen de la documentacion de sklearn: https://scikit-learn.org/stable/documentation.html El código creado es en mayor parte propio, con las ideas generales encontradas en paginas como https://stackoverflow.com/, y la base del grafico de superficies de decision se encontró en https://chrisalbon.com/machine_learning/trees_and_forests/feature_selection_using_random_forest/, editandolo para admitir graficar más de dos atributos.