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()
## 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()
[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()