needs some clean up + smoothing, check out sklearn neg_prob?