【问题标题】:F1 score for multiclass labeling cross validation多类标签交叉验证的 F1 分数
【发布时间】:2020-08-21 17:56:15
【问题描述】:

我想获得每个班级(我有 4 个班级)和每个交叉验证折叠的 F1 分数。 clf 是我训练的模型, X_test 是特征, y_test 是测试集的标签。由于我正在进行 5 折交叉验证,因此我应该在第一折中为每个班级获得 4 个 F1 分数,在第二折中获得 4 个……总共 20 个。我可以在 python 中以简单的方式做到这一点吗?

以下行将为我提供所有类的平均 F1,每个折叠只有 5 个值。我检查了 cross_val_score (https://scikit-learn.org/stable/modules/model_evaluation.html) 中变量 scoring 的选项,似乎我无法在每个折叠中获得每个班级的 F1 分数(或者我可能在某个地方迷路了)。

scores = cross_val_score(clf, X_test, y_test, cv=5, scoring='f1_macro')

【问题讨论】:

    标签: python cross-validation multilabel-classification


    【解决方案1】:

    好的,我找到了解决方案。 X 是我的特征数据框,y 是标签。 f1_score(y_test, y_pred, average=None)给出每个班级的 F1 分数,没有汇总。所以每次折叠,我们都会训练模型并在测试集上进行尝试。

    from sklearn.model_selection import KFold
    cv = KFold(n_splits=5, shuffle=False) 
    for train_index, test_index in cv.split(X):
            X_train, X_test = X.iloc[train_index], X.iloc[test_index]
            y_train, y_test = y.iloc[train_index], y.iloc[test_index]
            clf = clf.fit(X_train, y_train)
            y_pred = clf.predict(X_test)
            print(f1_score(y_test, y_pred, average=None))
    

    那么,结果将是:

    [0.99320793 0.79749478 0.34782609 0.44243792]
    [0.99352309 0.82583622 0.34615385 0.48873874]
    [0.99294785 0.78794403 0.28571429 0.42403628]
    [0.99324611 0.79236813 0.31654676 0.43778802]
    [0.99327615 0.79136691 0.32704403 0.42410197]
    

    其中每一行都有每个折叠的 F1 分数,每个值代表每个类别的 F1 分数。

    如果有更短和更简单的解决方案,请随时发布。

    【讨论】:

      猜你喜欢
      • 2015-07-07
      • 2018-11-07
      • 2018-03-26
      • 2015-03-25
      • 2019-11-14
      • 2021-05-12
      • 2016-04-27
      • 2016-10-17
      • 2016-03-10
      相关资源
      最近更新 更多