问题标签 [k-fold]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
45 浏览

python - RandomForestRegressor - K-fold CV cross_val_predict 永远不会完成

我正在使用 RandomForestRegressor 生成新功能:

旧脚本需要 20 分钟才能完成,但仍然完成......

--执行网格搜索

--执行K-Fold CV

但是现在我也想显示我的预测值,所以我添加了 cross_val_predict 并且模型永远不会完成:

两者都运行:

知道如何解决这个问题吗?

Ps:我是初学者,所以请放轻松。

0 投票
0 回答
475 浏览

python - StandardScaler 到整个训练数据集或单个折叠以进行交叉验证

我目前正在使用 cross_val_score 和 KFold 来评估在数据预处理中的不同点使用 StandardScaler 的影响,特别是在执行交叉验证之前缩放整个训练数据集是否会引入数据泄漏以及与缩放相比的影响管道内的数据(因此仅将其应用于训练折叠)。

我目前的流程如下:

实验A

  • 从 sklearn.datasets 导入波士顿住房数据集并拆分为数据 (X) 和目标 (y)
  • 创建一个管道 (sklearn.pipeline),在应用线性回归之前应用 StandardScaler
  • 将交叉验证方法指定为 5 折的 KFold
  • 使用上述 Pipeline 和 KFold 方法进行交叉验证(cross_val_score)并观察分数

实验 B

  • 使用与上述相同的波士顿住房数据
  • 整个数据集上的 fit_transform StandardScaler
  • 使用 cross_val_Score 再次对 5 折执行交叉验证,但这次直接输入 LinearRegression 而不是管道
  • 将此处的分数与实验 A 进行比较

获得的分数是相同的(大约小数点后 13 位),我质疑实验 B 在交叉验证期间肯定会引入数据泄漏。

我看过帖子说在交叉验证之前是否对整个训练集进行缩放并不重要,如果这是真的,我想知道为什么,如果这不是真的,我想了解为什么分数尽管数据泄漏,仍然可以如此相似?

请参阅下面的测试代码:

谢谢!

0 投票
0 回答
145 浏览

machine-learning - 为什么我的随机森林分类器在测试和验证数据上比在训练数据上表现更好?

我目前正在根据我拥有的一些数据训练一个随机森林,我发现该模型在验证集上的表现比在训练集上的表现更好,甚至在测试集上的表现更好。以下是我正在做的一些细节 - 如果我错过了任何重要信息,请告诉我,我会添加它。

我的问题

我是否在做任何明显错误的事情,你对我应该如何改进我的方法有什么建议吗,因为当我的模型对看不见的数据的预测比训练数据好得多时,我简直不敢相信我做对了!

数据

我的基础数据由描述客户行为的特征表和二进制目标组成(所以这是一个二进制分类问题)。从技术上讲,我每个月都有一个这样的表,我倾向于使用几个月的数据进行训练,然后使用不同的月份进行预测(例如,在 4 月、5 月进行训练,在 6 月进行预测)

一般来说,这意味着我最终得到了一个大约 100k 行和 20 个特征的训练数据集(我之前研究过特征选择,发现一组 7 个似乎表现最好的特征,所以最近一直在使用这些特征)。我的预测集通常有大约 50k 行。

我的数据集严重不平衡(大约 2% 的目标特征发生率),所以我使用过采样技术 - 更多内容如下。

方法

我在网上搜索了很多,这导致我采用以下方法:

  • 在训练数据中获取可缩放(连续)特征并对其进行标准化(目前使用 sklearn StandardScaler)
  • 获取分类特征并使用 Pandas get_dummies 函数将它们编码为单独的二进制列(one-hot)
  • 删除 10% 的训练数据以形成验证集(我目前在此过程中使用随机种子来进行可比性,同时我改变了不同的东西,例如模型中的超参数)
  • 获取剩余 90% 的训练数据,并在 RandomForestClassifier() 的几个参数(当前为 min_samples_split、max_depth、n_estimators 和 max_features)上执行网格搜索
  • 在网格中的每个超参数组合中,我使用 5 折并使用随机状态执行 kfold 验证
  • 在每个折叠中,我仅对少数类进行过度采样以用于训练数据(有时使用不平衡学习的 RandomOverSampler(),有时使用同一包中的 SMOTE()),在训练数据上训练模型,然后将模型应用于第 k 折叠和记录性能指标(精度、召回率、F1 和 AUC)
  • 一旦我对每个超参数组合进行了 5 次折叠,我就会找到最好的 F1 分数(如果两个组合与 F1 分数相关,则可以找到最佳精度)并使用这些超参数在整个 90% 的训练数据上重新训练一个随机森林。在这一步中,我使用了与 kfold 过程中相同的过采样技术
  • 然后我使用这个模型对我之前作为验证集搁置的 10% 的训练数据进行预测,评估与上述相同的指标
  • 最后我有一个测试集,它实际上是基于另一个月的数据,我将已经训练好的模型应用于并评估相同的指标

结果

目前我发现我的训练集的 F1 分数约为 30%,而验证集的 F1 分数始终略高于 36% 左右(主要是由于比训练数据更好的精度,例如 60% vs. 30%)然后测试集的 F1 分数在 45% 到 50% 之间,这又是由更好的精度(大约 65%)驱动的

笔记

请询问我未提及的任何细节;我已经坚持了好几个星期了,所以无疑省略了一些细节

  • 我对 kfold 验证中折叠之间的指标稳定性进行了简要介绍(不是系统分析),看起来它们变化不大,所以我对这里模型的稳定性感到相当满意
  • 我实际上是手动执行网格搜索而不是使用 Python 管道,因为我可能无法让不平衡学习的管道函数与过采样函数一起使用,所以我运行一个包含超参数组合的循环,但是我我相信这不会以不利的方式影响我上面谈到的结果
  • 当我将最终模型应用于预测数据(并获得大约 45% 的 F1 分数)时,我也会出于兴趣将其应用回训练数据本身,并获得大约 90% - 100% 的 F1 分数。我想这是可以预料的,因为模型经过训练并预测几乎完全相同的数据(除了 10% 的保留验证集)
0 投票
1 回答
128 浏览

numpy - LeavePGroupsOut 用于多维数组

我正在研究一个研究问题,并且由于包含主题的小型数据集,我正在尝试实施 Leave N Out 样式分析。

目前我正在做这个临时的,我偶然发现了 scikit-learn LeavePGroupsOut 函数。

我阅读了文档,但无法理解如何在多维数组中使用它。

我的数据如下:我有 50 个主题,每个主题大约 20 个条目(不固定)和每个条目的 20 个特征,每个条目的真实值(0 或 1)。

0 投票
0 回答
94 浏览

python - 实施 K 折交叉验证,我得到这个错误 TypeError: If no score is specified, the estimator passed should have a 'score' method

我有这段代码可以构建模型并对其进行训练。

所以我训练了 9000 张图像,如下所示,但正如你所看到的,有一些泛化的迹象,我想如果不是,请纠正我

在此处输入图像描述

但无论如何,我试图实现 K 折交叉验证.. 我猜有很多不同的方法可以做到这一点,但我采用了这种方法,因为我认为这将是最简单的..

我已经实现了其他做 K-Fold 的方法,但我一直收到这个错误

如果有人知道如何解决这个问题,请帮忙..谢谢!

0 投票
1 回答
648 浏览

python - 如何在没有滑雪套件学习的情况下为 K 折交叉验证创建训练集?

我有一个包含 95 行和 9 列的数据集,并且想要进行 5 折交叉验证。在训练中,前 8 列(特征)用于预测第 9 列。我的测试集是正确的,但是当它应该只有 8 列时,我的 x 训练集的大小为 (4,19,9),而当它应该有 19 行时,我的 y 训练集的大小为 (4,9)。我是否错误地索引了子数组?

0 投票
1 回答
127 浏览

r - Tidymodels imputation within each fold

When using caret with CV, imputation estimation /etc will happen in each fold as not to leak. I am trying to find whether this happens in the tidymodels workflow.

Logically I don't think so as you pipe a baked (already applied steps) into the vfold_cv... but I may br wrong.

I could build a workflow that creates folds first, but wondering if im missing something. Thanks

0 投票
2 回答
60 浏览

python - 如何打印出拆分的索引?

所以我有一些 8 列和多行的数据,我想用 5 个拆分执行 K-Fold 拆分。我已经做到了,但是我现在要做的是对于每个拆分,打印出它所在的拆分编号。请参阅代码以获得更好的解释。

所以它说print('Split # ????')的就是我遇到问题的地方。为了获得以下输出,我应该写什么:

0 投票
0 回答
145 浏览

python - 当 `colsample_bytree` 不是 1 时,xgb.cv 的 auc 分数与 cross_val_score 不匹配

我正在研究高度不平衡的数据集。在超参数调优过程中,我发现如果colssample_bytree设置为 1 以外的值,那么cross_val_score从 sklearn 包中获取的 auc 分数与从xgb.cv.

xgb.cv 代码:

这导致 test-auc-mean 为 0.91706

cross_val_score 代码:

这导致 test-auc-mean 为 0.8994

我不明白这些之间的巨大差异,正如我已经指出的那样,如果colsample_bytree设置为 1,那么分数之间没有差异。随着我们减少,分数之间的差异auc也会显着增加colsample_bytree

有人可以帮助我理解为什么会这样。谢谢

0 投票
1 回答
509 浏览

python - 使用 scikit-learn 运行 k-fold 后如何访问数据集?

我正在尝试应用 kfold 方法,但我不知道如何访问生成的训练和测试集。在浏览了几个博客和 scikitlearn 用户指南之后,人们唯一要做的就是打印训练和测试集。这可能适用于小型数据帧,但对于较大的数据帧则没有用。谁能帮我?

我正在使用的数据:https ://github.com/ageron/handson-ml/tree/master/datasets/housing

我目前在哪里:

但这仅对生成最后一个数据集有用。我应该能够得到所有。

提前致谢。