Это пример кода, который воспроизводит мою проблему.На самом деле у меня гораздо больший набор данных с большим количеством переменных.
Я пытаюсь использовать каретку (train) для запуска некоторых моделей SVM.Я обнаружил, что при использовании матричного интерфейса я получаю разные результаты по сравнению с интерфейсом формулы.Похоже, что во время предварительной обработки матрицы преобразование Йео-Джонсона не применяется к фиктивной переменной, где, как в интерфейсе формулы, оно есть.
Далее при попытке прогнозирования с использованием интерфейса матрицы оно не работает.
То, что я хотел бы сделать, это получить одинаковый результат от обоих методов и понять, почему в настоящее время существует дискретность!
library(kernlab)
library(caret)
# Normal version of sample data with 1 numeric and 1 factor variable.
trainset <- data.frame(
class=factor(c("Good", "Bad", "Good", "Good", "Bad", "Good", "Good", "Good", "Good", "Bad", "Bad", "Bad")),
age=c(67, 22, 49, 45, 53, 35, 53, 35, 61, 28, 25, 24),
hair = c("Brown", "Black","Brown", "Black","Brown", "Black","Brown", "Black","Brown", "Black","Brown", "Black"))
trainset.class = trainset$class
testset <- data.frame(
class=factor(c("Good", "Bad", "Good" )),
age=c(64, 23, 50),
hair = c("Brown", "Brown","Black"))
testset.class = testset$class
# Dummified version of sample with full rank = T
Formula = dummyVars("~.",data=trainset[,-1], fullRank=T)
dummy.trainset = as.data.frame(predict(Formula,trainset))%>%
cbind(trainset.class)
Formula.test = dummyVars("~.",data=testset[,-1], fullRank=T)
dummy.testset = as.data.frame(predict(Formula.test,testset))%>%
cbind(testset.class)
# Now run modelling with formula and matrix interfaces on DUMMIFIED VERSION as svm needs this variables dummy coded.
set.seed(1)
svmFit.matrix <- train(x = select(dummy.trainset,-trainset.class), y = trainset.class,
method = "svmRadial",
preProc = c("center", "scale", "YeoJohnson"),
tuneLength = 3,
trControl = trainControl(method = "cv", classProbs = TRUE))
svmFit.matrix
set.seed(1)
svmFit.formula <- train(trainset.class~.,
data = dummy.trainset,
method = "svmRadial",
preProc = c("center", "scale", "YeoJohnson"),
tuneLength = 3,
trControl = trainControl(method = "cv", classProbs = TRUE))
svmFit.formula
### predict probablities using formula and matrix interface
predictedProbs.matrix <- predict(svmFit.matrix, dummy.testset , type = "prob")
head(predictedProbs.matrix)
predictedProbs.formula <- predict(svmFit.formula, dummy.testset , type = "prob")
head(predictedProbs.formula)