@@ -330,8 +330,8 @@ def dual_density_plot(
330330 preds_on_negative = [
331331 probs [i ] for i in range (len (probs )) if not istrue [i ] == truth_target
332332 ]
333- seaborn .kdeplot (preds_on_positive , label = positive_label , shade = True )
334- seaborn .kdeplot (preds_on_negative , label = negative_label , shade = True )
333+ seaborn .kdeplot (preds_on_positive , label = positive_label , fill = True )
334+ seaborn .kdeplot (preds_on_negative , label = negative_label , fill = True )
335335 matplotlib .pyplot .ylabel (ylabel )
336336 matplotlib .pyplot .xlabel (xlabel )
337337 matplotlib .pyplot .title (title )
@@ -427,8 +427,8 @@ def dual_density_plot_proba1(
427427 preds_on_negative = [
428428 probs [i , 1 ] for i in range (len (probs )) if not istrue [i ] == truth_target
429429 ]
430- seaborn .kdeplot (preds_on_positive , label = positive_label , shade = True )
431- seaborn .kdeplot (preds_on_negative , label = negative_label , shade = True )
430+ seaborn .kdeplot (preds_on_positive , label = positive_label , fill = True )
431+ seaborn .kdeplot (preds_on_negative , label = negative_label , fill = True )
432432 matplotlib .pyplot .ylabel (ylabel )
433433 matplotlib .pyplot .xlabel (xlabel )
434434 matplotlib .pyplot .title (title )
@@ -722,7 +722,6 @@ def threshold_statistics(
722722 sorted_frame ["notY" ] = 1 - sorted_frame ["truth" ] # falses
723723 sorted_frame ["one" ] = 1
724724 del sorted_frame ["orig_index" ]
725-
726725 # pseudo-observation to get end-case (accept nothing case)
727726 eps = 1.0e-6
728727 sorted_frame = pandas .concat (
@@ -747,7 +746,6 @@ def threshold_statistics(
747746 ]
748747 )
749748 sorted_frame .reset_index (inplace = True , drop = True )
750-
751749 # basic cumulative facts
752750 sorted_frame ["count" ] = sorted_frame ["one" ].cumsum () # predicted true so far
753751 sorted_frame ["fraction" ] = sorted_frame ["count" ] / max (1 , sorted_frame ["one" ].sum ())
@@ -771,25 +769,28 @@ def threshold_statistics(
771769 + sorted_frame ["notY" ].sum ()
772770 - sorted_frame ["notY" ].cumsum () # true negative count
773771 ) / sorted_frame ["one" ].sum ()
774-
775772 # approximate cdf work
776773 sorted_frame ["cdf" ] = 1 - sorted_frame ["fraction" ]
777-
778774 # derived facts and synonyms
779775 sorted_frame ["recall" ] = sorted_frame ["true_positive_rate" ]
780776 sorted_frame ["sensitivity" ] = sorted_frame ["recall" ]
781777 sorted_frame ["specificity" ] = 1 - sorted_frame ["false_positive_rate" ]
782-
783778 # re-order for neatness
784779 sorted_frame ["new_index" ] = sorted_frame .index .copy ()
785780 sorted_frame .sort_values (["new_index" ], ascending = [False ], inplace = True )
786781 sorted_frame .reset_index (inplace = True , drop = True )
787-
788782 # clean up
789783 del sorted_frame ["notY" ]
790784 del sorted_frame ["one" ]
791785 del sorted_frame ["new_index" ]
792786 del sorted_frame ["truth" ]
787+ # limit down to last version of each threshold
788+ if sorted_frame .shape [0 ] > 1 :
789+ want_row = [True ] + list (
790+ numpy .array (sorted_frame ["threshold" ][range (sorted_frame .shape [0 ]- 1 )])
791+ != numpy .array (sorted_frame ["threshold" ][range (1 , sorted_frame .shape [0 ])])
792+ )
793+ sorted_frame = sorted_frame .loc [want_row , :].reset_index (drop = True , inplace = False )
793794 return sorted_frame
794795
795796
@@ -874,7 +875,9 @@ def threshold_plot(
874875 pandas .DataFrame ({"measure" : plotvars , "value" : plotvars }),
875876 control_table_keys = ["measure" ],
876877 record_keys = ["threshold" ],
877- )
878+ strict = False ,
879+ ),
880+ strict = False ,
878881 )
879882 prtlong = reshaper .transform (to_plot )
880883 grid = seaborn .FacetGrid (
0 commit comments