我错过了 ggplot 中的第二行,应该有测试和火车线吗?

Posted

技术标签:

【中文标题】我错过了 ggplot 中的第二行,应该有测试和火车线吗?【英文标题】:I'm missing the second line in a ggplot, there should be test and train lines present? 【发布时间】:2022-01-02 22:43:37 【问题描述】:

我正在尝试使用 ggplot2 和 R 来绘制神经网络迭代错误率的训练和测试曲线。应该有两条线,但我只看到测试线,有人知道发生了什么吗?看起来当我使用head(error_df) 时,由于某种原因,每种类型都被标记为测试。

编辑:即使只有 error_df 没有任何子集,它仍然没有显示训练集错误的行,这还包括各种范围,例如 error_df[2500:5000, 7500:10000,]

这是 ggplot 图:

这是数据的公开 Google 电子表格的代码和 this is a link:

library(Rcpp)
library(RSNNS)
library(ggplot2)
library(plotROC)
library(tidyr)

setwd("**set working directory**")
data <- read.csv("WDBC.csv", header=T)
data <- data[,1:4]
data <- scale(data)  # normalizes the data

numHneurons3 = 3
DecTargets = decodeClassLabels(data[,4])
train.test3 <- splitForTrainingAndTest(data, DecTargets,ratio = 0.50) # split

model3_02 <- mlp(train.test3$inputsTrain, train.test3$targetsTrain,  # build model3
                 size = numHneurons3, learnFuncParams = c(0.02),maxit = 10000, 
                 inputsTest = train.test3$inputsTest, 
                 targetsTest = train.test3$targetsTest)

#--------------------------------------
#     GGPlots of the Iterative Error:
#--------------------------------------

str(model3_02)

test_error <- model3_02$IterativeTestError
train_error <- model3_02$IterativeFitError

error_df <- data.frame(iter = c(seq_along(test_error),
                                seq_along(train_error)),
                       Error = c(test_error, train_error), 
                       type = c(rep("test", length(test_error)),
                                rep("train", length(train_error))
                       ))

ggplot(error_df[5000:10000,], aes(iter, Error, color = type, each = length(test_error))) + geom_line()

这里还有一个数据、模型和数据框的 sn-p:

> head(data, 10)
       PatientID     radius    texture   perimeter
 [1,] -0.2361973  1.0960995 -2.0715123  1.26881726
 [2,] -0.2361956  1.8282120 -0.3533215  1.68447255
 [3,]  0.4313615  1.5784992  0.4557859  1.56512598
 [4,]  0.4317407 -0.7682333  0.2535091 -0.59216612
 [5,]  0.4318215  1.7487579 -1.1508038  1.77501133
 [6,] -0.2361855 -0.4759559 -0.8346009 -0.38680772
 [7,] -0.2361809  1.1698783  0.1605082  1.13712450
 [8,]  0.4326197 -0.1184126  0.3581350 -0.07280278
 [9,] -0.2361759 -0.3198854  0.5883121 -0.18391855
[10,]  0.4329621 -0.4731182  1.1044669 -0.32919213

> str(model3_02)
List of 17
 $ nInputs              : int 4
 $ maxit                : num 10000
 $ IterativeFitError    : num [1:10000] 18838 4468 2365 1639 1278 ...
 $ IterativeTestError   : num [1:10000] 7031 3006 1916 1431 1161 ...
 $ fitted.values        : num [1:284, 1:522] 0.00386 0.00386 0.00387 0.00387 0.00386 ...
 $ fittedTestValues     : num [1:285, 1:522] 0.00387 0.00387 0.00387 0.00387 0.00387 ...
 $ nOutputs             : int 522
 - attr(*, "class")= chr [1:2] "mlp" "rsnns"

> head(error_df)  
  iter     Error type
1    1 7031.3101 test
2    2 3006.4253 test
3    3 1915.8997 test
4    4 1430.6152 test
5    5 1160.6987 test
6    6  990.2686 test

【问题讨论】:

您是否检查过error_df 以查看是否存在typetrain 的行?特别是在您指定的行中,error_df[5000:10000,]? ggplot 非常擅长绘制你给它的数据。由于train 没有出现在图例中,您可能没有给它任何出现train 的行。 train 行可能不在 5000:10000 范围内。我建议基于iter 值而不是行号进行子集化,例如subset(error_df, iter &gt; 5000 &amp; iter &lt;= 10000) 我想知道是不是因为它们被分成了子集,到目前为止,我已经尝试重新运行不同的子集,然后尝试查看整个内容,但大多数行都被省略了 10,000 个结果,但是所以到目前为止,我只是看到测试。测试和训练不应该大致相同,或者可能从中间分开吗? @GregorThomas 【参考方案1】:

您通过将两个变量连接到一列中创建了一个包含三列的数据框 (error_df),因此变量一个接一个地填充。但是,您将绘图限制在数据的 5000 到 10000 行之间。

ggplot(error_df[c(5000:10000, 15000:20000),], aes(iter, Error, color = type, each = length(test_error))) + geom_line()

应该显示两条曲线。

【讨论】:

我尝试了error_df[c(2500:5000, 7500:10000),],但我仍然只得到一条测试线,它是一个很大的 V 形,所以我假设之前有大量错误,后来错误更少 我也只是做了一个一般的error_df,我还在测试,它是一个90度角的巨大L形,我假设训练集不知何故被完全省略了 检查您的 error_df 数据框。它有 20000 行。前 10000 行是 test_error 值,接下来的 10000 行是 train_error 值。您一直选择仅绘制 test_error 值,这就是为什么您在绘图中只看到测试值的原因。不要子集并查看所有结果或从两个变量中选择相同的子集。 天哪,我笨,谢谢,我不知道要加 10,000 加 10,000 才能得到完整的行数

以上是关于我错过了 ggplot 中的第二行,应该有测试和火车线吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用数据表“on change”选择选项更新我的数据库中的第二行

python大法好! 这三行中的第二行代码可以说尽显霸气了!

python大法好! 这三行中的第二行代码可以说尽显霸气了!

s-s-rS - 当第二行溢出到第二页时重复详细信息组中的第一行

如何阻止 flex 行的第二行出现在页面中间? [复制]

AngularJs 副本:不放在表格的第二行