Vecinos próximos para regresión — 7:10 min#

  • 7:10 min | Ultima modificación: Abril 14, 2021 | YouTube

La técnica de vecinos próximos es conocida por su uso para la construcción de clasificadores. En esta lección se presenta esta técnica adaptada al problema de regresión no lineal, la cual se encuentra implementada en scikit-learn.

Este ejemplo está basado en https://scikit-learn.org/stable/auto_examples/neighbors/plot_regression.html#sphx-glr-auto-examples-neighbors-plot-regression-py

Descripción del problema#

Se desea construir un modelo de regresión para el siguiente conjunto artificial de datos, los cuales exhiben un comportamiento no lineal.

[1]:
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(12345)
X = np.sort(5 * np.random.rand(40, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 1 * (0.5 - np.random.rand(8))

plt.figure(figsize=(8, 8))
plt.scatter(X, y)
plt.gca().spines["left"].set_color("gray")
plt.gca().spines["bottom"].set_color("gray")
plt.gca().spines["top"].set_visible(False)
plt.gca().spines["right"].set_visible(False)
plt.show()
../_images/32_vecinos_mas_cercanos_04_KNeighborsRegressor_5_0.png

## Solución

En este caso, el método pronóstica mediante la interpolación de los valores y de los puntos que conforman el vecindario. El parámetro weight toma los siguientes valores:

  • uniform: todos los pesos en el vecindario tienen el mismo peso.

  • distance: cada punto tiene un peso inversamente proporcional con la distancia al punto calculado.

[2]:
from sklearn.neighbors import KNeighborsRegressor

T = np.linspace(0, 5, 500)[:, np.newaxis]

knn_uniform = KNeighborsRegressor(n_neighbors=5, weights="uniform")

y_uniform = knn_uniform.fit(X, y).predict(T)

knn_distance = KNeighborsRegressor(n_neighbors=5, weights="distance")

y_distance = knn_distance.fit(X, y).predict(T)

plt.figure(figsize=(8, 8))
plt.scatter(X, y, label="real")
plt.plot(T, y_uniform, c="g", label="uniform")
plt.plot(T, y_distance, c="r", label="distance")
plt.gca().spines["left"].set_color("gray")
plt.gca().spines["bottom"].set_color("gray")
plt.gca().spines["top"].set_visible(False)
plt.gca().spines["right"].set_visible(False)
plt.legend()
plt.show()
../_images/32_vecinos_mas_cercanos_04_KNeighborsRegressor_8_0.png
[3]:
from sklearn.neighbors import RadiusNeighborsRegressor

T = np.linspace(0, 5, 500)[:, np.newaxis]

knn_uniform = RadiusNeighborsRegressor(radius=1, weights="uniform")

y_uniform = knn_uniform.fit(X, y).predict(T)

knn_distance = RadiusNeighborsRegressor(radius=1, weights="distance")

y_distance = knn_distance.fit(X, y).predict(T)

plt.figure(figsize=(8, 8))
plt.scatter(X, y, label="real")
plt.plot(T, y_uniform, c="g", label="uniform")
plt.plot(T, y_distance, c="r", label="distance")
plt.gca().spines["left"].set_color("gray")
plt.gca().spines["bottom"].set_color("gray")
plt.gca().spines["top"].set_visible(False)
plt.gca().spines["right"].set_visible(False)
plt.legend()
plt.show()
../_images/32_vecinos_mas_cercanos_04_KNeighborsRegressor_9_0.png