K ближайших соседей - это простой алгоритм, который хранит все доступные случаи и прогнозирует числовую цель на основе меры сходства (например, функций расстояния). KNN использовался в статистической оценке и распознавании образов уже в начале 1970-х годов как непараметрический метод. Алгоритм Простая реализация регрессии KNN заключается в вычислении среднего численного целевого значения K ближайших соседей. Другой подход использует обратное средневзвешенное расстояние K ближайших соседей. Регрессия KNN использует те же функции расстояния, что и классификация KNN.
Приведенные выше три меры расстояния действительны только для непрерывных переменных. В случае категориальных переменных вы должны использовать расстояние Хэмминга, которое является мерой количества случаев, когда соответствующие символы различаются в двух строках одинаковой длины.
Прогноз с использованием одного соседа - это просто целевое значение ближайшего соседа.
Давайте перейдем к практическим, в этой статье я использую набор данных из mglearn, первый шаг, если у вас нет пакета в вашей записной книжке, установите его в командной строке cmd / anaconda ..
pip install mglearn
После этого вы можете построить регрессию k-соседей с n_neighbors = 1.
import mglearn import matplotlib.pyplot as plt mglearn.plots.plot_knn_regression(n_neighbors=1)
Опять же, эта регрессия k-соседей просто использует 1 n_neighbors, вы можете использовать более одного ближайшего соседа для регрессии, а прогноз - это среднее или среднее значение соответствующих соседей. Покажи нам…
mglearn.plots.plot_knn_regression(n_neighbors=3)
Теперь мы можем сделать прогноз на тестовых данных, используя knn regresson с n_neightbors = 3
from sklearn.neighbors import KNeighborsRegressor X, y = mglearn.datasets.make_wave(n_samples=40) # split the wave dataset into a training and a test set X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # instantiate the model and set the number of neighbors to consider to 3 reg = KNeighborsRegressor(n_neighbors=3) # fit the model using the training data and training targets reg.fit(X_train, y_train)
Если вы сделали это выше, вы можете использовать свою модель на тестовых данных.
print(reg.score(reg.score(X_test, y_test)))
из: 0.83
АНАЛИЗ РЕГРЕССОР КОЛЕНЕЙ
Мы можем проанализировать, как на точность влияют n_neighbors: мы можем использовать различное значение 3 n_neighbors и объяснить, где хорошее значение n_neighbors для модели.
fig, axes = plt.subplots(1, 3, figsize=(15, 4)) # create 1,000 data points, evenly spaced between -3 and 3 line = np.linspace(-3, 3, 1000).reshape(-1, 1) for n_neighbors, ax in zip([1, 3, 9], axes): # make predictions using 1, 3, or 9 neighbors reg = KNeighborsRegressor(n_neighbors=n_neighbors) reg.fit(X_train, y_train) ax.plot(line, reg.predict(line)) ax.plot(X_train, y_train, '^', c=mglearn.cm2(0), markersize=8) ax.plot(X_test, y_test, 'v', c=mglearn.cm2(1), markersize=8) ax.set_title("{} neighbor(s)\n train score: {:.2f} test score: {:.2f}".format(n_neighbors, reg.score(X_train, y_train),reg.score(X_test, y_test))) ax.set_xlabel("Feature") ax.set_ylabel("Target") axes[0].legend(["Model predictions", "Training data/target","Test data/target"], loc="best")
Как видно из графика, при использовании только одного соседа каждая точка в обучающем наборе имеет очевидное влияние на прогнозы, и прогнозируемые значения проходят через все точки данных. Это приводит к очень неустойчивому прогнозу. Учет большего количества соседей приводит к более плавным прогнозам, но они также не соответствуют обучающим данным.
Ссылка: Андреас Мюллер и Сара Гвидо. 2017. Введение в машинное обучение с помощью pyhton