Skip to content

Commit 31f1c80

Browse files
committed
some more improvements
1 parent 14784f8 commit 31f1c80

57 files changed

Lines changed: 1395 additions & 1191 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

mlscorecheck/aggregated/_check_aggregated_scores.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ def check_aggregated_scores(
2727
experiment: dict,
2828
scores: dict,
2929
eps,
30-
solver_name: str = None,
31-
timeout: int = None,
30+
solver_name: str | None = None,
31+
timeout: int | None = None,
3232
verbosity: int = 1,
33-
numerical_tolerance: float = NUMERICAL_TOLERANCE
33+
numerical_tolerance: float = NUMERICAL_TOLERANCE,
3434
) -> dict:
3535
"""
3636
Check aggregated scores
@@ -71,9 +71,7 @@ def check_aggregated_scores(
7171
"message": "no scores suitable for aggregated consistency checks",
7272
}
7373

74-
experiment = (
75-
Experiment(**experiment) if isinstance(experiment, dict) else experiment
76-
)
74+
experiment = Experiment(**experiment) if isinstance(experiment, dict) else experiment
7775

7876
if experiment.aggregation == "som" and any(
7977
evaluation.aggregation == "mos" for evaluation in experiment.evaluations
@@ -85,9 +83,7 @@ def check_aggregated_scores(
8583
)
8684

8785
solver_name = (
88-
PREFERRED_SOLVER
89-
if solver_name is None or solver_name not in solvers
90-
else solver_name
86+
PREFERRED_SOLVER if solver_name is None or solver_name not in solvers else solver_name
9187
)
9288

9389
solver = pl.getSolver(

mlscorecheck/aggregated/_dataset.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""
22
This module implements an abstraction for a dataset
33
"""
4+
45
# disabling pylint false positives
56
# pylint: disable=no-member
67

@@ -17,10 +18,10 @@ class Dataset:
1718

1819
def __init__(
1920
self,
20-
p: int = None,
21-
n: int = None,
22-
dataset_name: str = None,
23-
identifier: str = None,
21+
p: int | None = None,
22+
n: int | None = None,
23+
dataset_name: str | None = None,
24+
identifier: str | None = None,
2425
):
2526
"""
2627
Constructor of a dataset

mlscorecheck/aggregated/_evaluation.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def __init__(
2222
dataset: dict,
2323
folding: dict,
2424
aggregation: str,
25-
fold_score_bounds: dict = None,
25+
fold_score_bounds: dict | None = None,
2626
):
2727
"""
2828
Constructor of the object
@@ -70,7 +70,7 @@ def to_dict(self) -> dict:
7070
"aggregation": self.aggregation,
7171
}
7272

73-
def sample_figures(self, random_state=None, score_subset: list = None):
73+
def sample_figures(self, random_state=None, score_subset: list | None = None):
7474
"""
7575
Samples the figures in the evaluation
7676
@@ -90,7 +90,7 @@ def sample_figures(self, random_state=None, score_subset: list = None):
9090
return self
9191

9292
def calculate_scores(
93-
self, rounding_decimals: int = None, score_subset: list = None
93+
self, rounding_decimals: int | None = None, score_subset: list | None = None
9494
) -> dict:
9595
"""
9696
Calculates the scores
@@ -116,9 +116,7 @@ def calculate_scores(
116116
self.figures["tn"] = sum(fold.tn for fold in self.folds)
117117

118118
if self.aggregation == "som":
119-
self.scores = calculate_scores_for_lp(
120-
self.figures, score_subset=score_subset
121-
)
119+
self.scores = calculate_scores_for_lp(self.figures, score_subset=score_subset)
122120
elif self.aggregation == "mos":
123121
self.scores = dict_mean([fold.scores for fold in self.folds])
124122

@@ -128,7 +126,7 @@ def calculate_scores(
128126
else round_scores(self.scores, rounding_decimals)
129127
)
130128

131-
def init_lp(self, lp_problem: pl.LpProblem, scores: dict = None) -> pl.LpProblem:
129+
def init_lp(self, lp_problem: pl.LpProblem, scores: dict | None = None) -> pl.LpProblem:
132130
"""
133131
Initializes a linear programming problem
134132
@@ -180,7 +178,7 @@ def check_bounds(self, numerical_tolerance: float = NUMERICAL_TOLERANCE) -> dict
180178
dict: a summary of the test, with the boolean flag under ``bounds_flag``
181179
indicating the overall results
182180
"""
183-
results = {"folds": []}
181+
results: dict = {"folds": []}
184182
for fold in self.folds:
185183
tmp = {
186184
"fold": fold.to_dict() | {"tp": fold.tp, "tn": fold.tn},

mlscorecheck/aggregated/_experiment.py

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class Experiment:
1919
"""
2020

2121
def __init__(
22-
self, evaluations: list, aggregation: str, dataset_score_bounds: dict = None
22+
self, evaluations: list, aggregation: str, dataset_score_bounds: dict | None = None
2323
):
2424
"""
2525
Constructor of the experiment
@@ -61,7 +61,7 @@ def to_dict(self) -> dict:
6161
"aggregation": self.aggregation,
6262
}
6363

64-
def sample_figures(self, random_state=None, score_subset: list = None):
64+
def sample_figures(self, random_state=None, score_subset: list | None = None):
6565
"""
6666
Samples the ``tp`` and ``tn`` figures
6767
@@ -81,7 +81,7 @@ def sample_figures(self, random_state=None, score_subset: list = None):
8181
return self
8282

8383
def calculate_scores(
84-
self, rounding_decimals: int = None, score_subset: list = None
84+
self, rounding_decimals: int | None = None, score_subset: list | None = None
8585
) -> dict:
8686
"""
8787
Calculates the scores
@@ -93,12 +93,8 @@ def calculate_scores(
9393
Returns:
9494
dict(str,float): the scores
9595
"""
96-
score_subset = (
97-
["acc", "sens", "spec", "bacc"] if score_subset is None else score_subset
98-
)
99-
score_subset = [
100-
score for score in score_subset if score in ["acc", "sens", "spec", "bacc"]
101-
]
96+
score_subset = ["acc", "sens", "spec", "bacc"] if score_subset is None else score_subset
97+
score_subset = [score for score in score_subset if score in ["acc", "sens", "spec", "bacc"]]
10298

10399
for evaluation in self.evaluations:
104100
evaluation.calculate_scores(score_subset=score_subset)
@@ -111,29 +107,21 @@ def calculate_scores(
111107
evaluation.figures["tn"] for evaluation in self.evaluations
112108
)
113109
else:
114-
self.figures["tp"] = sum(
115-
evaluation.figures["tp"] for evaluation in self.evaluations
116-
)
117-
self.figures["tn"] = sum(
118-
evaluation.figures["tn"] for evaluation in self.evaluations
119-
)
110+
self.figures["tp"] = sum(evaluation.figures["tp"] for evaluation in self.evaluations)
111+
self.figures["tn"] = sum(evaluation.figures["tn"] for evaluation in self.evaluations)
120112

121113
if self.aggregation == "som":
122-
self.scores = calculate_scores_for_lp(
123-
self.figures, score_subset=score_subset
124-
)
114+
self.scores = calculate_scores_for_lp(self.figures, score_subset=score_subset)
125115
elif self.aggregation == "mos":
126-
self.scores = dict_mean(
127-
[evaluation.scores for evaluation in self.evaluations]
128-
)
116+
self.scores = dict_mean([evaluation.scores for evaluation in self.evaluations])
129117

130118
return (
131119
self.scores
132120
if rounding_decimals is None
133121
else round_scores(self.scores, rounding_decimals)
134122
)
135123

136-
def init_lp(self, lp_problem: pl.LpProblem, scores: dict = None) -> pl.LpProblem:
124+
def init_lp(self, lp_problem: pl.LpProblem, scores: dict | None = None) -> pl.LpProblem:
137125
"""
138126
Initializes a linear programming problem
139127
@@ -191,7 +179,7 @@ def check_bounds(self, numerical_tolerance: float = NUMERICAL_TOLERANCE) -> dict
191179
indicating the overall results
192180
"""
193181

194-
results = {"evaluations": []}
182+
results: dict = {"evaluations": []}
195183
for evaluation in self.evaluations:
196184
tmp = {
197185
"folds": evaluation.check_bounds(numerical_tolerance),

mlscorecheck/aggregated/_fold.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class Fold:
2121
Abstract representation of a fold
2222
"""
2323

24-
def __init__(self, p: int, n: int, identifier: str = None):
24+
def __init__(self, p: int, n: int, identifier: str | None = None):
2525
"""
2626
Constructor of a fold
2727
@@ -34,9 +34,9 @@ def __init__(self, p: int, n: int, identifier: str = None):
3434
self.n = n
3535
self.identifier = random_identifier(5) if identifier is None else identifier
3636

37-
self.tp = None
38-
self.tn = None
39-
self.scores = None
37+
self.tp: int | None = None
38+
self.tn: int | None = None
39+
self.scores: dict | None = None
4040

4141
self.variable_names = {
4242
"tp": f"tp_{self.identifier}".replace("-", "_"),
@@ -70,7 +70,7 @@ def sample_figures(self, random_state=None):
7070
return self
7171

7272
def calculate_scores(
73-
self, rounding_decimals: int = None, score_subset: list = None
73+
self, rounding_decimals: int | None = None, score_subset: list | None = None
7474
) -> dict:
7575
"""
7676
Calculate the scores for the fold
@@ -117,7 +117,7 @@ def set_initial_values(self, scores):
117117
self.tp.setInitialValue(int(tp_init))
118118
self.tn.setInitialValue(int(tn_init))
119119

120-
def init_lp(self, scores: dict = None):
120+
def init_lp(self, scores: dict | None = None):
121121
"""
122122
Initialize a linear programming problem by creating the variables for the fold
123123

mlscorecheck/aggregated/_fold_enumeration.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,7 @@ def not_enough_diverse_folds(p_values, n_values):
116116
)
117117

118118

119-
def determine_min_max_p(
120-
*, p, n, k_a, k_b, c_a, p_non_zero, n_non_zero
121-
): # pylint: disable=too-many-locals
119+
def determine_min_max_p(*, p, n, k_a, k_b, c_a, p_non_zero, n_non_zero): # pylint: disable=too-many-locals
122120
"""
123121
Determines the minimum and maximum number of positives that can appear in folds
124122
of type A
@@ -145,9 +143,7 @@ def determine_min_max_p(
145143
return min_p_a, max_p_a
146144

147145

148-
def fold_partitioning_generator(
149-
*, p, n, k, p_non_zero=True, n_non_zero=True, p_min=-1
150-
): # pylint: disable=invalid-name,too-many-locals
146+
def fold_partitioning_generator(*, p, n, k, p_non_zero=True, n_non_zero=True, p_min=-1): # pylint: disable=invalid-name,too-many-locals
151147
"""
152148
Generates the fold partitioning
153149
@@ -270,9 +266,9 @@ def kfolds_generator(evaluation: dict, available_scores: list, repeat_idx=0):
270266
logger.info("spec and bacc not among the reported scores, n=0 folds are also considered")
271267

272268
if evaluation["dataset"].get("dataset_name") is not None:
273-
evaluation["dataset"][
274-
"identifier"
275-
] = f'{evaluation["dataset"]["dataset_name"]}_{random_identifier(3)}'
269+
evaluation["dataset"]["identifier"] = (
270+
f"{evaluation['dataset']['dataset_name']}_{random_identifier(3)}"
271+
)
276272
else:
277273
evaluation["dataset"]["identifier"] = random_identifier(6)
278274

@@ -416,7 +412,6 @@ def multiclass_fold_partitioning_generator_kn(ns: list, cs: list):
416412
yield part
417413
else:
418414
for part_deep in multiclass_fold_partitioning_generator_kn(ns[1:], part[1]):
419-
420415
if ns[0] == ns[1] and part[0] > part_deep[0]:
421416
continue
422417

mlscorecheck/aggregated/_folding.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ class Folding:
1616

1717
def __init__(
1818
self,
19-
n_folds: int = None,
20-
n_repeats: int = None,
21-
folds: list = None,
22-
strategy: str = None,
19+
n_folds: int | None = None,
20+
n_repeats: int | None = None,
21+
folds: list | None = None,
22+
strategy: str | None = None,
2323
):
2424
"""
2525
Constructor of the folding
@@ -34,7 +34,7 @@ def __init__(
3434
raise ValueError("specify either n_folds,n_repeats,strategy or folds")
3535
if (n_folds is None) and (n_repeats is None) and (folds is None):
3636
raise ValueError("specify either n_folds,strategy or folds")
37-
if ((folds is None) and (strategy is None)) and (n_folds > 1):
37+
if ((folds is None) and (strategy is None)) and (n_folds is not None and n_folds > 1):
3838
raise ValueError("specify strategy if folds are not set explicitly")
3939

4040
self.n_folds = n_folds
@@ -79,9 +79,7 @@ def generate_folds(self, dataset: Dataset, aggregation: str) -> list:
7979

8080
term_a = (dataset.p != p) and (p % dataset.p != 0)
8181
term_b = (dataset.n != n) and (n % dataset.n != 0)
82-
term_c = (
83-
dataset.p > 0 and dataset.n > 0 and (p // dataset.p != n // dataset.n)
84-
)
82+
term_c = dataset.p > 0 and dataset.n > 0 and (p // dataset.p != n // dataset.n)
8583

8684
if term_a or term_b or term_c:
8785
raise ValueError(

mlscorecheck/aggregated/_folding_utils.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ def _create_folds(
8282
p: int,
8383
n: int,
8484
*,
85-
n_folds: int = None,
86-
n_repeats: int = None,
87-
folding: str = None,
88-
score_bounds: dict = None,
89-
identifier: str = None,
85+
n_folds: int | None = None,
86+
n_repeats: int | None = None,
87+
folding: str | None = None,
88+
score_bounds: dict | None = None,
89+
identifier: str | None = None,
9090
) -> list:
9191
"""
9292
Given a dataset, adds folds to it
@@ -108,16 +108,17 @@ def _create_folds(
108108
"""
109109

110110
if n_folds == 1:
111+
n_repeats = n_repeats or 1
111112
folds = [
112-
{"p": p, "n": n, "identifier": f"{identifier}_0_r{idx}"}
113-
for idx in range(n_repeats)
113+
{"p": p, "n": n, "identifier": f"{identifier}_0_r{idx}"} for idx in range(n_repeats)
114114
]
115115

116116
elif folding is None:
117-
folds = [
118-
{"p": p * n_repeats, "n": n * n_repeats, "identifier": f"{identifier}_0"}
119-
]
117+
n_repeats = n_repeats or 1
118+
folds = [{"p": p * n_repeats, "n": n * n_repeats, "identifier": f"{identifier}_0"}]
120119
else:
120+
n_folds = n_folds or 5
121+
n_repeats = n_repeats or 1
121122
folds = determine_fold_configurations(p, n, n_folds, n_repeats, folding)
122123
n_fold = 0
123124
n_repeat = 0
@@ -148,9 +149,7 @@ def multiclass_stratified_folds(dataset: dict, n_folds: int) -> list:
148149
"""
149150
folds = []
150151
labels = np.hstack([np.repeat(key, value) for key, value in dataset.items()])
151-
for _, test in StratifiedKFold(n_splits=n_folds).split(
152-
labels.reshape(-1, 1), labels, labels
153-
):
152+
for _, test in StratifiedKFold(n_splits=n_folds).split(labels.reshape(-1, 1), labels, labels):
154153
folds.append(dict(enumerate(np.bincount(labels[test]))))
155154

156155
return folds

0 commit comments

Comments
 (0)