datapruning 2.1.5__tar.gz → 2.1.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {datapruning-2.1.5/datapruning.egg-info → datapruning-2.1.6}/PKG-INFO +1 -1
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/algorithms/base.py +22 -4
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/algorithms/sliding_window.py +35 -20
- {datapruning-2.1.5 → datapruning-2.1.6/datapruning.egg-info}/PKG-INFO +1 -1
- {datapruning-2.1.5 → datapruning-2.1.6}/pyproject.toml +1 -1
- {datapruning-2.1.5 → datapruning-2.1.6}/LICENSE +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/MANIFEST.in +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/README.md +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/build_src/_core.c +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/algorithms/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/algorithms/el2n_scorer.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/algorithms/fusion_pipeline.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/algorithms/kcenter_select.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/algorithms/margin_scorer.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/algorithms/oof_utils.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/algorithms/registry.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/engine/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/engine/benchmark.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/engine/explainability.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/engine/intelligence.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/engine/optimizer.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/engine/scanner.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/engine/strategy_display.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/engine/strategy_selector.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/multimodal/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/multimodal/clip_encoder.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/pipeline.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/reports/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/reports/exporter.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/benchmark/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/benchmark/compare.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/benchmark/evaluation.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/benchmark/synthetic.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/difficulty.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/embeddings/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/embeddings/torch_utils.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/fusion.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/noise.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/normalize.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/pipeline.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/redundancy.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/scores/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/scores/aum.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/scores/el2n.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/scores/forgetting.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/scores/grand.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/scores/margin.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/selection.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/selectors/__init__.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/selectors/facility_location.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/selectors/kcenter.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/selectors/out_of_fold.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/strategy.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning/sdk.py +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning.egg-info/SOURCES.txt +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning.egg-info/dependency_links.txt +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning.egg-info/requires.txt +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/datapruning.egg-info/top_level.txt +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/setup.cfg +0 -0
- {datapruning-2.1.5 → datapruning-2.1.6}/setup.py +0 -0
|
@@ -106,7 +106,7 @@ class BaseOptimizer(ABC):
|
|
|
106
106
|
std_random = np.std(random_accs_all)
|
|
107
107
|
return mean_strat > mean_random + std_random * 0.5
|
|
108
108
|
except Exception:
|
|
109
|
-
return
|
|
109
|
+
return False
|
|
110
110
|
|
|
111
111
|
def _random_select(self, X: pd.DataFrame, y: pd.Series, keep_ratio: float, seed: int = 42) -> pd.Index:
|
|
112
112
|
n_target = max(1, int(len(y) * keep_ratio))
|
|
@@ -137,9 +137,27 @@ class BaseOptimizer(ABC):
|
|
|
137
137
|
|
|
138
138
|
beneficial = self._beat_random_gate(X, y, keep_ratio)
|
|
139
139
|
if not beneficial:
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
if keep_ratio < 0.25 and self.key != "kcenter":
|
|
141
|
+
try:
|
|
142
|
+
from datapruning.algorithms.kcenter_select import KCenterSelectOptimizer
|
|
143
|
+
kcenter = KCenterSelectOptimizer()
|
|
144
|
+
kcenter_beneficial = kcenter._beat_random_gate(X, y, keep_ratio)
|
|
145
|
+
if kcenter_beneficial:
|
|
146
|
+
kcenter.fit(X, y)
|
|
147
|
+
X_res, y_res = kcenter.transform(X, y, keep_ratio)
|
|
148
|
+
strategy_method = "Diversity Selection (auto)"
|
|
149
|
+
else:
|
|
150
|
+
keep_idx = self._random_select(X, y, keep_ratio)
|
|
151
|
+
X_res, y_res = X.loc[keep_idx], y.loc[keep_idx]
|
|
152
|
+
strategy_method = "random (fallback)"
|
|
153
|
+
except Exception:
|
|
154
|
+
keep_idx = self._random_select(X, y, keep_ratio)
|
|
155
|
+
X_res, y_res = X.loc[keep_idx], y.loc[keep_idx]
|
|
156
|
+
strategy_method = "random (fallback)"
|
|
157
|
+
else:
|
|
158
|
+
keep_idx = self._random_select(X, y, keep_ratio)
|
|
159
|
+
X_res, y_res = X.loc[keep_idx], y.loc[keep_idx]
|
|
160
|
+
strategy_method = "random (fallback)"
|
|
143
161
|
else:
|
|
144
162
|
strategy_method = self.display_name
|
|
145
163
|
|
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
import numpy as np
|
|
3
3
|
import pandas as pd
|
|
4
4
|
from datapruning.algorithms.oof_utils import compute_oof_logits, logits_to_el2n
|
|
5
|
-
from datapruning.research_pruning.selection import sliding_window_select
|
|
6
5
|
from datapruning.algorithms.base import BaseOptimizer
|
|
7
6
|
from datapruning.algorithms.registry import register
|
|
8
7
|
|
|
@@ -32,29 +31,45 @@ class SlidingWindowOptimizer(BaseOptimizer):
|
|
|
32
31
|
def _select_rows(self, X: pd.DataFrame, y: pd.Series, keep_ratio: float) -> pd.Index:
|
|
33
32
|
if self._scores is None:
|
|
34
33
|
self.fit(X, y)
|
|
34
|
+
|
|
35
35
|
y_arr = y.values
|
|
36
36
|
classes = np.unique(y_arr)
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
n = len(y_arr)
|
|
38
|
+
n_target = max(1, int(n * keep_ratio))
|
|
39
|
+
|
|
39
40
|
if len(classes) < 2:
|
|
40
|
-
n_target = max(1, int(len(y) * keep_ratio))
|
|
41
41
|
return y.sample(n=n_target, random_state=42).index
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
42
|
+
|
|
43
|
+
scores = self._scores
|
|
44
|
+
order = np.argsort(scores)
|
|
45
|
+
drop_n = max(1, int(n * 0.10))
|
|
46
|
+
pool = order[:n - drop_n]
|
|
47
|
+
|
|
48
|
+
floor_per_class = max(1, int(n_target * 0.5 / len(classes)))
|
|
49
|
+
selected = set()
|
|
50
|
+
|
|
51
|
+
for c in classes:
|
|
52
|
+
c_mask = y_arr[pool] == c
|
|
53
|
+
c_indices = pool[c_mask]
|
|
54
|
+
if len(c_indices) == 0:
|
|
55
|
+
c_all = np.where(y_arr == c)[0]
|
|
56
|
+
n_pick = min(floor_per_class, len(c_all))
|
|
57
|
+
picks = c_all[np.argsort(scores[c_all])[-n_pick:]]
|
|
58
|
+
for idx in picks:
|
|
59
|
+
selected.add(int(idx))
|
|
60
|
+
else:
|
|
61
|
+
sorted_c = c_indices[np.argsort(scores[c_indices])]
|
|
62
|
+
n_pick = min(floor_per_class, len(sorted_c))
|
|
63
|
+
for idx in sorted_c[-n_pick:]:
|
|
64
|
+
selected.add(int(idx))
|
|
65
|
+
|
|
66
|
+
for idx in order[::-1]:
|
|
67
|
+
if len(selected) >= n_target:
|
|
68
|
+
break
|
|
69
|
+
selected.add(int(idx))
|
|
70
|
+
|
|
71
|
+
selected_arr = np.array(sorted(selected)[:n_target], dtype=int)
|
|
72
|
+
return X.index[selected_arr]
|
|
58
73
|
|
|
59
74
|
def why_selected(self) -> str:
|
|
60
75
|
return ("Filters out both the easiest (redundant) and hardest (potentially mislabeled) "
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/benchmark/evaluation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/embeddings/torch_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/selectors/facility_location.py
RENAMED
|
File without changes
|
|
File without changes
|
{datapruning-2.1.5 → datapruning-2.1.6}/datapruning/research_pruning/selectors/out_of_fold.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|