Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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包xgboost中的nfold和nrounds_R_Cross Validation_Xgboost - Fatal编程技术网

如何理解R包xgboost中的nfold和nrounds

如何理解R包xgboost中的nfold和nrounds,r,cross-validation,xgboost,R,Cross Validation,Xgboost,我正在尝试使用R的软件包xgboost。但有一件事我感到困惑。在xgboost手册的xgb.cv函数下,它说: 原始样本被随机划分为N倍大小相等的子样本 在nfold子样本中,保留一个子样本作为模型测试的验证数据,剩余的nfold-1子样本用作训练数据 交叉验证过程然后重复nrounds次,每个nfold子样本 仅作为验证数据使用一次 这是手册中的代码: data(agaricus.train, package='xgboost') dtrain <- xgb.DMatrix(agaric

我正在尝试使用R的软件包xgboost。但有一件事我感到困惑。在xgboost手册的xgb.cv函数下,它说:

原始样本被随机划分为N倍大小相等的子样本

在nfold子样本中,保留一个子样本作为模型测试的验证数据,剩余的nfold-1子样本用作训练数据

交叉验证过程然后重复nrounds次,每个nfold子样本 仅作为验证数据使用一次

这是手册中的代码:

data(agaricus.train, package='xgboost')
dtrain <- xgb.DMatrix(agaricus.train$data, label = agaricus.train$label)
cv <- xgb.cv(data = dtrain, nrounds = 3, nthread = 2, nfold = 5, metrics = 
list("rmse","auc"),
max_depth = 3, eta = 1, objective = "binary:logistic")
print(cv)
print(cv, verbose=TRUE)
假设nfold=5,nrounds=2。这意味着数据被分成5个大小相等的部分。该算法将生成2棵树

我的理解是:每个子样本必须验证一次。当一个子样本被验证时,将生成两棵树。因此,我们将有5组树,一组有2棵树,因为nrounds=2。然后我们检查评估指标是否变化很大

但结果却不尽相同。一个nround值有一行评估指标,看起来它已经包含了“交叉验证”部分。因此,如果“交叉验证过程重复nrounds次”,那么为什么“每个nfold子样本只使用一次作为验证数据”?

这些是nrounds中每轮运行的nfold拟合测试程序分数的平均值和标准差。XGBoost交叉验证过程如下:

数据集X被拆分为nfold子样本X1、X2…Xnfold。 XGBoost算法将增强树与包含X1、X2、…、Xnfold-1的训练数据集相匹配,而最后一个子样本折叠Xnfold被保留为样本数据集外的验证1。为培训和验证数据集计算并保留选定的评估指标RMSE、AUC等。 训练数据集中的一个子样本折叠现在与验证子样本折叠交换,因此训练数据集现在包括X1、X2、,Xnfold-2,Xnfold,样本数据集外的验证为Xnfold-1。同样,该算法将增强树与训练数据相匹配,计算每个选定指标的评估分数,依此类推。 这个过程重复N次,直到每个子样本折叠都作为训练集和验证集的一部分。 现在,添加另一个增强的树,并重复步骤2-4中概述的过程。这将一直持续,直到拟合到训练数据的增强树总数等于nrounds。 现在,计算出的评估分数为nfold乘以在nrounds中为每一轮选择的不同度量的数量,对于训练集和验证集,验证集的分数自然会更差。计算训练集和验证集的nfold分数的平均值和标准偏差乘以为每轮选择的不同度量数(nrounds),并在数据帧(nrounds行)中返回。 1请注意,XGBoost将我所称的“验证”集确定为评估日志中的“测试”集

这些是每轮nrounds中运行的nfold fit测试程序分数的平均值和标准偏差。XGBoost交叉验证过程如下:

数据集X被拆分为nfold子样本X1、X2…Xnfold。 XGBoost算法将增强树与包含X1、X2、…、Xnfold-1的训练数据集相匹配,而最后一个子样本折叠Xnfold被保留为样本数据集外的验证1。为培训和验证数据集计算并保留选定的评估指标RMSE、AUC等。 训练数据集中的一个子样本折叠现在与验证子样本折叠交换,因此训练数据集现在包括X1、X2、,Xnfold-2,Xnfold,样本数据集外的验证为Xnfold-1。同样,该算法将增强树与训练数据相匹配,计算每个选定指标的评估分数,依此类推。 这个过程重复N次,直到每个子样本折叠都作为训练集和验证集的一部分。 现在,添加另一个增强的树,并重复步骤2-4中概述的过程。这将一直持续,直到拟合到训练数据的增强树总数等于nrounds。 现在,计算出的评估分数为nfold乘以在nrounds中为每一轮选择的不同度量的数量,对于训练集和验证集,验证集的分数自然会更差。计算训练集和验证集的nfold分数的平均值和标准偏差乘以为每轮选择的不同度量数(nrounds),并在数据帧(nrounds行)中返回。 1请注意,XGBoost将我称之为“验证”集的内容标识为评估日志中的“测试”集

您知道这将如何处理时间序列数据吗?如果有时您可能会使用来自未来的数据来训练您的模型,那么使用nfold交叉验证是否错误?您知道这将如何处理时间序列数据吗?如果有时您可能使用来自未来的数据来训练您的模型,那么使用nfold交叉验证是否错误
##### xgb.cv 5-folds
call:
  xgb.cv(data = dtrain, nrounds = 3, nfold = 5, metrics = list("rmse", 
    "auc"), nthread = 2, max_depth = 3, eta = 1, objective = "binary:logistic")
params (as set within xgb.cv):
  nthread = "2", max_depth = "3", eta = "1", objective = "binary:logistic", 
eval_metric = "rmse", eval_metric = "auc", silent = "1"
callbacks:
  cb.print.evaluation(period = print_every_n, showsd = showsd)
  cb.evaluation.log()
niter: 3
evaluation_log:
 iter train_rmse_mean train_rmse_std train_auc_mean train_auc_std test_rmse_mean test_rmse_std test_auc_mean test_auc_std
1       0.1623756    0.002693092      0.9871108  1.123550e-03      0.1625222   0.009134128     0.9870954 0.0045008818
2       0.0784902    0.002413883      0.9998370  1.317346e-04      0.0791366   0.004566554     0.9997756 0.0003538184
3       0.0464588    0.005172930      0.9998942  7.315846e-05      0.0478028   0.007763252     0.9998902 0.0001347032