python-3.x - 如何使用带有预定义分割折叠的显式验证集?

标签 python-3.x validation scikit-learn cross-validation train-test-split

我有明确的训练、测试和验证集作为二维数组:

X_train.shape
(1400, 38785)
X_val.shape
(200, 38785)
X_test.shape
(400, 38785)

我正在调整 alpha 参数,需要有关如何使用其中预定义验证集的建议:


from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import GridSearchCV, PredefinedSplit

nb = MultinomialNB()
nb.fit(X_train, y_train)

params = {'alpha': [0.1, 1, 3, 5, 10,12,14]}
# how to use on my validation set?
# ps = PredefinedSplit(test_fold=?)

gs = GridSearchCV(nb, param_grid=params, cv = ps,  return_train_score=True, scoring='f1')

gs.fit(X_train, y_train)

到目前为止我的结果如下。

# on my validation set, alpha = 5
gs.fit(X_val, y_val)
print('Grid best parameter', gs.best_params_)
Grid best parameter:  {'alpha': 5}

# on my training set, alpha = 10
Grid best parameter:  {'alpha': 10}

我已阅读以下问题和文档,但我不确定如何在我的情况下使用 PredefinedSplit() 。谢谢。

Order between using validation, training and test sets

https://scikit-learn.org/stable/modules/cross_validation.html#predefined-fold-splits-validation-sets

最佳答案

您可以通过合并 X_trainX_val 并传递 PredefinedSplit 标签列表来实现您想要的结果,其中 -1 表示训练数据,1 表示验证数据。浏览器,


X = np.concatenate((X_train, X_val))
y = np.concatenate((y_train, y_val))
ps = PredefinedSplit(np.concatenate((np.zeros(len(x_train) - 1, np.ones(len(x_val))))

gs = GridSearchCV(nb, param_grid=params, cv = ps,  return_train_score=True, scoring='f1')

gs.fit(X, y)  # not X_train, y_train

但是,除非有充分的理由支持单独的验证集,否则如果您使用 k 倍交叉验证来调整超参数而不是使用专用的验证集,则可能会减少过度拟合。

关于python-3.x - 如何使用带有预定义分割折叠的显式验证集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71740662/

相关文章:

javascript - Hapi Joi 验证 - 验证单个字符串

javascript - Backbone : my validation is not stopping white space being set to value

scikit-learn - 如何在管道中使用具有关联提取器的多个输入特征?

json - 如何使用 PYTHON 以字典类型而不是字符串类型获取 JSON.loads() 输出

python-3.x - Pandas 样式 applymap 使用 lambda 函数突出显示重复项

python正则表达式从极其复杂的成分字符串中解析数据

python - GridSearchCV 是否执行交叉验证?

python-3.x - 如何按列分组并标准化?

php - 验证错误/边界数据

pandas - 如何使用 scikit LabelEncoder 来创建新标签?