Skip to content

Commit a0bfb5b

Browse files
hannahileaSimonDanischericphanson
authored
Allow missing expert curves in discrimination calibration curve plot (#95)
* fix plotting when no expert discrimination curves * fix plot setup * undo excess lint * Update src/plotting.jl Co-authored-by: Eric Hanson <5846501+ericphanson@users.noreply.github.com> * plot discrimination plots in isolation too * flip test order for unique plots Co-authored-by: Simon <sdanisch@protonmail.com> Co-authored-by: Eric Hanson <5846501+ericphanson@users.noreply.github.com>
1 parent 32c6336 commit a0bfb5b

File tree

3 files changed

+44
-11
lines changed

3 files changed

+44
-11
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "Lighthouse"
22
uuid = "ac2c24cd-07f0-4848-96b2-1b82c3ea0e59"
33
authors = ["Beacon Biosignals, Inc."]
4-
version = "0.14.15"
4+
version = "0.14.16"
55

66
[deps]
77
ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"

src/plotting.jl

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,14 @@ function set_from_kw!(theme, key, kw, default)
141141
end
142142

143143
function plot_binary_discrimination_calibration_curves!(subfig::FigurePosition,
144-
calibration_curve::SeriesCurves, calibration_score,
145-
per_expert_calibration_curves::SeriesCurves,
146-
per_expert_calibration_scores, optimal_threshold,
147-
discrimination_class::AbstractString; kw...)
144+
calibration_curve::SeriesCurves,
145+
calibration_score,
146+
per_expert_calibration_curves::Union{SeriesCurves,
147+
Missing},
148+
per_expert_calibration_scores,
149+
optimal_threshold,
150+
discrimination_class::AbstractString;
151+
kw...)
148152
kw = values(kw)
149153
scatter_theme = get_theme(subfig, :BinaryDiscriminationCalibrationCurves, :Scatter; strokewidth=0)
150154
# Hayaah, this theme merging is getting out of hand
@@ -154,12 +158,18 @@ function plot_binary_discrimination_calibration_curves!(subfig::FigurePosition,
154158
set_from_kw!(scatter_theme, :makersize, kw, 5)
155159
set_from_kw!(scatter_theme, :marker, kw, :rect)
156160

157-
per_expert = get_theme(subfig, :BinaryDiscriminationCalibrationCurves, :PerExpert; solid_color=:darkgrey,
158-
color=nothing)
159-
set_from_kw!(per_expert, :linewidth, kw, 2)
160-
ax = series_plot!(subfig, per_expert_calibration_curves, nothing; legend=nothing,
161-
title="Detection calibration", xlabel="Expert agreement rate",
162-
ylabel="Predicted positive probability", scatter=scatter_theme, per_expert...)
161+
if ismissing(per_expert_calibration_curves)
162+
ax = Axis(subfig; title="Detection calibration", xlabel="Expert agreement rate",
163+
ylabel="Predicted positive probability")
164+
else
165+
per_expert = get_theme(subfig, :BinaryDiscriminationCalibrationCurves, :PerExpert;
166+
solid_color=:darkgrey, color=nothing)
167+
set_from_kw!(per_expert, :linewidth, kw, 2)
168+
ax = series_plot!(subfig, per_expert_calibration_curves, nothing; legend=nothing,
169+
title="Detection calibration", xlabel="Expert agreement rate",
170+
ylabel="Predicted positive probability", scatter=scatter_theme,
171+
per_expert...)
172+
end
163173

164174
calibration = get_theme(subfig, :BinaryDiscriminationCalibrationCurves, :CalibrationCurve;
165175
solid_color=:navyblue, markerstrokewidth=0)

test/learn.jl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,11 +296,34 @@ end
296296
@test !isequal(thresh_from_roc, thresh_from_calibration)
297297
@test isequal(thresh_from_calibration, plot_data_2["optimal_threshold"])
298298

299+
# Also, let's make sure we get an isolated discrimination plots
300+
discrimination_cal = Lighthouse.plot_binary_discrimination_calibration_curves(plot_data_1["discrimination_calibration_curve"],
301+
plot_data_1["discrimination_calibration_score"],
302+
plot_data_1["per_expert_discrimination_calibration_curves"],
303+
plot_data_1["per_expert_discrimination_calibration_scores"],
304+
plot_data_1["optimal_threshold"],
305+
plot_data_1["class_labels"][plot_data_1["optimal_threshold_class"]])
306+
@testplot discrimination_cal
307+
308+
discrimination_cal_no_experts = Lighthouse.plot_binary_discrimination_calibration_curves(plot_data_1["discrimination_calibration_curve"],
309+
plot_data_1["discrimination_calibration_score"],
310+
missing,
311+
missing,
312+
plot_data_1["optimal_threshold"],
313+
plot_data_1["class_labels"][plot_data_1["optimal_threshold_class"]])
314+
315+
# Test binary discrimination with no multiclass votes
316+
plot_data_1["per_expert_discrimination_calibration_curves"] = missing
317+
no_expert_calibration = evaluation_metrics_plot(EvaluationRow(plot_data_1))
318+
@testplot no_expert_calibration
319+
299320
# Test that plotting succeeds (no specialization relative to the multi-class tests)
300321
plot_data = last(logger.logged["validation_set_evaluation/metrics_per_epoch"])
301322
all_together = evaluation_metrics_plot(plot_data)
302323
#savefig(all_together, "/tmp/binary.png")
303324
@testplot all_together
325+
326+
@testplot discrimination_cal_no_experts
304327
end
305328
end
306329

0 commit comments

Comments
 (0)