Tulmot / Sklearn-Multilabel

Ensembles de clasificadores Multi-Label en Scikit-Learn
2 stars 0 forks source link

Gráfica Ramdon Oracle #105

Closed Tulmot closed 6 years ago

Tulmot commented 6 years ago

La gráfica dibujada en Random Oracle no es como debería, el fallo puede estar en el predict_proba

Tulmot commented 6 years ago

Para comprobar a ver si lo hace bien lo que hecho ha sido lo que me ha recomendado Alvar, he creado un pequeño conjunto de 20 datos, y he pintado con amarillo los dos oraculos seleccionados. imagen

La división entiendo que la hace mal, pero nose de que manera podría comprobar donde esta el fallo. Acabo de subir el notebook de prueba donde están los otros notebook por si quereis mirar alguna cosa (Luego lo borraré).

alvarag commented 6 years ago

Solo con esa gráfica no se puede saber qué es lo que está ocurriendo. ¿Has hecho los pasos que te dije?

Es todo cuestión de ir viendo paso a paso lo que hace tu algoritmo y si se corresponde con lo que debería.

Lo difícil no suele ser implementar algoritmos, sino comprobar y validar que funcionan como se espera.

alvarag commented 6 years ago

Por lo poco que he visto, si es que he entendido bien tu código _muy_pocodocumentado el problema lo tienes en el fit (o al menos uno de ellos).

def train(nearest_oracles):
            """Entrenamos cada uno de los oraculos """
            oracle_near = np.asarray(nearest_oracles).astype(bool)
            """Si no es multilabel"""
            if not is_multilabel(y):
                self._multilabel = False
                return self.base_estimator.fit(X, y)
            else:
                self._multilabel = True
                Xp = X[oracle_near, :]
                yp = y[oracle_near, :]
                return self.base_estimator.fit(Xp, yp)

Estas devolviendo siempre el mismo clasificador entrenado con distinto conjunto de datos, así que solo tienes en verdad un clasificador. Tienes que tener tantos clasificadores como "oráculos" (para que me entiendas). Pensé que estaba claro.

Tulmot commented 6 years ago

Pero entonces lo que no entiendo yo calculo los oráculos más cercanos, entonces pensaba que al llamar al fit yo ya le paso en ese conjunto los mas cercanos a cada uno de los oráculos, entonces por lo que dices debería tener dos matrices cada una de ellas tendrá un oráculo y luego los demás datos los voy introduciendo en la matriz que contiene el oráculo más cercano a ese dato.

No se si me explico.

Porque sino si tengo la matriz de los oráculos más cercanos (como lo tengo ahora) por mucho que llame a los clasificadores que sean, si siempre le paso los mismos datos me devolverán lo mismo.

Es decir Xp e yp debería calcularlo de otra manera supongo, por eso lo que he dicho al principio.

alvarag commented 6 years ago

Imagina que tienes dos "oráculos" más cercanos, esto implica que:

Todo eso de arriba no tengo claro que lo estés haciendo bien, tal vez si.

Pero lo que me preocupa es que el método train no esta funcionando como tu esperas.

self.base_estimator.fit(Xp, yp)

Esa línea está devolviendo siempre el mismo clasificador, lo que pasa es que le estás entrenando con cosas distintas: pero siempre es el mismo objeto. Tu lo que quieres es tener dos (o los que sean) objetos distintos de la clase base_estimator y entrenarlos.

alvarag commented 6 years ago

En HomogeneusEnsemble estás ya haciendo copia de clasificadores base, así que con la función que utilizas allí debería serte fácil hacerlo