machine-learning - 对训练或验证分区执行交叉验证以调整参数

标签 machine-learning svm cross-validation training-data

我有一个大型数据集,它分为三个 block (训练-验证-测试)。我想执行交叉验证(CV),因为我有一个很大的数据集,对整个数据集执行 CV 需要很长时间。执行 CV 的正确分区是什么?我见过仅使用训练分割的教程,其他教程仅使用验证分割,而其他教程则使用整个数据集。

感谢您的任何澄清或帮助。

最佳答案

为了简化事情,我们假设您只有一个超参数。如果您想进行交叉验证,您可以选择 N 个不同的超参数值,并在训练集上训练 N 个不同的模型。然后,您可以选择在验证集上具有最佳性能的超参数。然后,您可以使用所选超参数的训练集和验证集重新训练模型。然后在测试集上评估模型性能。

如果您的数据集很大,您可以选择一个小子集,找到最佳超参数并继续增加子集,直到您可以推断出在完整数据集大小下最佳超参数是什么。在实践中,您通常可以选择尽可能大的子集,而只需使用该子集的最佳超参数即可。

编辑:

如果您使用 scikit-learn,这里是带有超参数 C 的假设模型的伪代码:

from sklearn.model_selection import GridSearchCV

# X_train, X_test are the train and test features
# Y_train, Y_test are the corresponding labels/values to predict.
# model is some scikit-learn regression or classification model

# Create a parameter grid
param_grid = {'C': [0.1, 1, 5, 15, 100]}

# Do two fold CV. You can do other types of CV as well by passing
# a cross-validation generator
estimator = GridSearchCV(model, cv=2, param_grid=param_grid)
# Do the cross validation procedure explained below
estimator.fit(X_train, Y_train)

运行 fit 方法时会发生的情况是将训练集 (X_train, Y_train) 分成两部分。然后,您使用前半部分数据通过 C=0.1 训练模型,并对后半部分的性能进行评分。在这种情况下,前半部分是训练集,后半部分是验证集。然后重复该过程,但使用后半部分作为训练集,前半部分作为验证集。然后对性能进行平均并存储。

然后,您可以对 C 的其余值重复此过程。然后检查哪个 C 值可以提供最佳的预测精度。然后使用该值使用整个训练集(X_train, Y_train)来训练最终模型。然后可以在留下的测试集上评估模型性能:

score = estimator.score(X_test, Y_test)

关于machine-learning - 对训练或验证分区执行交叉验证以调整参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52493677/

相关文章:

machine-learning - 交叉验证中的平衡类

matlab - 使用交叉验证的 KNN 分类器

opencv - 使用 Haar Cascade 的正负图像的大小

python - Keras 嵌入层 : how do they work?

python - 属性错误: 'module' object has no attribute 'io' in caffe

Azure 机器学习工作室表示交叉验证模块的值为 "Value Required"

Python 一种热向量编码

python - 如何使用热门单词创建特征向量(scikit-learn 中的特征选择)

python - python 中 libsvm 的文档

python - 我需要在 SVM 中计算预测时间的历史记录吗?