r - 与其他方法相比,使用 Caret 包的 KNN 给出了不好的结果
问题描述
我正在比较几种不同的机器学习算法来获得自动论文评分的准确性。我得到的训练集的 RMSE 和 Rsquared 值平均分别约为 0.75 和 0.43。但是由于某种原因,当我使用相同的函数框架运行 KNN 时,我得到 RMSE=0.95 和 RSquared=0.09。我也没有收到任何错误消息,所以我不知道出了什么问题。
我的数据集是连续的,我正在对其进行回归。
这是我的代码片段:
library(caret)
train_control <- trainControl(method="repeatedcv", number=10, repeats=3)
# Linear Regression ============================================================
lm <- train(holistic_score~.,
data=training,
trControl=train_control,
method="lm")
lm$results
lm_pred <- predict(lm, testing)
postResample(pred = lm_pred, obs = testing$holistic_score)
# Train: rmse = 0.714515 rsquared = 0.4737114
# Test: rmse = 0.7508373 rsquared = 0.4423288
# K-NN =========================================================================
knn <- train(holistic_score~.,
data=training,
trControl=train_control,
tuneLength=100,
method="knn")
knn$results
knn_pred <- predict(knn, testing)
postResample(pred=knn_pred, obs=testing$holistic_score)
# Train: rmse = 0.9466202 rsquared = 0.07567549
# Test: rmse = 0.9512989 rsquared = 0.0966448
我只展示了线性回归,但我在 6 个不同的数据集上使用了 10 种不同的算法,而且与其他的相比,KNN 的表现要差得多。
我试过在网上查看文档和这里,但我没有找到任何可以解决我的问题或提到它的东西。这是我发现的最接近有类似问题的人,但它不适用于我,因为我没有使用分类预测器。
有谁知道这可能是什么原因?
编辑: 这是因变量(holistic_score)的直方图:
解决方案
我的猜测是您没有为 knn 缩放自变量,当您的自变量处于不同的尺度时,这至关重要。你可以在这里看到一个有趣的讨论:
library(caret)
library(mlbench)
data(BostonHousing)
data = BostonHousing
train(medv ~.,data=data,method="knn",
trControl=trainControl(method="cv",number=3))
Summary of sample sizes: 337, 338, 337
Resampling results across tuning parameters:
k RMSE Rsquared MAE
5 6.721722 0.4748246 4.625845
7 6.897760 0.4429380 4.720363
9 6.807877 0.4550040 4.654680
train(medv ~.,data=data,method="knn",
trControl=trainControl(method="cv",number=3),
preProc = c("center", "scale"))
Pre-processing: centered (13), scaled (13)
Resampling: Cross-Validated (3 fold)
Summary of sample sizes: 337, 338, 337
Resampling results across tuning parameters:
k RMSE Rsquared MAE
5 4.873476 0.7354566 3.120004
7 4.983704 0.7280253 3.125164
9 4.972269 0.7348006 3.172021
train(medv ~.,data=data,method="glmnet",
trControl=trainControl(method="cv",number=3))
alpha lambda RMSE Rsquared MAE
0.10 0.01355531 4.994509 0.7145962 3.483945
0.10 0.13555307 4.997304 0.7145864 3.466551
0.10 1.35553073 5.124558 0.7054928 3.504224
0.55 0.01355531 4.995748 0.7145269 3.483881
0.55 0.13555307 5.030863 0.7112925 3.463395
0.55 1.35553073 5.423348 0.6793556 3.745830
1.00 0.01355531 4.998020 0.7143324 3.482485
1.00 0.13555307 5.084050 0.7055959 3.485051
1.00 1.35553073 5.593417 0.6725029 3.904954
推荐阅读
- django-views - 文件在这种情况下实际上存在时找不到文件是 screenshot9.png
- reactjs - 反应原生网络构建失败
- python - 使用烧瓶应用程序检查数据框中的值变化
- influxdb - Telegraf http listener v2:无法发送带有字符串值的 JSON
- python - 对值进行排序时了解 groupby() 函数
- javascript - 检查是否加载了框架集中另一个框架上的页面并显示加载gif
- postgresql - 从 golang 应用程序连接到 docker postgres
- apache-zeppelin - 齐柏林飞艇超越超集
- php - 为每个文件执行一个 jQuery 脚本,然后打印结果,但多次获得第一个结果
- node.js - 尝试从 EJS 放置到路由文件时无法 POST