“ newdata” 参数的目的是什么?
为什么在第一种情况下我们不需要指定newdata = tlFLAG.t
?
pred <- predict(tree1, type = "class")
confusionMatrix(pred, factor(tlFLAG.t$TERM_FLAG))
pred.v <- predict(tree1, type = "class", newdata = tlFLAG.v)
confusionMatrix(pred.v, factor(tlFLAG.v$TERM_FLAG))
答案 0 :(得分:2)
在每个机器学习过程中(在本例中为classification
问题),您都必须将数据分成train
和test
集。
这很有用,因为您可以在第一组中训练算法,然后在第二组中测试。
这是必须要做的,否则(如果使用所有数据)会使自己暴露于 overfitting ,因为几乎每种算法都将尝试最适合您提供的数据
您甚至将获得一个完美的数据模型,但这将预测尚未出现的新数据非常。
因此,predict
函数使您可以通过newdata=
arg选择新数据来“测试”模型在看不见的数据上的优势。
在第一种情况下,您通过不指定newdata=
参数来“测试”您在已经训练的数据上的表现,因此confusionMatrix
可能过于乐观
在第二种情况下,您应该指定newdata=test_set
,并以此为基础基于测试数据进行预测,因此在第二种情况下,性能将更加准确,甚至更加有趣。
我将在此处构建一个示例,供您查看经典方法:
data <- iris # iris dataset
# first split the data
set.seed(123) # for reproducibility
pos <- sample(100)
train <- data[pos, ] # random pick of 100 obs
test <- data[-pos, ] # remaining 50
# now you can start with your model - please not that this is a dummy example
library(rpart)
tree <- rpart(Species ~ ., data=train) # fit tree on train data
# make prediction on train data (no need to specify newclass= ) # NOT very useful
pred <- predict(tree, type = "class")
caret::confusionMatrix(pred, train$Species)
# make prediction on test data (remove the response)
pred <- predict(tree, type = "class", newdata = test[, -5]) # I removed Species (5th column in test)
# build confusion from predictions against the truth (ie the test$Species)
caret::confusionMatrix(pred, test$Species)
请注意,在test
数据上的性能是多么糟糕,而在train
数据上的性能却几乎是完美的。