【问题标题】:Plot f1 for a specific class with sklearn's learning_curve() rather than the weighted f1 scores使用 sklearn 的 learning_curve() 而不是加权 f1 分数为特定类绘制 f1
【发布时间】:2019-09-01 11:22:30
【问题描述】:

在布尔监督分类器上使用sklearn.model_selection.learning_curve() 绘制学习曲线时,默认显示加权 f1 分数。

但我想绘制特定班级的 f1 分数。在本例中为正(又名:1)类。

在下面的上下文中(来自sklearn.metrics.classification_report),它绘制avg / total,但我想绘制1类的指标。

情节

代码

...
estimator = classifier_class()
cv = ShuffleSplit(n_splits=10, test_size=0.2, random_state=0)
train_sizes, train_scores, test_scores = learning_curve(estimator, X_recombined, y_recombined, cv=cv) # n_jobs=n_jobs, train_sizes=train_sizes

train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)
plt.grid()

plt.fill_between(train_sizes, 
                 train_scores_mean - train_scores_std,
                 train_scores_mean + train_scores_std, 
                 alpha=0.1, color="r")

plt.fill_between(train_sizes, 
                 test_scores_mean - test_scores_std,
                 test_scores_mean + test_scores_std, 
                 alpha=0.1, color="g")

plt.plot(train_sizes, train_scores_mean, 'o-', color="r", label="Training score")

plt.plot(train_sizes, test_scores_mean, 'o-', color="g", label="Cross-validation score")

plt.legend(loc="best")

这可能吗?

【问题讨论】:

    标签: python matplotlib scikit-learn


    【解决方案1】:

    对于二元分类

    您可以使用scoring 参数将自定义记分器设置为learning_curve。来自文档:

    评分:字符串,可调用或无,可选,默认:无

    一个字符串(参见模型评估文档)或带有签名 scorer(estimator, X, y) 的 scorer 可调用对象/函数。

    另外,sklearn.metrics.f1_score 函数文档说:

    pos_label : str 或 int,默认为 1

    如果要报告的类 average='binary' 并且数据是二进制的。如果数据是多类或 多标签,这将被忽略;设置标签=[pos_label] 和 average != 'binary' 将仅报告该标签的分数。

    average : string, [None, ‘binary’ (默认), ‘micro’, ‘macro’, ‘样本’,‘加权’]

    此参数是必需的 多类/多标签目标。如果没有,每个班级的分数是 回来。否则,这将确定执行的平均类型 关于数据:

    'binary': 只报告 pos_label 指定的类的结果。 这仅适用于目标 (y_{true,pred}) 是二进制的。

    因此,您可以这样做:

    from sklearn.model_selection import learning_curve
    from sklearn.metrics import f1_score, make_scorer
    
    # Custom scorer
    target = 0 # class you want to plot
    scorer = make_scorer(lambda y_true, y_pred: f1_score(
        y_true, y_pred, 
        labels=None, 
        pos_label=target, 
        average='binary', 
        sample_weight=None))
    
    train_sizes, train_scores, test_scores = learning_curve(
        estimator, 
        X, 
        y, 
        cv=cv,
        scoring=scorer)
    

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 2020-05-04
      • 2017-05-07
      • 2017-09-11
      • 2018-07-16
      • 2016-01-24
      • 2019-11-14
      • 2017-05-28
      • 2017-11-07
      相关资源
      最近更新 更多