交叉验证和分数

Posted

技术标签:

【中文标题】交叉验证和分数【英文标题】:Cross-validation and scores 【发布时间】:2021-08-05 16:35:11 【问题描述】:

在调整模型的超参数时,我正在使用训练数据集(即 X_train、y_train)。我需要使用测试数据集(即 X_test、y_test)作为最终检查,以确保我的模型没有偏差。 我写了

folds = 4

X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=(1/folds), random_state=38, stratify=y)

clf_logreg = Pipeline(steps=[('preprocessor', preprocessing),
                      ('model', LogisticRegression(solver='lbfgs', max_iter=100))])


cv = KFold(n_splits=(folds - 1))
scores_logreg = cross_val_score(clf_logreg, X_train, y_train, cv = cv)

并且,要获得 f1 分数,

cross_val_score(clf_logreg, X_train, y_train, scoring=make_scorer(f1_score, average='weighted'),
    cv=cv)

返回

scores_logreg: [0.94422311, 0.99335548, 0.97209302] 对于 f1:[0.97201365, 0.9926906 , 0.98925453]

为了检查测试,写对吗

cross_val_score(clf_logreg, X_test, y_test, scoring=make_scorer(f1_score, average='weighted'), cv=cv) # not sure if it is ok to let cv

或许

predicted_logreg= clf_logreg.predict(X_test)
f1 = f1_score(y_test, predicted_logreg)

返回的值不同。

【问题讨论】:

你试过在sklearn.metrics中使用classification_report吗? 【参考方案1】:

cross_val_score 用于通过交叉验证对模型进行评分,如果您这样做:

cross_val_score(clf_logreg, X_test, y_test, 
scoring=make_scorer(f1_score, average='weighted'), cv=cv)

您正在对您的测试集重新进行交叉验证,这没有多大意义,除了您现在在比您的火车更小的数据集上训练您的模型。

我认为 scikit learn 上的 help page on cross validation 说明了这一点,您无需在测试集上重新运行交叉验证:

你只要这样做:

predicted_logreg= clf_logreg.predict(X_test)
f1 = f1_score(y_test, predicted_logreg)

【讨论】:

谢谢@StupidWolf。如果我理解正确,正确的值应该来自您提到的最后一个代码(predicted_logreg 和 f1),不是吗?

以上是关于交叉验证和分数的主要内容,如果未能解决你的问题,请参考以下文章

sklearn - 具有多个分数的交叉验证

使用交叉验证和 F1 分数选择 SVM 参数

split_test_train 和交叉验证之间的分数差异很大 (10%)

在使用 5 折交叉验证时,在高度不平衡的数据中混淆 F1 分数和 AUC 分数

回归中的 scikit-learn 交叉验证分数

sklearn 交叉验证 R^2 分数与使用训练模型对训练和验证数据进行的手动检查不匹配