Вот моя проблема, я использую R с кареткой для сравнения различных моделей.
Уровни моего бинарного класса для прогнозирования были по умолчанию "Нет", " Да "
И я хотел, чтобы мой положительный класс по умолчанию был" Да ", поэтому я изменил его, и все работает отлично.
За исключением одного из методов, которые я использовал. 'ada' возвращает обученные прогнозы, которые не соответствуют вероятности, вычисленной моделью.
Ниже вы можете найти проблему, с которой я сталкиваюсь.
library(ISLR)
library(caret)
# library(foreach)
library(e1071)
data(Caravan)
# I want my positive class to be "Yes" while training
Caravan$Purchase <- relevel(Caravan$Purchase, ref = "Yes")
# We are asked to only take first 1000 obs
split_slice = 1000
train = Caravan[c(0:split_slice),]
test = Caravan[c((split_slice+1): nrow(Caravan)), ]
# I set the trainControl parameter (small values for fast reproducibility)
train.control <- trainControl(method = "repeatedcv", # cv
number = 3,
repeats = 1,
savePredictions = 'final',
classProbs = T,
# allowParallel = T,
# verboseIter = T
)
# I set the grid for fast reproducibility
tune.grid <- expand.grid(maxdepth = 2,
nu = 0.3,
iter = 150
)
# I train my model with 'ada' method
boost.tree <- train(Purchase ~ ., data = train,
method = "ada",
trControl = train.control,
tuneGrid = tune.grid
)
Теперь, когда я обучил свою модель, я хочу проверить прогнозы на тренировочном наборе, и я не могу понять, почему мой прогноз да, когда моя вероятность очень мала для этого класса.
# here we can see that i predict always yes but it should be no
> boost.tree$pred
iter maxdepth nu pred obs Yes No rowIndex Resample
1 150 2 0.3 Yes No 0.0408888436 0.9591112 4 Fold1.Rep1
2 150 2 0.3 Yes No 0.0487558062 0.9512442 6 Fold1.Rep1
3 150 2 0.3 Yes No 0.0986328290 0.9013672 13 Fold1.Rep1
4 150 2 0.3 Yes No 0.0022378578 0.9977621 15 Fold1.Rep1
5 150 2 0.3 Yes No 0.1307794728 0.8692205 16 Fold1.Rep1
6 150 2 0.3 Yes No 0.0006265762 0.9993734 17 Fold1.Rep1
7 150 2 0.3 Yes No 0.0801457392 0.9198543 23 Fold1.Rep1
>
Если у вас есть идеи, откуда может возникнуть проблема ?
Также, когда я запускаю другую модель, используя другие методы, у меня нет этой проблемы.
Вот два примера, сохраняющие Те же параметры в TrainControl и уровне класса.
knn <- train(Purchase ~ .,
data = train,
method = "knn",
trControl = train.control,
tuneGrid = expand.grid(k = 1:25)
)
> knn$pred
k pred obs Yes No rowIndex Resample
1 10 No No 0.00000000 1.0000000 478 Fold1.Rep1
2 10 No Yes 0.00000000 1.0000000 481 Fold1.Rep1
3 10 No No 0.00000000 1.0000000 466 Fold1.Rep1
4 10 No No 0.00000000 1.0000000 468 Fold1.Rep1
5 10 No No 0.00000000 1.0000000 473 Fold1.Rep1
6 10 No No 0.10000000 0.9000000 474 Fold1.Rep1
7 10 No No 0.10000000 0.9000000 588 Fold1.Rep1
logit <- train(Purchase ~ ., data = train,
method = "glm",
family = binomial(link='logit'),
trControl = train.control,
)
> logit$pred
parameter pred obs Yes No rowIndex Resample
1 none No No 1.981114e-03 9.980189e-01 4 Fold1.Rep1
2 none No No 1.053505e-02 9.894650e-01 6 Fold1.Rep1
3 none No No 5.114459e-02 9.488554e-01 13 Fold1.Rep1
4 none No No 6.507634e-02 9.349237e-01 15 Fold1.Rep1
5 none No No 3.847417e-01 6.152583e-01 16 Fold1.Rep1
6 none No No 6.356885e-02 9.364311e-01 17 Fold1.Rep1
7 none Yes No 6.870402e-01 3.129598e-01 23 Fold1.Rep1