Estoy entrenando un clasificador KNN usando KNeighborsClassifier de scikit-learn con validación cruzada:
k=1 param_space = {'n_neighbors': [k]} model = KNeighborsClassifier(n_neighbors=k, metric='euclidean') search = GridSearchCV(model, param_space, cv=cv, verbose=10, n_jobs=8) search.fit(X_df, y_df) preds = search.best_estimator_.predict(X_df) cuando k=1 y con cualquier valor cv (digamos cv=4 ), obtengo una puntuación perfecta
from sklearn.metrics import confusion_matrix tn, fp, fn, tp = confusion_matrix(y_df, preds).ravel() f1 = tp / (tp + 0.5 * (fp + fn)) # f1 is perfect 1 Es importante decir que utilizo este método en varios conjuntos de datos, y cada vez que k=1 , la puntuación es un 1 perfecto. Intenté hacerlo con datos aleatorios y aún obtuve f1=1 .
¿Hay algún error conocido con KNeighborsClassifier cuando k=1 ? ¿Quizás me estoy perdiendo algo más? Gracias por adelantado.
Tus predicciones provienen de best_estimator_ , que es una copia del estimador con los hiperparámetros óptimos (de acuerdo con las puntuaciones de validación cruzada) ajustados a todo el conjunto de entrenamiento . Entonces, la matriz de confusión que genera es realmente un puntaje de entrenamiento, y para los vecinos 1 eso es trivialmente perfecto (el vecino más cercano de un punto es él mismo).