Python sklearn:为什么我的邻居.KNeighborsRegressor预测"完美"?

时间:2018-06-17 12:09:12

标签: python machine-learning scikit-learn random-forest knn

我正在运行以下代码:

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)应用了基本相同的过程,并且错误按预期非零,所以我担心我在代码中缺少一个微妙的东西?

1 个答案:

答案 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是一种决策树集合以防止过度拟合,因此存在误差范围非零(这是防止过度拟合的重点)。您需要了解这些算法如何在内部工作以了解相关信息。您可以查看thisthis,了解预测完全相同的原因。