我在使用随机森林的train()函数进行Coursera的实用机器学习项目时遇到了两个问题。由于原始数据集很大,我用两个小的数据框复制了这个问题,如下所示。
输入
library(caret)f = data.frame(x = 1:10, y = 11:20)f2 = data.frame(x = 1:5, y = 6:10)fit <- train(y~., data = f, method="lm")pred <- predict(fit, newdata = f2)confusionMatrix(pred, f2)
输出(主要问题)
Error in sort.list(y) : 'x'必须是原子类型才能用于'sort.list'你是否在列表上调用了'sort'?
如果我使用table
函数代替confusionMatrix
,我得到了以下错误:
Error in table(pred, data = f2) : 所有参数必须具有相同的长度
尽管pred
的长度为5,f2$y
的长度也是5。
作为旁注,这个例子中的fit函数有时也会给我一个我无法理解的错误。
警告信息:在nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo, :重抽样性能测量中存在缺失值。
EDIT: 语法
回答:
我认为你有三个问题。
-
confusionMatrix
期望两个向量,但f2
是一个数据框。请改用confusionMatrix(pred, f2$y)
。 -
但这会导致另一个错误:
The data must contain some levels that overlap the reference.
。这引出了第二个问题。如果你查看f2
的预测值和实际值,它们之间没有重叠。基本上,f
和f2
代表了x
和y
之间完全不同的关系。你可以通过绘图来看到这一点。library(tidyverse)theme_set(theme_classic())ggplot(bind_rows(f=f,f2=f2, .id="source"), aes(x,y,colour=source)) + geom_point() + geom_smooth(method="lm")
此外,假数据中没有噪声,所以拟合是完美的(RMSE = 0 且 R-squared = 1)。
fit
重抽样结果: RMSE Rsquared 1.650006e-15 1
-
假数据集有一个连续的outcome变量。然而,混淆矩阵是用于检查分类模型质量的工具——即,outcome是分类而不是连续的。在这种情况下,你应该使用适用于分类的模型,如逻辑回归、随机森林等,而不是线性回归模型。然后你可以使用
confusionMatrix
来比较预测类别与实际类别。
这是一个例子:
library(caret)# 假数据集set.seed(100)f = data.frame(y = c(rep(c("A","B"), c(100,25)),rep(c("B","A"), c(100,25))), x = c(rnorm(125, 1, 1), rnorm(125, 3, 1)))# 在训练数据集上训练模型set.seed(50)idx = sample(1:nrow(f), 200) # 训练观测的索引fit <- train(y ~ ., data = f[idx,], method="glm")# 获取概率尺度上的预测pred <- predict(fit, newdata=f[-idx, ], type="prob")# 创建混淆矩阵的数据框results = data.frame(pred=ifelse(pred$A < 0.5, "B","A"), actual=f$y[-idx])confusionMatrix(results$pred, results$actual)
混淆矩阵和统计数据 参考Prediction A B A 16 7 B 6 21 准确度 : 0.74 95% CI : (0.5966, 0.8537) 无信息率 : 0.56 P值 [Acc > NIR] : 0.006698 Kappa : 0.475 Mcnemar测试P值 : 1.000000 敏感度 : 0.7273 特异度 : 0.7500 正预测值 : 0.6957 负预测值 : 0.7778 流行度 : 0.4400 检测率 : 0.3200 检测流行度 : 0.4600 平衡准确度 : 0.7386 'Positive'类 : A