In [1]:
import numpy as np

In [2]:
def selectThreshold(pval, yval):  
    
    EPSILON = 0
    F1 = 0
    f1 = 0

    step = ((pval.max() - pval.min()) / 1000).astype(float)

    for epsilon in np.arange(pval.min(), pval.max(), step):
        
        P = pval < epsilon
        tp = np.sum(np.logical_and(P == 1, yval == 1)).astype(float)
        fp = np.sum(np.logical_and(P == 1, yval == 0)).astype(float)
        fn = np.sum(np.logical_and(P == 0, yval == 1)).astype(float)

        prec = ( tp / (tp + fp) ).astype(float)
        rec = ( tp / (tp + fn) ).astype(float)
        f1 = (2 * prec * rec) / (prec + rec)

        if f1 > F1:
            F1 = f1
            EPSILON = epsilon

    return EPSILON, F1