Closed Tulmot closed 6 years ago
En validación cruzada he estado probando esto:
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.
¿Está subido el código que te está dando este problema?
Se podría hacer un método "score" que llame al del clasificador base (el árbol por defecto), una vez transformado el dataset:
Sigo teniendo un error a la hora de usar el score Está subido el código actualizado de la clase y la de prueba.
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
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.
Los vecinos molestones los tienes que elegir aleatoriamente cada vez que se llame a la función fit.
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:
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
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
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.
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?
Vale, ya después de enterlo correctamente, ya esta arreglado,
voy a poner algo más entendible el código y lo subo.
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
¿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.
Para crear los conjuntos de test y entrenamiento usar la validación cruzada