QDA |训练和测试数据集的长度 |如何拆分训练数据和测试数据?

Posted

技术标签:

【中文标题】QDA |训练和测试数据集的长度 |如何拆分训练数据和测试数据?【英文标题】:QDA | lengths of training and test data sets | How to split data in training and test data? 【发布时间】:2017-02-20 05:54:08 【问题描述】:

在 QDA(二次判别分析)中,我需要保持训练和测试数据的长度完全相同吗?如果没有,在这种情况下如何找到混淆矩阵

这里是psuedo data。

因为如果我保留不同长度的训练数据和测试数据集,则会出现错误(使用 R Studio): “表中的错误(pred,true):所有参数必须具有相同的长度”。

尝试在两个数据集以及 pred 和 true 上使用 na.omit() 删除 NA;并为 qda() 使用 na.action = na.exclude,但它不起作用。

将数据集精确地分成两半后;一半作为训练,一半作为测试;它在 pred 和 true 上的 na.omit() 之后完美运行。

以下是用于任一方法的代码。在方法 2 中,将数据分成相等的两半,它工作得非常好。

#Approach 1: divide data age-wise

train <- vif_data$Age < 30
# there are around 400 values passing (TRUE) above condition and around 50 failing (FALSE)

train_vif <- vif_data[train,]
test_vif <- vif_data[!train,]

#taking QDA
zone_qda <- qda(train_vif$Awareness~train_vif$Zone, na.action = na.exclude)
#compare QDA against test data
zone_pred <- predict(zone_qda, test_vif)
#omitting nulls
pred <- na.omit(zone_pred$class)
true <- na.omit(test_vif$Awareness)
length(pred) #  result: 399
length(true) # result: 47

#that's where it throws error: "Error in table(zone_pred$class, train_vif) : all arguments must have the same length"
zone_aware <- table(zone_pred$class, train_vif)
# OR
zone_aware <- table(pred, true)
accur <- mean(zone_pred$class==test_vif$Awareness)


###############################

#Approach 2: divide data into random halves
train <- splitSample(dataset = vif_data, div = 2, path = "./", type = "csv")
train_data <- read.csv("splitSample_s1.csv")
test_data <- read.csv("splitSample_s2.csv")

#taking QDA
zone_qda <- qda(train_vif$Awareness~train_vif$Zone, na.action = na.exclude)
#compare QDA against test data
zone_pred <- predict(zone_qda, test_vif)
#omitting nulls
pred <- na.omit(zone_pred$class)
true <- na.omit(test_vif$Awareness)
length(train_vif)

# this works fine
zone_aware <- table(zone_pred$class, train_vif)
# OR
zone_aware <- table(pred, true)
accur <- mean(zone_pred$class==test_vif$Awareness)

想知道是否有任何方法可以得到一个混淆矩阵,其中数据集不均等地分为训练数据集和测试数据集。

谢谢!

【问题讨论】:

【参考方案1】:

您是否插入训练输入而不是测试集输入数据来进行预测?注意这如何产生相同的错误消息:

table(c(1,2),c(1,2,3))

如果pred 的长度不正确,那么您可能预测错误。目前,你还没有分享你的任何代码,所以我不能再说什么了。但是,您没有理由不能使用与训练数据不同大小的测试数据来获得混淆矩阵。

【讨论】:

谢谢泰勒。测试数据被插入到 predict()。您能说出“pred is not the right length”是什么意思吗? 另外,如果有帮助,我已将上面的代码添加到问题中。 训练数据不应该这样拆分;它必须随机完成。如果我知道您使用的是什么数据也会有所帮助 问题中的共享伪数据。无法从远程工作站检索实际数据。让我知道它是否可以访问。是的,数据将被随机拆分。因此在方法 #2 中使用了splitSample()

以上是关于QDA |训练和测试数据集的长度 |如何拆分训练数据和测试数据?的主要内容,如果未能解决你的问题,请参考以下文章

R:如何将数据框拆分为训练集、验证集和测试集?

数据集拆分:训练集、验证集、测试集

使用带测试训练拆分的 DBSCAN 进行分类

我应该使用训练数据集的函数来处理训练数据集和测试数据集的缺失值吗

训练、验证和测试集的最佳分割

用于拆分训练集和测试集的函数 train_test_split