训练和验证集的混淆矩阵

时间:2018-11-15 05:09:39

标签: r confusion-matrix

“ 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)) 

1 个答案:

答案 0 :(得分:2)

在每个机器学习过程中(在本例中为classification问题),您都必须将数据分成traintest集。

这很有用,因为您可以在第一组中训练算法,然后在第二组中测试

这是必须要做的,否则(如果使用所有数据)会使自己暴露于 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数据上的性能却几乎是完美的。