En este post te enseñaremos cómo representar las prestaciones del algoritmo K-NN en train y test para distintos valores de n_neighbors (entre 0 y 15).
Prestaciones del algoritmo K-NN en train y test
#Prestaciones del algoritmo K-NN: primer paso
X_train, X_test, y_train, y_test = train_test_split (X3, y3, test_size = 0.3, shuffle = True, random_state = 0)
#Prestaciones del algoritmo K-NN: segundo paso
neighbors = range (1, 15)
acc_train = []
acc_test = []
for n in neighbors:
knn = KNeighborsClassifier (n_neighbors = n).fit (X_train, y_train)
acc_train.append (knn.score (X_train, y_train))
acc_test.append (knn.score (X_test, y_test))
plt.plot (neighbors, acc_train, 'b', label = 'train')
plt.plot (neighbors, acc_test, 'r', label = 'test')
plt.legend ()
plt.xlabel ('# vecinos')
plt.ylabel ('ACC')
plt.show ()
Para representar las prestaciones del algoritmo K-NN en train y test para los valores entre 1 y 15, debemos hacer un fit sobre el clasificador. Más adelante graficaremos las listas que ha sacado el resultado del algoritmo.
El número de vecinos que escojamos afecta significativamente a las prestaciones del algoritmo K-NN. Este parámetro es un compromiso entre los errores que cometemos (accuracy) y la complejidad del modelo (frontera de separación).
- Cuanto menor es el número de vecinos, más compleja es la frontera de separación y, por tanto, mayor será el sobreajuste. Potencialmente empeorará el accuracy.
- Cuanto mayor es el número de vecinos, menos compleja es la frontera de separación y, por tanto, menor será el sobreajuste. Potencialmente mejorará el accuracy.
Si comparamos modelos, este modelo hecho con el algoritmo de vecinos más cercanos es todo lo contrario a la gráfica que explicamos en otro artículo del blog, en la que teníamos la complejidad de un modelo frente a la precisión. En nuestro modelo actual, como podemos observar, es mucho más complejo trabajar con pocos n_neighbors, situación contraria a lo que pasa en la gráfica.
Observemos los resultados de las prestaciones del algoritmo K-NN en train y test:
Ahora, observemos la gráfica descrita anteriormente:
Como podemos notar, sale prácticamente al revés que la primera gráfica.
Pero ¿qué pasaría si en este ejercicio de prestaciones del algoritmo K-NN tuviéramos, no 15, sino 30 vecinos más cercanos?
Efectivamente, el modelo se desvía y no nos brinda resultados precisos.
Hay que tener en cuenta que cuando tenemos un modelo muy complejo, como es el caso del número de vecinos con un solo vecino, lo que tenemos es un accuracy muy alto en train, porque estamos en overfitting (es decir, nos estamos ajustando absolutamente a los datos de entrenamiento), y un accuracy muy pobre en test, porque la generalización es mala.
A medida que disminuimos la complejidad y hacemos el modelo más simple para las prestaciones del algoritmo K-NN, lo que obtenemos es un accuracy peor en nuestro conjunto de datos de entrenamiento, pero un accuracy mejor en test.
Lo que ocurre cuando tenemos más datos es que, a medida que vamos haciendo el modelo más y más simple, la gráfica en test decae. Aun así, no decae de forma indefinida, ya que llega un punto en el que se acaba estabilizando.
En ningún caso vamos a ver una subida en test a medida que simplificamos el modelo. Así pues, podemos observar que la gráfica mostrada en este artículo sobre las prestaciones del algoritmo K-NN (gráfica 1) es similar a la gráfica de la complejidad del modelo frente al accuracy (gráfica 2), pero invertida.
A tener en cuenta en la representación de las prestaciones del algoritmo K-NN
Cuando estamos entrenando un modelo de machine learning más allá de un análisis exploratorio, es normal que los resultados tarden varias horas en aparecer. No te asustes si tienes que dejar algún algoritmo corriendo por la noche para revisarlo al día siguiente y observar los resultados, ya que no puedes contar con tener todo en unos pocos minutos.
Estos procesos requieren tiempo y paciencia; por tanto, debes conservar la calma si en algún ejercicio que estés haciendo no te aparece nada. Esto no significa necesariamente que hayas hecho algo mal, simplemente puede pasar que, dados los grandes conjuntos de datos que estés manejando, los procesos tarden mucho.
De todos modos, ya sabemos que esta es una de las características de las bases de datos NoSQL: su procesamiento lento respecto a las bases de datos relacionales.
Si quieres seguir aprendiendo, recuerda que puedes avanzar a través de nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva en la que podrás adquirir todos los conocimientos teóricos y prácticos necesarios para incursionar en un mercado laboral lleno de oportunidades. ¡Anímate a transformar tu futuro y solicita más información ya!