Report fidelity pilot covariate shift
This commit is contained in:
@@ -121,6 +121,45 @@ def predict_model(
|
|||||||
return _sigmoid(matrix @ model["weights"])
|
return _sigmoid(matrix @ model["weights"])
|
||||||
|
|
||||||
|
|
||||||
|
def covariate_shift(
|
||||||
|
training_examples: list[PrefixExample],
|
||||||
|
training_simulator: list[tuple[float, ...]],
|
||||||
|
pilot_examples: list[PrefixExample],
|
||||||
|
pilot_simulator: list[tuple[float, ...]],
|
||||||
|
*,
|
||||||
|
instrumentation_aware: bool,
|
||||||
|
) -> dict[str, Any]:
|
||||||
|
def matrix(
|
||||||
|
examples: list[PrefixExample], simulator: list[tuple[float, ...]]
|
||||||
|
) -> np.ndarray:
|
||||||
|
rows = []
|
||||||
|
for example, simulator_features in zip(examples, simulator):
|
||||||
|
values = example.outcome + simulator_features
|
||||||
|
if instrumentation_aware:
|
||||||
|
values += example.instrumentation
|
||||||
|
rows.append(values)
|
||||||
|
return np.asarray(rows, dtype=np.float64)
|
||||||
|
|
||||||
|
training = matrix(training_examples, training_simulator)
|
||||||
|
pilot = matrix(pilot_examples, pilot_simulator)
|
||||||
|
mean = training.mean(axis=0)
|
||||||
|
standard_deviation = training.std(axis=0)
|
||||||
|
standard_deviation[standard_deviation < 1e-8] = 1.0
|
||||||
|
absolute_z = np.abs((pilot - mean) / standard_deviation)
|
||||||
|
names = [*OUTCOME_FEATURES, *SIMULATOR_FEATURES]
|
||||||
|
if instrumentation_aware:
|
||||||
|
names.extend(INSTRUMENTATION_FEATURES)
|
||||||
|
return {
|
||||||
|
"values": numeric(absolute_z.ravel().tolist()),
|
||||||
|
"count_gt_3": int(np.sum(absolute_z > 3.0)),
|
||||||
|
"count_gt_5": int(np.sum(absolute_z > 5.0)),
|
||||||
|
"total_feature_values": int(absolute_z.size),
|
||||||
|
"per_feature_max_abs_z": {
|
||||||
|
name: float(value) for name, value in zip(names, absolute_z.max(axis=0))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def comparison(
|
def comparison(
|
||||||
training_examples: list[PrefixExample],
|
training_examples: list[PrefixExample],
|
||||||
training_simulator: list[tuple[float, ...]],
|
training_simulator: list[tuple[float, ...]],
|
||||||
@@ -238,6 +277,22 @@ def analyze(
|
|||||||
red_flags.append("pilot_single_label")
|
red_flags.append("pilot_single_label")
|
||||||
if len(set(simulator_pass_rates)) <= 1:
|
if len(set(simulator_pass_rates)) <= 1:
|
||||||
red_flags.append("pilot_simulator_results_identical")
|
red_flags.append("pilot_simulator_results_identical")
|
||||||
|
covariate_diagnostics = {
|
||||||
|
"sim_plus_outcome": covariate_shift(
|
||||||
|
training_examples,
|
||||||
|
training_simulator,
|
||||||
|
pilot_examples,
|
||||||
|
pilot_simulator,
|
||||||
|
instrumentation_aware=False,
|
||||||
|
),
|
||||||
|
"sim_plus_outcome_plus_instrumentation": covariate_shift(
|
||||||
|
training_examples,
|
||||||
|
training_simulator,
|
||||||
|
pilot_examples,
|
||||||
|
pilot_simulator,
|
||||||
|
instrumentation_aware=True,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
if headline is None:
|
if headline is None:
|
||||||
decision = {
|
decision = {
|
||||||
@@ -321,6 +376,7 @@ def analyze(
|
|||||||
}
|
}
|
||||||
for detail, simulator in zip(pilot_details, pilot_simulator)
|
for detail, simulator in zip(pilot_details, pilot_simulator)
|
||||||
],
|
],
|
||||||
|
"covariate_shift_diagnostic": covariate_diagnostics,
|
||||||
"decision": decision,
|
"decision": decision,
|
||||||
"provenance": {
|
"provenance": {
|
||||||
"phase6_metrics": str(phase6_path.resolve()),
|
"phase6_metrics": str(phase6_path.resolve()),
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from analyze_prefixes import PrefixExample
|
|||||||
from prepare_pilot_simulator import load_module as load_prepare_module
|
from prepare_pilot_simulator import load_module as load_prepare_module
|
||||||
from run_pilot_simulator import load_module as load_run_module
|
from run_pilot_simulator import load_module as load_run_module
|
||||||
from analyze_strong_pilot import (
|
from analyze_strong_pilot import (
|
||||||
|
covariate_shift,
|
||||||
fit_model,
|
fit_model,
|
||||||
load_pilot_simulator,
|
load_pilot_simulator,
|
||||||
predict_model,
|
predict_model,
|
||||||
@@ -46,6 +47,15 @@ def main() -> None:
|
|||||||
probability = predict_model(model, examples, simulator)
|
probability = predict_model(model, examples, simulator)
|
||||||
assert probability.shape == (8,)
|
assert probability.shape == (8,)
|
||||||
assert np.all((probability >= 0.0) & (probability <= 1.0))
|
assert np.all((probability >= 0.0) & (probability <= 1.0))
|
||||||
|
shift = covariate_shift(
|
||||||
|
examples,
|
||||||
|
simulator,
|
||||||
|
examples,
|
||||||
|
simulator,
|
||||||
|
instrumentation_aware=instrumentation_aware,
|
||||||
|
)
|
||||||
|
assert shift["values"]["min"] >= 0.0
|
||||||
|
assert shift["count_gt_3"] == 0
|
||||||
|
|
||||||
payload = {
|
payload = {
|
||||||
"status": "PASS",
|
"status": "PASS",
|
||||||
|
|||||||
Reference in New Issue
Block a user