Estoy tratando de implementar el uso de KNearestNeighbours en el conjunto de datos de ejemplo MNIST.

Cuando trato de usar cross_val_predict, el script continúa ejecutándose sin importar cuánto tiempo lo deje.

¿Hay algo que me falta / estoy haciendo mal?

Cualquier comentario es apreciado.

from sklearn.datasets import fetch_openml
import numpy as np
mnist = fetch_openml('mnist_784', version=1) #Imports the dataset into the notebook

X, y = mnist["data"], mnist["target"]

y=y.astype(np.uint8)
X=X.astype(np.uint8)#For machine learning models to understand the output must be casted to an interger not a string.

X.shape, y.shape

y=y.astype(np.uint8) #For machine learning models to understand the output must be casted to an interger not a string.
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] #Separate the data into training and testing sets

from sklearn.neighbors import KNeighborsClassifier

knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_train)

from sklearn.model_selection import cross_val_predict
from sklearn.metrics import f1_score

y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_train, cv=3)

f1_score(y_train, y_train_knn_pred, average="macro")
0
Alaike3 24 jun. 2020 a las 14:40

2 respuestas

Creo que la confusión proviene del punto en que la llamada de ajuste del algoritmo KNN es mucho más rápida que la predicción. De otra publicación SO:

¿Por qué cross_val_predict es mucho más lento que apto para KNeighboursClassifier?

KNN también se llama algoritmo perezoso porque durante el ajuste no hace nada más que guardar los datos de entrada, específicamente no hay aprendizaje en absoluto.

Durante la predicción, el cálculo de la distancia real ocurre para cada punto de datos de prueba. Por lo tanto, podría entender que cuando usa cross_val_predict, KNN tiene que predecir los puntos de datos de validación, ¡lo que aumenta el tiempo de cálculo!

Por lo tanto, se necesita mucha potencia de cálculo cuando observa el tamaño de su entrada. datos. Usar múltiples cpus o minimizar la dimensión podría ser útil.

Si desea utilizar múltiples núcleos de CPU, puede pasar el argumento "n_jobs" a cross_val_predict y a KNeighborsClassifier para establecer la cantidad de núcleos que se utilizarán. Configúrelo en -1 para usar todos los núcleos disponibles

1
Kev1n91 24 jun. 2020 a las 11:51

Usa la n_jobs=-1

El número de CPU a usar para hacer el cálculo. Ninguno significa 1 a menos que se encuentre en un contexto joblib.parallel_backend. -1 significa usar todos los procesadores

from sklearn.datasets import fetch_openml
import numpy as np
mnist = fetch_openml('mnist_784', version=1) #Imports the dataset into the notebook

X, y = mnist["data"], mnist["target"]
y=y.astype(np.uint8)
X=X.astype(np.uint8)#For machine learning models to understand the output must be casted to an interger not a string.


y=y.astype(np.uint8) #For machine learning models to understand the output must be casted to an interger not a string.
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] #Separate the data into training and testing sets

from sklearn.neighbors import KNeighborsClassifier

knn_clf = KNeighborsClassifier(n_jobs=-1) # HERE
knn_clf.fit(X_train, y_train) # this took seconds on my macbook pro

from sklearn.model_selection import cross_val_predict
from sklearn.metrics import f1_score

y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_train, cv=3, n_jobs=-1) # AND HERE

f1_score(y_train, y_train_knn_pred, average="macro")
1
seralouk 24 jun. 2020 a las 11:43