Closed Tulmot closed 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.
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é).
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.
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.
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.
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.
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
La gráfica dibujada en Random Oracle no es como debería, el fallo puede estar en el predict_proba