【问题标题】:How to integrate G-mean in cross_validate sklearn function?如何在 cross_validate sklearn 函数中集成 G-mean?
【发布时间】:2021-06-29 09:53:16
【问题描述】:
from sklearn.model_selection import cross_validate
scores = cross_validate(LogisticRegression(class_weight='balanced',max_iter=100000),
                        X,y, cv=5, scoring=('roc_auc', 'average_precision','f1','recall','balanced_accuracy'))
scores['test_roc_auc'].mean(), scores['test_average_precision'].mean(),scores['test_f1'].mean(),scores['test_recall'].mean(),scores['test_balanced_accuracy'].mean()

如何在上述交叉验证评分参数下计算以下 G-mean:

from imblearn.metrics import geometric_mean_score
print('The geometric mean is {}'.format(geometric_mean_score(y_test, y_test_pred)))

from sklearn.metrics import accuracy_score
g_mean = 1.0
    #
for label in np.unique(y_test):
    idx = (y_test == label)
    g_mean *= accuracy_score(y_test[idx], y_test_pred[idx])
    #
g_mean = np.sqrt(g_mean)
score = g_mean
print(score)

【问题讨论】:

    标签: python machine-learning scikit-learn classification


    【解决方案1】:

    只需将其作为自定义记分器传递

    from sklearn.metrics import make_scorer
    from imblearn.metrics import geometric_mean_score
    
    gm_scorer = make_scorer(geometric_mean_score, greater_is_better=True, average='binary')
    

    greater_is_better=True 设置为最佳值更接近1。geometrics_mean_score 的其他参数可以直接传递给make_scorer

    完整示例

    from sklearn.model_selection import cross_validate
    from sklearn.metrics import make_scorer
    from sklearn.datasets import load_breast_cancer
    from sklearn.linear_model import LogisticRegression
    from imblearn.metrics import geometric_mean_score
    
    X, y = load_breast_cancer(return_X_y=True)
    
    gm_scorer = make_scorer(geometric_mean_score, greater_is_better=True)
    
    scores = cross_validate(
        LogisticRegression(class_weight='balanced',max_iter=100000),
        X,y, 
        cv=5, 
        scoring=gm_scorer
    )
    scores
    >>>
    {'fit_time': array([0.76488066, 0.69808364, 1.22158527, 0.94157672, 1.01577377]),
     'score_time': array([0.00103951, 0.00100923, 0.00065804, 0.00071168, 0.00068736]),
     'test_score': array([0.91499142, 0.93884403, 0.9860133 , 0.92439026, 0.9525989 ])}
    

    编辑

    要指定多个指标,请将字典传递给scoring 参数

    scores = cross_validate(
        LogisticRegression(class_weight='balanced',max_iter=100000),
        X,y, 
        cv=5, 
        scoring={'gm_scorer': gm_scorer, 'AUC': 'roc_auc', 'Avg_Precision': 'average_precision'}
    )
    scores
    >>>
    {'fit_time': array([1.03509665, 0.96399784, 1.49760461, 1.13874388, 1.32006526]),
     'score_time': array([0.00560617, 0.00357151, 0.0057447 , 0.00566769, 0.00549698]),
     'test_gm_scorer': array([0.91499142, 0.93884403, 0.9860133 , 0.92439026, 0.9525989 ]),
     'test_AUC': array([0.99443171, 0.99344907, 0.99801587, 0.97949735, 0.99765258]),
     'test_Avg_Precision': array([0.99670544, 0.99623085, 0.99893162, 0.98640759, 0.99861043])}
    

    【讨论】:

    • 你为什么使用average='binary'?另外,是否可以将 'roc_auc'、'average_precision' 与 gm_scorer 一起使用?我尝试使用 score=('gm_scorer', 'roc_auc', 'average_precision'),但没有成功!
    • @ForestGump 是的,您可以通过字典将多个指标(其中一个是自定义函数)传递给scoring
    【解决方案2】:

    您需要创建一个自定义记分器,这是一个示例:https://stackoverflow.com/a/53850851/12384070 然后,如果它是您想要的唯一得分手,您可以这样做:

    scores = cross_validate(LogisticRegression(class_weight='balanced',max_iter=100000),
                            X,y, cv=5, scoring=your_custom_function)
    

    我认为您可以使用其他记分器,如文档中所述:

    If scoring reprents multiple scores, one can use:
    
    a list or tuple of unique strings;
    
    a callable returning a dictionary where the keys are the metric names and the values are the metric scores;
    
    a dictionary with metric names as keys and callables a values.
    

    【讨论】:

    • 是否需要在自定义函数参数中传递这个**kwargs?
    • 您的函数定义应如下所示:def geometry_mean_score(y_test, y_pred, **kwargs)。然后你必须通过它来制作得分手:make_scorer(geometric_mean_score)。这将输出您的自定义记分器,您应该可以将其放入 cross_validate 函数中
    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 2017-01-26
    • 2019-12-09
    • 2013-03-23
    • 2017-12-21
    • 2020-12-20
    • 2015-05-13
    • 2017-05-22
    相关资源
    最近更新 更多