Using custom algorithms

¿Qué podemos hacer cuando queremos incluir un nuevo algoritmo a AutoGOAL y que este se integre de forma natural con todos los otros para poder formar parte de posibles pipelines.

Primero tenemos que importar la clase de la que debemos heredar para que se reaproveche todo el sistema de conectar pipelines de AutoGOAL

from autogoal.kb import AlgorithmBase

from autogoal.grammar import BooleanValue, DiscreteValue
from autogoal.kb import *

Tenemos que crear una clase que representa a nuestro nuevo algoritmo

Supongamos que queremos un Algoritmo que puede conviertir o no a minúsculas y eliminar las palabras muy cortas. Al definirlas de esta forma le estamos pidiendo a AutoGOAL que pruebe a hacerlas o no en diferentes pipelines, teniendo e cuenta además distintos valores.

class NewAlgorithm(AlgorithmBase):

En el constructor tenemos que poner los hiperparámtros que son optimizables

    def __init__(
        self,

min_length tomará valores entre cero y cinco de forma automática para diferentes pipelines. Este parámetro está permitiendo buscar distintos tamaños de palabra y probar cual de ellos será mejor

        min_length: DiscreteValue(min=0, max=5),

lower es un parámetro que en algunos casos será True y en otros False. Podemos utilizarlo para llevar o no a minúsculas el texto.

        lower: BooleanValue(),
    ):
        self.min_length = min_length
        self.lower = lower

El método run es el método que tienen en común todo los algoritmos incluidos en AutoGOAL es el que permite a la biblioteca ejecutar el método. Este método define tanto la entrada como la salida de tu algoritmo, utilizando anotaciones de los tipo semánticos de AutoGOAL. Además es quien contiene el funcionamiento real de nuestro algoritmo, es el código que se ejecutará.

Digamos que recibe una oración (Sentence) y devuelve una lista de palabras (Seq[Word])

    def run(self, input: Sentence) -> Seq[Word]:

Como podemos ver la implementación del método se realiza bastante independiente de la biblioteca

        if self.lower:
            input = input.lower()

        result = []

        for i in input.split():
            if len(i) > self.min_length:
                result.append(i)

        return result

Una vez que tenemos listo nuestro algoritmo solo nos queda indicarle a la clase AutoML que lo utilice en la búsqueda

Estos son algunos import que nos hacen falta más adelante

from autogoal.ml import AutoML
from autogoal.contrib import find_classes

Probemos con HAHA

from autogoal.datasets import haha

Cargando los datos

X_train, y_train, X_test, y_test = haha.load()

Creando la instancia de AutoML con nuestra clase

automl = AutoML(
    input=(Seq[Sentence], Supervised[VectorCategorical]),  # **tipos de entrada**
    output=VectorCategorical,  # **tipo de salida**

Agregando nuestra clase y todo el resto de algortimos de AutoGOAL

    registry=[NewAlgorithm] + find_classes(),
)

Ahora sencillamente tenemos que ejecutar AutoML y ya nuestro algoritmo aparecerá en algunos pipelines. Debemos tener en cuenta que esto no garantiza qeu aparezca en el mejor pipeline encontrado, sino que se conectará con el resto de los algoritmo como si fuera nativo de AutoGOAL.

automl.fit(X_train, y_train)

score = automl.score(X_test, y_test)
print(score)