Проблема в том, что knn
не знает, как обрабатывать категориальные предикторы при использовании метода S3 по умолчанию для функции каретки:
Пример:
library(mlbench)
library(caret)
data(Servo)
summary(Servo)
Motor Screw Pgain Vgain Class
A:36 A:42 3:50 1:47 Min. : 1.00
B:36 B:35 4:66 2:49 1st Qu.:10.50
C:40 C:31 5:26 3:27 Median :18.00
D:22 D:30 6:25 4:22 Mean :21.17
E:33 E:29 5:22 3rd Qu.:33.50
Max. :51.00
так что все предикторы категоричны
predictors <- colnames(Servo)[1:4]
cv_opts = trainControl(method="repeatedcv", repeats = 5)
model_knn <- train(Servo[predictors],
Servo[,5],
method = "knn",
trControl = cv_opts)
Результат:
Something is wrong; all the RMSE metric values are missing:...
Чтобы преодолеть это, можно использовать метод формулы S3 для поезда:
model_knn <- train(Class~.,
data = Servo,
method = "knn",
trControl = cv_opts)
model_knn
k-Nearest Neighbors
167 samples
4 predictor
No pre-processing
Resampling: Cross-Validated (10 fold, repeated 5 times)
Summary of sample sizes: 151, 149, 149, 150, 151, 151, ...
Resampling results across tuning parameters:
k RMSE Rsquared MAE
5 9.124929 0.6404554 7.820686
7 9.356812 0.6393563 7.983302
9 9.775620 0.6169618 8.396535
RMSE was used to select the optimal model using the smallest value.
The final value used for the model was k = 5.
Или вы можете построить свою собственную матрицу модели и использовать ее в методе S3 по умолчанию:
Servo_X <-
model.matrix(Class~.-1,
data = Servo)
model_knn2 <- train(Servo_X,
Servo$Class,
method = "knn",
trControl = cv_opts)
k-Nearest Neighbors
167 samples
16 predictor
No pre-processing
Resampling: Cross-Validated (10 fold, repeated 5 times)
Summary of sample sizes: 149, 151, 151, 150, 151, 151, ...
Resampling results across tuning parameters:
k RMSE Rsquared MAE
5 9.289972 0.6310129 7.869684
7 9.487649 0.6401052 8.021603
9 9.908227 0.6479472 8.604000
RMSE was used to select the optimal model using the smallest value.
The final value used for the model was k = 5.
Кроме того, рекомендуется использовать preProc = c("center", "scale")
при использовании knn
, поскольку вы хотите, чтобы все предикторы были в одном масштабе.
Чтобы понять, что происходит, когда вы используете интерфейс формулы, посмотрите:
https://github.com/topepo/caret/blob/master/models/files/knn.R
а также
caret:::knnreg.formula
caret:::knn3.formula