我正在运行以下代码:
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)
为什么所有错误都为零?据我了解,错误应该捕获拟合/预测值与我的数据点之间的差异?
我已经与其他估算器(例如Random Forest Regressor)应用了基本相同的过程,并且错误按预期非零,所以我担心我在代码中缺少一个微妙的东西?
答案 0 :(得分:2)
这是因为您正在对同一数据集进行培训和测试。您正在使用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,则说明
通过对训练集中最近邻居关联的目标进行局部插值来预测目标。
因此,基本上当您提供新目标进行预测时,它会在本地插入训练集。由于值完全相同,因此返回确切的数据行和标签。我的观点是,错误的差异与KNN内部的实际工作方式有关。我的猜测是,由于RandomForest是一种决策树集合以防止过度拟合,因此存在误差范围非零(这是防止过度拟合的重点)。您需要了解这些算法如何在内部工作以了解相关信息。您可以查看this和this,了解预测完全相同的原因。