Para crear a Amanda era necesario definir e instrumentar la interacción del chatbot y para ello era importante obtener, bajo un modelo, las probabilidades
de pertenecer al Consejo de Estado (CE) de cada diputado.
En la creación del chatbot se utilizó la biblioteca de javascript Chatbot. Para Amanda, como chatbot,
sus interacciones fueron definidas con expresiones regulares. Así, para cada patrón se redactaron un conjunto de posibles respuestas de las cuales
se escogía la respuesta que daría Amanda. Algunas de estas respuestas requerían de información específica para cada diputado, estas se obtuvieron
de una base de datos creada para artículos previos que tocaban el tema de las elecciones. En el caso de las probabilidades en las que se basa la prediccón,
se tomaron de un modelo que se creó explícitamente para el uso de Amanda.
La búsqueda de los datos de los diputados según su nombre se realizó utilizando la biblioteca de javascript Fuse, que
permite hacer búsquedas difusas en un arreglo a partir de cadenas de texto.
La parte esencial de Amanda es su modelo de predicción. La idea primaria fue construir un clasificador supervisado que, basado en los Consejos de Estado
previos, pudiera predecir la probabilidad que tenía cada diputado de pertenecer al Consejo de Estado. Para ello era necesario conocer todos los CE previos,
información que se disponía a partir del artículo Consejo de Estado de Cuba. Así, por cada persona que históricamente
había pertenecido al CE se podían disponer de varios datos que podrían ser utilizados en la construcción de un clasificador.
En total, dispusimos
de 22 características diferentes: el identificador de la persona, si perteneció al CE anterior y a cuántos consejos había pertenecido, el sexo de la persona,
si pertenecía al Buró Político, al Comité Central o al Secretariado del PCC, si era el máximo dirigente de la UJC, CDR, CTC, ANAP o FMC, si era secretario
provincial del PCC y de qué provincia lo era, si era miembro del Consejo de Ministros (CM), si era ministro, si era directivo del CM y qué ministerio tenía a
su cargo, si había estado en la dirección del CE anterior, qué cargo tenía y cuántas veces había integrado direcciones del CE, y, finalmente, si formó parte
de la dirección de la Asamblea Nacional anterior.
Con estas características, y para poder construir el clasificador, fue necesario anotar, por cada Consejo elegido, un conjunto de diputados que no fue electo
al CE. Para esto fue necesario identificar varios diputados de cada legislatura y luego buscar las informaciones para completar, por cada uno, las
22 características que se tenían de cada miembro del CE. Esta fue una tarea ardua y propensa a errores, así que se intentó otra alternativa.
Como en el artículo Consejo de Estado de Cuba se pudo comprobar que había varios elementos que parecían
ser muy relevantes en la conformación de los CE, se tomaron estos elementos como base para definir dos conjuntos diferentes a partir de todas
las personas que han integrado los Consejos. Uno de estos conjuntos tendría a los diputados que más se parecen a los parlamentarios que no resultan
electos al CE y un segundo con los diputados que tienen características que los hicieron miembros más probables. Estos conjuntos
se utilizaron para entrenar el clasificador supervisado, el primero como clase negativa y el segundo como clase positiva.
En el conjunto de miembros más probables de pertenecer al CE se caracterizó por aquellos diputados que han pertenecido 3 veces o más al Consejo de Estado,
los máximos dirigentes de la UJC, CDR, CTC, ANAP y FMC, los ministros de las FAR y el MINREX, todos los que han pertenecido a las direcciones de los
CE así como los Secretarios Provinciales del PCC en La Habana.
Para trabajar con los distintos algoritmos de aprendizaje de máquina se utilizó la biblioteca de clases Sklearn y el lenguaje de programación Python.
Como las características que se tienen de cada miembro del CE son mixtas, donde lo más común es que existan características binarias se utilizó una
representación binaria de los vectores de características. En cada vector, los datos binarios fueron representados como tales. Para los elementos que
representaban un identificador, se contabilizaron todos los posibles indicadores y se creó una lista binaria donde el índice que coincide con el identificador
se representó con uno y el resto con cero. En los casos que la característica representaba un cantidad, se creó una lista binaria cuyo tamaño
corresponde con la cantidad máxima posible y toman valor uno todos los índices de la lista desde el inicio hasta la cantidad que está definida en el vector
de características mientras que el resto, hasta el final, toma valor cero.
Los datos que se utilizaron para entrenar resultaron muy esparcidos y, además, no se disponía de un buen conjunto para establecer la calidad del clasificador.
Por ello se decidió utilizar un ensemble de clasificadores, en este caso uno basado en Votos (VotingClassifier). Los clasificadores que integraron el ensemble fueron:
un KNN que utilizó una métrica de distancia binaria (jaccard), uno basado en Naive Bayes (GaussianNB) , un Árbol de Decisión, otro ensemble (RandomForest),
una variante de SVM (NuSVC) y una Regresión Logística. Estos dos últimos fueron definidos a partir de una red neuronal tipo BernoulliRBM que logra una
mejor discriminación de las entradas binarias. El VotingClassifier fue caracterizado como de votación suave (voting='soft') pues de esta manera
se puede obtener la probabilidad de clasificación para cada clase de cada elemento que se clasifique.
Con este clasificador, se tiene en cuenta para la clasificación la 'opinión' de seis clasificadores diferentes. Este
fue entrenado con la totalidad del conjunto de entrenamiento: los miembros de todos los CE cuya clase estará dada por la pertenencia o no al conjunto con más
posibilidades de pertenecer al CE dada la historia. Luego de entrenado, ante la inexistencia de un conjunto de prueba, se clasificó nuevamente el total del conjunto y se obtuvo un
porciento de clasificación de 66.54%. Igualmente, se clasificaron todos los CE desde la I hasta la VIII legislatura y los porcientos de clasificación
fueron 66.66%, 61.76%, 68.57%, 70.58%, 76.47%, 76.47%, 59.23% y 55.26% respectivamente. En todos los casos el resultado fue superior al 55% que es un
valor de veracidad interesante si se tiene en cuenta que la probabilidad de, al azar, adivinar un Consejo de Estado es casi cero.
Siguiendo esta misma metodología, se creó un clasificador ensemble basado en votos (VotingClassifier), integrado por clasificadores del mismo tipo que
el anterior, para poder determinar la probabilidad de que un miembro del Consejo de Estado fuese parte de la dirección de este. Aquí la obtención y definición
del conjunto de entrenamiento era más clara. Todos los miembros de un CE que hubieran formado parte de la dirección del mismo integrarían la clase
positiva y el resto la negativa. En este caso, como en el anterior clasificador, si una persona pertenecía a varios CE tendría en el conjunto de
entrenamiento tantas instancias como pertenencias a los Consejos hubiese tenido. En cada instancia estarían reflejadas las características relativas
a la persona acorde la momento de la elección al CE en cuestión.
Definidos los dos clasificadores, el que asigna las probabilidades de pertenecer al Consejo de Estado y el que determina las de pertenecer a la dirección del mismo,
se pudo clasificar a todos los diputados. Para ello, en base a los datos obtenidos para el artículo Explora la candidatura al parlamento,
se obtuvieron los vectores de características de todos los diputados. Por supuesto, las mismas 22 características que se definieron para los conjuntos de
entrenamiento. Igualmente, siguiendo la misma metodología, estos vectores fueron binarizados.
Finalmente, los vectores binarizados relativos a los diputados fueron clasificados y con los valores obtenidos, junto a la información que de los diputados
se tendía, se construyó un documento en formato JSON que es el que se utiliza como base de conocimientos para Amanda.