Python sklearn:为什么我的 neighbors.KNeighborsRegressor 预测是 "perfect"?

Python sklearn: why are my neighbors.KNeighborsRegressor predictions "perfect"?

我是运行以下代码:

from sklearn import neighbors
import numpy as np
import pandas as pd
X = pd.DataFrame(np.random.randn(50, 4), columns=list('ABCD'))
y = pd.DataFrame(np.random.randn(50, 1), columns=list('T'))
KNN_ = neighbors.KNeighborsRegressor(n_neighbors=20, weights='distance').fit(X, y)
yhat = KNN_.predict(X)
error = yhat-y
print(error)

为什么所有的错误都是零?据我了解,错误应该捕获拟合/预测值与我的数据点之间的差异?

我对其他估计器(例如随机森林回归器)应用了基本相同的程序,并且误差如预期的那样非零,所以我担心我在代码中遗漏了一个微妙之处?

这是因为你在同一个数据集上训练和测试。您正在使用 X 在以下行中进行训练

KNN_ = neighbors.KNeighborsRegressor(n_neighbors=20, weights='distance').fit(X, y)

然后预测相同的值

yhat = KNN_.predict(X)

您需要将数据集分解为训练和测试,例如 tran_X 和 test_X。然后在 train_X 上训练并使用 test_X.

进行预测

更新 如果你阅读 documentation of KNN 它说

The target is predicted by local interpolation of the targets associated of the nearest neighbors in the training set.

所以基本上,当您提供新目标进行预测时,它会在本地对训练集进行插值。由于值完全相同,因此它 returns 返回确切的数据行和标签。我的观点是,误差的差异与 KNN 内部的实际工作方式有关。我的猜测是,由于 RandomForest 是一种防止过度拟合的决策树集合,因此误差范围不为零(这是防止过度拟合的全部意义)。您需要了解一下这些算法在内部是如何工作的,以便对此有所了解。您可以查看 this and this 以了解为什么预测完全相同。