Tulmot / Sklearn-Multilabel

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

cross validation #44

Closed Tulmot closed 6 years ago

Tulmot commented 7 years ago

Para crear los conjuntos de test y entrenamiento usar la validación cruzada

Tulmot commented 7 years ago

En validación cruzada he estado probando esto: imagen

pero me dice que mi clase no vale, me da este error:

TypeError: If no scoring is specified, the estimator passed should have a 'score' method. The estimator <disturbing_neighbors.DisturbingNeighbors object at 0x00000168CF082F98> does not.

alvarag commented 7 years ago

¿Está subido el código que te está dando este problema?

jjrodriguez commented 7 years ago

Se podría hacer un método "score" que llame al del clasificador base (el árbol por defecto), una vez transformado el dataset:

http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier.score

Tulmot commented 7 years ago

Sigo teniendo un error a la hora de usar el score imagen Está subido el código actualizado de la clase y la de prueba.

alvarag commented 7 years ago

Parece que estás intentando acceder a un elemento que no existe (16) porque l amatriz tiene tamaño 11. Revisa bien que todo lo estés llamando bien

Tulmot commented 7 years ago

El problema está en que como el aleatorio de los vecinos molestones lo calculo solo una vez, (pongamos de ejemplo que el conjunto de datos tiene tamaño 100), pues me calcula aleatorios entre esos 100, por ejemplo [15,30,45], como la validación cruzada varían sus divisiones para el tamaño entre conjunto de entrenamiento y test, entonces cuando pase un cojunto con tamaño 40 (los otros 60 para test), va fallar porque no puede acceder a la posición 45, entonces nose si lo tendré que volver a calcular o como

No se si me explicado.

jjrodriguez commented 7 years ago

Los vecinos molestones los tienes que elegir aleatoriamente cada vez que se llame a la función fit.

alvarag commented 7 years ago

Creo que Juanjo lo ha dejado bien claro. Ten en cuenta que cada vez que te llaman a fit, hay un nuevo conjunto de datos con el que entrenar y, por tanto, tienes que volver a hacer todo el proceso:

Tulmot commented 7 years ago

claro pero el problema es que si cuando llamo a la función fit la X que le paso tiene mayor tamaño que la X que le paso al predict, puede ocurrir que los vecinos molestones que me calcule luego estén fuera de rango, es decir, Si tengo un conjunto de 100 datos y lo dividido en 60 para fit y 40 para los test, cuando calculo los vecinos molestones me los va calcular hasta un rango de 60, entonces si me sale un vecino molestón mayor de 40, cuando llame al predict, como usa los mismos vecinos molestones, me va saltar el error de que no puede ser mayor de 40 porque se sale de rango

Las instancias aleatorias se calculan en la función _random_array

alvarag commented 7 years ago

Los vecinos molestones los calculas sobre la X de entrenamiento (es decir la de fit). Esto no tiene que confundirte con las instancias que te pasan para test (X de predict). Los vecinos molestones se calculan en el fit y se utilizarán para el predict: tanto si te piden predecir la clase de una instancia como de 3000. Creo que estás confundiendo el funcionamiento del algoritmo

Tulmot commented 7 years ago

Pero yo los vecinos molestones los calculo según el tamaño de X que recibo, entonces si luego al predict le paso un conjunto mas pequeño va fallar.

Según entiendo los vecinos molestones entonces debería calcularlos de otra manera, no lo puedo hacer sobre el tamaño de X que recibe el fit, ya que como he dicho antes si la X que recibe el fit tiene mas instancias que la X que recibe el predict, no puede funcionar.

alvarag commented 7 years ago

Vamos a ver: tu calculas los vecinos molestones sobre la X que te pasan en el fit. Llamémoslo X_train Cuando te piden predecir te pasan otro conjunto de datos, llamémosle X_test.

En la predicción tienes que calcular la distancia de cada elemento de X_test con los vecinos molestones escogidos de X_train, ¿me explico?

Tulmot commented 7 years ago

Vale, ya después de enterlo correctamente, ya esta arreglado,

voy a poner algo más entendible el código y lo subo.

Tulmot commented 6 years ago
def predict(self, X):
        #predictions=[]
        #for classifiers in self._base_classifiers:
        #    predictions.append(classifiers.predict(X))
        #predictions=np.asarray(predictions)
        #promedio=predictions.sum(axis=0)
        #return promedio

        predictions=[]
        def predict_classifiers(classifiers):
            predictions.append(classifiers.predict(X))
            return predictions
        for classifiers in self._base_classifiers:
            predictions.append(classifiers)
        predictions=list(map(predict_classifiers,classifiers))
        predictions=np.asarray(predictions)
        promedio=predictions.sum(axis=0)
        return promedio

Estaba intentantado hacer el predict funcional, lo que esta comentado funciona correctamente, no entiendo que esta mal de la parte sin comentar

Me da el error:

  File "C:\Users\Tubi\Desktop\eduard\Clase\TFG\disturbing_neighbors.py", line 224, in predict
    predictions=list(map(predict_classifiers,classifiers))

TypeError: 'BaseDisturbingNeighbors' object is not iterable
alvarag commented 6 years ago

¿Para qué utilizas el bucle for?

Necesitas una función que reciba un clasificador (eso lo tienes) y que devuelva la predicción de ese clasificador sobre el conjunto X (esto no lo tienes, estás añadiendo en un array...)

Por otro lado, la sentencia con el list(map... no parece que le esté gustando.

Primero corrige lo que te comento y luego mira a ver si el fallo te lo da en el map o en el list.