Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R h2o和插入符号中的数据分区函数似乎正在泄漏数据?_R_Validation_Partitioning_R Caret_H2o - Fatal编程技术网

R h2o和插入符号中的数据分区函数似乎正在泄漏数据?

R h2o和插入符号中的数据分区函数似乎正在泄漏数据?,r,validation,partitioning,r-caret,h2o,R,Validation,Partitioning,R Caret,H2o,我怀疑h2o和caret的数据分区函数都可能以某种方式泄漏数据。我之所以怀疑这一点,是因为我在使用h2o的h2o.splitFrame函数或caret的createDataPartition函数时得到了两个完全不同的结果—与我自己手动分区数据时得到的结果不同: 在我的数据框架中,使用时间序列数据、3000-4000个数据点和10倍CV,我在所有数据集中都获得了非常可接受的结果:使用caret的xgboost或h2o时,训练、验证、交叉验证和测试集。然而,这些高r2/低RMSE(良好)结果只有在我

我怀疑h2o和caret的数据分区函数都可能以某种方式泄漏数据。我之所以怀疑这一点,是因为我在使用h2o的h2o.splitFrame函数或caret的createDataPartition函数时得到了两个完全不同的结果—与我自己手动分区数据时得到的结果不同:

在我的数据框架中,使用时间序列数据、3000-4000个数据点和10倍CV,我在所有数据集中都获得了非常可接受的结果:使用caret的xgboost或h2o时,训练、验证、交叉验证和测试集。然而,这些高r2/低RMSE(良好)结果只有在我使用caret的createDataPartition函数和h2o的h2o.splitFrame函数时才会出现

另一方面,如果我自己手动删除一部分数据以创建一个完全独立的测试集数据帧(同时仍然使用适当的分区功能将数据拆分为训练集和验证集),那么手动创建的测试集结果很差,而训练、验证、,交叉验证结果保持良好(高r2/低RMSE)

为了建立一个控制,我可以故意弄乱数据-使用随机数,删除多个特征/列,等等-并且预测结果在训练、验证、10倍CV和测试集中都不好

例如,这里是我用来划分数据的h2o代码。当我使用特定于包的数据分区函数时,我看到了这些奇怪的、不一致的结果,这让我想知道,媒体上关于机器学习的所有这些“惊人的准确性”是否部分是由于使用分区函数时的数据泄漏

#Pre-process
df_h2o <- write.csv(df, file = "df_h2o.csv")
df <- h2o.importFile(path = normalizePath("df_h2o.csv"),  destination_frame 
= "df")

## Pre moodel
#Splitting the data
splits <- h2o.splitFrame(df, c(0.6,0.2), seed=1234)
train <- h2o.assign(splits[[1]], "train")   
valid <- h2o.assign(splits[[2]], "valid")   
test <- h2o.assign(splits[[3]], "test") ### <--- My test results are poor if 
                                        ### I manually partition test data                                            
                                        ### myself (i.e. without using any
                                        ### partitioning function). 
                                        ### Otherwise, results are good.   

#Identify the variable that will predict and independent variables
y <- "Target"
x <- setdiff(colnames(train),y)

#Build model
model<-h2o.deeplearning(x=x,              
                    y=y,
                    seed = 1234,
                    training_frame = train,
                    validation_frame = valid,
                    hidden = c(40,40),
                    nfolds = 10,
                    stopping_rounds = 7,
                    epochs = 500,
                    overwrite_with_best_model = TRUE,
                    standardize = TRUE,
                    activation = "Tanh",
                    loss = "Automatic",
                    distribution = "AUTO",
                    stopping_metric = "MSE",
                    variable_importances=T)
#预处理
df_h2o如果您指的是“数据泄漏”,则该术语通常与意外包含与响应列相关(以“坏”/“欺骗方式”)的预测列的过程相关联。按行拆分数据帧永远不会导致虚假数据泄漏

如果手动创建的train、valid和test frames产生的结果很差,这可能是因为您的行没有随机化,并且您的模型与训练集过度匹配。由于
h2o::h2o.splitFrame()
caret::createDataPartition()
在拆分过程中使用随机化,它将生成均匀分布的序列集、有效集和测试集,并生成更好的模型。然而,如果你的手动数据集也是随机创建的,那么你所说的对我来说没有多大意义

希望您使用
h2o.performance(model,test)
来确定测试集的准确性(尽管我在您的脚本中没有看到)。默认情况下,H2O的深度学习将使用
validation\u框架
提前停止,因此验证度量不是泛化错误的真实估计。因此需要一个测试集。

如果你指的是“数据泄漏”,则该术语通常与意外包含预测列的过程相关,该预测列与响应列相关(以“坏的”/“欺骗的方式”)。按行拆分数据帧永远不会导致虚假数据泄漏

如果手动创建的train、valid和test frames产生的结果很差,这可能是因为您的行没有随机化,并且您的模型与训练集过度匹配。由于
h2o::h2o.splitFrame()
caret::createDataPartition()
在拆分过程中使用随机化,它将生成均匀分布的序列集、有效集和测试集,并生成更好的模型。然而,如果你的手动数据集也是随机创建的,那么你所说的对我来说没有多大意义


希望您使用
h2o.performance(model,test)
来确定测试集的准确性(尽管我在您的脚本中没有看到)。默认情况下,H2O的深度学习将使用
validation\u框架
提前停止,因此验证度量不是泛化错误的真实估计。因此需要一个测试集。

+1感谢Erin给出的易于理解的答案。1) 是的,我发现我错误地使用了数据泄漏。谢谢你的澄清。我是按行分割的,没有任何列可以泄漏到目标变量。2) 我自己只手动删除测试数据集,不随机化,测试集由原始数据集最近3年的数据组成;然后,我使用适当的分区函数将剩余的数据拆分为训练集和验证集。在这里,而且只有在这里,当我自己手动创建测试集时,我得到的结果很差。3)是的,我使用h2o.performance,并且当使用分区函数时,结果是非常可接受的;我甚至绘制了残差的直方图,结果是正态分布的。4) 但这对我来说仍然没有意义b/c似乎模型应该同样好地预测我是使用随机化数据分区函数还是使用手动创建的保留作为测试集(而不是随机化)。最后一个问题:我决定手动创建保留的原因,我自己测试数据集,而不是仅仅依赖于b/c分区函数,我想排除可能发生的某种“假”现象。使用h2o和caret的xgb,结果简直令人难以置信!测试数据集和所有10倍CV中的R平方>0.9,以及最小SD b/t迭代和低RMSE和正态分布残差……所有这些都让我怀疑机器学习是否真的能有这么好。我需要知道该相信什么:我的模型是好是坏?听起来你有时间序列数据,这可以解释为什么你的手动分区(没有随机化)会产生糟糕的结果。如果生成数据的分布随时间而变化,那么如果您没有captur提供的任何功能,那么在“旧”数据上训练模型和在“新”数据上预测可能无法正常工作