为什么knnImpute preProcess会更改其他数据?这是错误的

时间:2017-05-10 07:56:46

标签: r missing-data r-caret knn

以下是一些数据:

> head(p.full)[,1:3]
     id timestamp full_sq
1 30474     16617   39.00
2 30475     16617   79.20
3 30476     16617   40.50
4 30477     16617   62.80
5 30478     16617   40.00
6 30479     16617   48.43

上面没有显示一些缺失值,所以我使用了来自插入符号的preProcess来用中值填充它们:

p.full.medians <- predict(preProcess(p.full, method=c("medianImpute")), p.full)

> head(p.full.medians)[,1:3]
     id timestamp full_sq
1 30474     16617   39.00
2 30475     16617   79.20
3 30476     16617   40.50
4 30477     16617   62.80
5 30478     16617   40.00
6 30479     16617   48.43

与上述完全相同,预期,因为我显示的相同df没有缺失值。

然后我尝试用knn impute:

p.full.knn <- predict(preProcess(p.full, method=c("knnImpute")), p.full)
> head(p.full.knn)[,1:3]
        id timestamp    full_sq
1 1.036042 0.9665495 -0.4296467
2 1.036133 0.9665495  0.7133352
3 1.036224 0.9665495 -0.3869981
4 1.036315 0.9665495  0.2470441
5 1.036405 0.9665495 -0.4012143
6 1.036496 0.9665495 -0.1615293

现在整个数据框中的值都已更改,而我预计只会更改NA值。

这是预期的吗?我误解了knnImpute的工作原理吗?

1 个答案:

答案 0 :(得分:2)

这是预期的,并在文档中提到。使用knnImpute数据时,默认情况下会缩放并居中(这就是为什么您会看到零左右的值)。

来自documentation

  

preProcess可用于仅根据训练集中的信息来估算数据集。这样做的一种方法是使用K-最近邻居。对于任意样本,在训练集中找到K个最近邻居,并且使用这些值(例如,使用均值)估算预测值的值。使用此方法将自动触发preProcess以使数据居中和缩放,无论方法参数中是什么。