我正在运行以下代码:
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.
所以基本上,当您提供新的预测目标时,它会在本地插入训练集。由于这些值完全相同,因此它返回确切的数据行和标签。我的观点是,误差的差异与 KNN 内部的实际工作方式有关。我的猜测是,由于随机森林是一种防止过度拟合的决策树集合,因此误差范围不为零(这就是防止过度拟合的全部意义)。您需要了解这些算法的内部工作原理才能了解这一点。您可以看一下this和 this了解为什么预测完全相同。
关于Python sklearn : why are my neighbors. KNeighborsRegressor 预测 "perfect"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50896495/