From 5cca5c92e9442966627f401bdc2f5a42966ef1e9 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Fri, 9 May 2025 01:52:10 -0400 Subject: [PATCH 01/19] Add autonn impl and fancyimpute import to toml --- pyproject.toml | 3 +- src/nearest_neighbors/estimation_methods.py | 78 ++++++++++----------- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6ab2933..352ee29 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,8 @@ dependencies = [ "pytest", "joblib", "wrds", - "requests" + "requests", + "fancyimpute" ] [project.urls] diff --git a/src/nearest_neighbors/estimation_methods.py b/src/nearest_neighbors/estimation_methods.py index 477e285..2abbac5 100644 --- a/src/nearest_neighbors/estimation_methods.py +++ b/src/nearest_neighbors/estimation_methods.py @@ -609,49 +609,47 @@ def impute( # Find the col nearest neighbors indexes col_nearest_neighbors = np.nonzero(col_dists <= distance_threshold_col)[0] - # neighbors can only be used if they are observed - row_nearest_neighbors = row_nearest_neighbors[ - mask_array[row_nearest_neighbors, column] == 1 - ] - col_nearest_neighbors = col_nearest_neighbors[ - mask_array[row, col_nearest_neighbors] == 1 - ] - - alt_mask_array_row = self.f(mask_array[row_nearest_neighbors, column]) - alt_mask_array_col = self.f(mask_array[row, col_nearest_neighbors]) - - y_itprime = data_array[row, col_nearest_neighbors] - y_jt = data_array[row_nearest_neighbors, column] - if len(y_itprime) == 0 and len(y_jt) == 0: - return np.array(np.nan) - - # get intersecting entries - j_inds, tprime_inds = np.meshgrid( + # for unobserved col and row neighbors, construct Z_tilde + col_z_tilde = np.zeros(len(col_nearest_neighbors)) + row_z_tilde = np.zeros(len(row_nearest_neighbors)) + + col_obs_mask = mask_array[row, col_nearest_neighbors] + f_col_obs_mask = self.f(col_obs_mask) + col_z_tilde[col_obs_mask == 1] = col_nearest_neighbors[col_obs_mask == 1] + # take mean across entire (obs) column if col neighbor is unobserved + col_z_tilde[col_obs_mask == 0] = np.mean(data_array[mask_array[:, column] == 1, col_obs_mask == 0], axis = 0) + + row_obs_mask = mask_array[row_nearest_neighbors, column] + f_row_obs_mask = self.f(row_obs_mask) + row_z_tilde[row_obs_mask == 1] = row_nearest_neighbors[row_obs_mask == 1] + # take mean across entire (obs) row if row neighbor is unobserved + row_z_tilde[row_obs_mask == 0] = np.mean(data_array[row_obs_mask == 0, mask_array[row_nearest_neighbors, column] == 1], axis = 1) + + row_z_tilde = self.g(row_z_tilde) + col_z_tilde = self.g(col_z_tilde) + # numerator is col_z_tilde + row_z_tilde + intersection + j_inds, s_inds = np.meshgrid( row_nearest_neighbors, col_nearest_neighbors, indexing="ij" ) - y_jtprime = data_array[j_inds, tprime_inds] - mask_jtprime = mask_array[j_inds, tprime_inds] - - # nonzero gets all indices of the mask that are 1 - intersec_inds = np.nonzero(mask_jtprime == 1) - - y_itprime_inter = y_itprime[ - intersec_inds[1] - ] # this is a array of column values for all intersecting triplets - y_jt_inter = y_jt[ - intersec_inds[0] - ] # this is a array of row values for all intersecting triplets - # note: defaults to rownn if no intersection -> should default to ts-nn instead? - if len(y_itprime_inter) == 0 or len(y_jt_inter) == 0: - return np.array( - data_type.average(y_jt) - if len(y_jt) > 0 - else data_type.average(y_itprime) + mask_js = mask_array[j_inds, s_inds] + data_js = data_array[j_inds, s_inds] + # this should be: len(row_nn) + len(col_nn) => row_nn x col_nn. Then mask_js is also row_nn x col_nn + tot_mask = f_row_obs_mask + f_col_obs_mask.T + mask_js + + # z est is addition of Z_tilde_row, Z_tilde_col, and intersection (same broadcast as mask) + z_est = row_z_tilde + col_z_tilde.T + data_js + + z_numerator = np.nansum(tot_mask * z_est) + z_denominator = np.nansum(tot_mask) + + if z_denominator == 0: + logger.log( + logging.WARNING, + "Warning: Cannot divide by zero in AutoEstimator imputation. Returning np.nan.", ) - # TODO: (Caleb) adjust gamma param to account for differing values for row, col, etc. - sum_y = y_itprime_inter + y_jt_inter + gamma * y_jtprime[intersec_inds] - avg = data_type.average(sum_y) * (1 / 3) - return avg + return np.array(np.nan) + return z_numerator / z_denominator + def _calculate_distances( self, From 3ac38d20d778c708f4404502ec5ff593f15871e9 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Fri, 9 May 2025 01:59:20 -0400 Subject: [PATCH 02/19] Add gamma --- src/nearest_neighbors/estimation_methods.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/nearest_neighbors/estimation_methods.py b/src/nearest_neighbors/estimation_methods.py index 83d9086..c8c0927 100644 --- a/src/nearest_neighbors/estimation_methods.py +++ b/src/nearest_neighbors/estimation_methods.py @@ -675,7 +675,8 @@ def impute( mask_array: npt.NDArray, distance_threshold: Union[float, Tuple[float, float]], # unused data_type: DataType, - **kwargs: Any, + allow_self_neighbor: bool = False, + **kwargs: Any ) -> npt.NDArray: """Impute the missing value at the given row and column. @@ -685,7 +686,9 @@ def impute( data_array (npt.NDArray): Data matrix containing observed and missing values. mask_array (npt.NDArray): Boolean mask matrix indicating observed values. distance_threshold (Union[float, Tuple[float, float]]): Distance threshold (unused in this method). + allow_self_neighbor (bool): Whether to allow self-neighbor. Defaults to False. (unused in this method) data_type (DataType): Data type providing methods for distance calculation and averaging. + **kwargs (Any): Additional keyword arguments. Returns: npt.NDArray: Imputed value for the specified row and column. @@ -847,7 +850,7 @@ def impute( tot_mask = f_row_obs_mask + f_col_obs_mask.T + mask_js # z est is addition of Z_tilde_row, Z_tilde_col, and intersection (same broadcast as mask) - z_est = row_z_tilde + col_z_tilde.T + data_js + z_est = row_z_tilde + col_z_tilde.T + self.gamma * data_js z_numerator = np.nansum(tot_mask * z_est) z_denominator = np.nansum(tot_mask) From e548259302dbda8a92ef62415d038e9d36250ccc Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Fri, 9 May 2025 14:30:43 -0400 Subject: [PATCH 03/19] Add f and g start --- src/nearest_neighbors/estimation_methods.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/nearest_neighbors/estimation_methods.py b/src/nearest_neighbors/estimation_methods.py index c8c0927..af3e207 100644 --- a/src/nearest_neighbors/estimation_methods.py +++ b/src/nearest_neighbors/estimation_methods.py @@ -790,7 +790,8 @@ def impute( "AutoEstimator.impute() missing 1 required keyword-only argument: 'gamma'" ) gamma = self.gamma if self.gamma else kwargs.pop("gamma") - + self.f = lambda x: (-gamma * 0.5 + 0.5) * x + (gamma *0.5 + 0.5) + self.g = lambda x: (-gamma * 0.5 + 0.5) * x if isinstance(distance_threshold, tuple): distance_threshold_row = distance_threshold[0] distance_threshold_col = distance_threshold[1] @@ -850,7 +851,7 @@ def impute( tot_mask = f_row_obs_mask + f_col_obs_mask.T + mask_js # z est is addition of Z_tilde_row, Z_tilde_col, and intersection (same broadcast as mask) - z_est = row_z_tilde + col_z_tilde.T + self.gamma * data_js + z_est = row_z_tilde + col_z_tilde.T + gamma * data_js z_numerator = np.nansum(tot_mask * z_est) z_denominator = np.nansum(tot_mask) From e6fd5de490df4ea7d80e2357008fa00e3d7dafa9 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Wed, 14 May 2025 03:27:55 -0400 Subject: [PATCH 04/19] Distributional bug fixes --- examples/heartsteps/run_distribution.py | 37 +++++++++++---------- src/baselines/softimpute.py | 2 +- src/nearest_neighbors/data_types.py | 29 +++++++++++++--- src/nearest_neighbors/estimation_methods.py | 21 ++++++++---- 4 files changed, 59 insertions(+), 30 deletions(-) diff --git a/examples/heartsteps/run_distribution.py b/examples/heartsteps/run_distribution.py index d897008..d252444 100644 --- a/examples/heartsteps/run_distribution.py +++ b/examples/heartsteps/run_distribution.py @@ -43,12 +43,6 @@ help="Data type to use", ) args = parser.parse_args() -if args.data_type == "kernel": - data_type = DistributionKernelMMD(kernel="exponential") -elif args.data_type == "wasserstein_samples": - data_type = DistributionWassersteinSamples() -else: - raise ValueError(f"Data type {args.data_type} not supported") output_dir = args.output_dir estimation_method = args.estimation_method fit_method = args.fit_method @@ -61,13 +55,6 @@ os.makedirs(output_dir, exist_ok=True) results_dir = os.path.join(output_dir, "results") os.makedirs(results_dir, exist_ok=True) -save_path = os.path.join( - results_dir, f"est_errors-{estimation_method}-{fit_method}-{data_type}.csv" -) - -if os.path.exists(save_path) and not args.force: - logger.info(f"Results already exist at {save_path}. Use --force to overwrite.") - exit() rng = np.random.default_rng(seed=seed) @@ -82,8 +69,22 @@ logger.info(f"Time to load and process data: {elapsed_time:.2f} seconds") logger.info("Using distribution data type") -data_type_kernel = DistributionKernelMMD(kernel="exponential") -data_type_wasserstein = DistributionWassersteinSamples() + +if args.data_type == "kernel": + data_type = DistributionKernelMMD(kernel="exponential") +elif args.data_type == "wasserstein_samples": + data_type = DistributionWassersteinSamples(num_samples=data[0, 0].shape[0]) +else: + raise ValueError(f"Data type {args.data_type} not supported") + +save_path = os.path.join( + results_dir, f"est_errors-{estimation_method}-{fit_method}-{args.data_type}.csv" +) + +if os.path.exists(save_path) and not args.force: + logger.info(f"Results already exist at {save_path}. Use --force to overwrite.") + exit() + holdout_inds = np.nonzero(mask == 1) inds_rows = holdout_inds[0] @@ -127,16 +128,16 @@ if estimation_method == "row-row": logger.info("Using row-row estimation") imputer = NearestNeighborImputer( - estimation_method=RowRowEstimator(is_percentile=False), data_type=data_type + estimation_method=RowRowEstimator(is_percentile=True), data_type=data_type ) logger.info("Using leave-block-out validation") fitter = LeaveBlockOutValidation( - block, distance_threshold_range=(0, 100), n_trials=100, data_type=data_type + block, distance_threshold_range=(0, 1), n_trials=100, data_type=data_type ) elif estimation_method == "col-col": logger.info("Using col-col estimation") imputer = NearestNeighborImputer( - estimation_method=ColColEstimator(), data_type=data_type + estimation_method=ColColEstimator(is_percentile=True), data_type=data_type ) logger.info("Using leave-block-out validation") diff --git a/src/baselines/softimpute.py b/src/baselines/softimpute.py index d25f1fa..587388f 100644 --- a/src/baselines/softimpute.py +++ b/src/baselines/softimpute.py @@ -17,5 +17,5 @@ def softimpute(X: npt.NDArray) -> npt.NDArray: """ # Create a SoftImpute instance with the provided arguments - softimpute = SoftImpute(normalizer=BiScaler()) + softimpute = SoftImpute(normalizer=BiScaler(), verbose=False) return softimpute.fit_transform(X) diff --git a/src/nearest_neighbors/data_types.py b/src/nearest_neighbors/data_types.py index 15f6415..46e478f 100644 --- a/src/nearest_neighbors/data_types.py +++ b/src/nearest_neighbors/data_types.py @@ -75,6 +75,11 @@ def distance(self, obj1: npt.NDArray, obj2: npt.NDArray) -> float: m = obj1.shape[0] n = obj2.shape[0] + if len(obj1.shape) == 1: + obj1 = obj1[:, np.newaxis] + if len(obj2.shape) == 1: + obj2 = obj2[:, np.newaxis] + assert obj1.shape[1] == obj2.shape[1] XX = np.matmul(obj1, np.transpose(obj1)) # m by m matrix with x_i^Tx_j @@ -114,9 +119,9 @@ def distance(self, obj1: npt.NDArray, obj2: npt.NDArray) -> float: raise ValueError(f"Unknown kernel type: {self.kernel}") val = ( - (np.nansum(kXX) - np.nansum(np.diag(kXX))) / (m * (m - 1)) - + (np.nansum(kYY) - np.nansum(np.diag(kYY))) / (n * (n - 1)) - - 2 * np.nansum(kXY) / (n * m) + (np.sum(kXX) - np.sum(np.diag(kXX))) / (m * (m - 1)) + + (np.sum(kYY) - np.sum(np.diag(kYY))) / (n * (n - 1)) + - 2 * np.sum(kXY) / (n * m) ) if val < 0: val = 0 @@ -150,6 +155,15 @@ class DistributionWassersteinSamples(DataType): where distributions are made with samples with the same number of samples. """ + def __init__(self, num_samples: int): + """Initialize the distribution data type with Wasserstein distance. + + Args: + num_samples (int): Number of samples in the distributions (n) + + """ + self.num_samples = num_samples + def distance(self, obj1: npt.NDArray, obj2: npt.NDArray) -> float: """Calculate the Wasserstein distance between two distributions with the same number of samples. @@ -183,7 +197,14 @@ def average(self, object_list: npt.NDArray[Any]) -> npt.NDArray: """ # filter out nan values # All input objects should be 1-dimensional numpy arrays - return np.mean([np.sort(obj) for obj in object_list], axis=0) + avg = np.nanmean([np.sort(obj) for obj in object_list], axis=0) + if not isinstance(avg, float): + # if avg is an array then return avg + return avg + else: + # if avg is a float then it must (?) be a nan, so return an array of nans + return np.full((self.num_samples,), np.nan) + class DistributionWassersteinQuantile(DataType): diff --git a/src/nearest_neighbors/estimation_methods.py b/src/nearest_neighbors/estimation_methods.py index 51424d5..01b8902 100644 --- a/src/nearest_neighbors/estimation_methods.py +++ b/src/nearest_neighbors/estimation_methods.py @@ -6,7 +6,7 @@ import logging import warnings from typing import Optional -from .data_types import Scalar +from .data_types import Scalar, DistributionWassersteinSamples logger = logging.getLogger(__name__) @@ -78,10 +78,7 @@ def impute( # Find the nearest neighbors indexes nearest_neighbors = np.where(row_dists <= eta_row)[0] - # Apply mask_array to data_array - masked_data_array = np.copy(data_array) - masked_data_array[mask_array == 0] = np.nan - + # NOTE: this code block will never be called since the target row # is always a nearest neighbor if len(nearest_neighbors) == 0: @@ -94,10 +91,14 @@ def impute( else: # return the average of all observed outcomes corresponding # to treatment 1 at time t. - return data_type.average(masked_data_array[:, column]) + return data_type.average(data_array[:, column]) # Calculate the average of the nearest neighbors - nearest_neighbors_data = masked_data_array[nearest_neighbors, column] + nearest_neighbors_data = data_array[nearest_neighbors, column] + nearest_neighbors_mask = mask_array[nearest_neighbors, column] + nearest_neighbors_data = nearest_neighbors_data[ + nearest_neighbors_mask == 1 + ] return data_type.average(nearest_neighbors_data) def _calculate_distances( @@ -154,6 +155,12 @@ def _calculate_distances( if not overlap_columns[j]: # Skip missing values and the target column row_dists[i, j] = np.nan else: + # if data_array[row, j].dtype == np.float64: + # print (f"Row {row}, Column {j} is NaN") + # exit() + # if isinstance(data_array[i, j], np.float64): + # print (f"Row {i}, Column {j} is NaN") + # exit() row_dists[i, j] = data_type.distance( data_array[row, j], data_array[i, j] ) From fcff7ca074790ec949c767469f4014c400682f79 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Wed, 14 May 2025 16:28:28 -0400 Subject: [PATCH 05/19] Add autonn impl --- examples/simulations/plot_size_error.py | 15 +- examples/simulations/run_scalar.py | 21 +- .../simulations/slurm_scripts/run_accuracy.sh | 2 + src/nearest_neighbors/estimation_methods.py | 346 +++++++++++++----- src/nearest_neighbors/fit_methods.py | 121 +++++- 5 files changed, 400 insertions(+), 105 deletions(-) diff --git a/examples/simulations/plot_size_error.py b/examples/simulations/plot_size_error.py index b711e54..cabcd2e 100644 --- a/examples/simulations/plot_size_error.py +++ b/examples/simulations/plot_size_error.py @@ -46,7 +46,8 @@ def _process_csv(filepath: str) -> np.ndarray: # usvt_err = process_csv(f"{output_dir}/results/est_errors-usvt-lbo.csv") drnn_err = _process_csv(f"{output_dir}/results/est_errors-dr-lbo.csv") tsnn_err = _process_csv(f"{output_dir}/results/est_errors-ts-lbo.csv") -# softimpute_err = process_csv("cvrange_30sims/results/est_errors-softimpute-lbo.csv") +auto_err = _process_csv(f"{output_dir}/results/est_errors-auto-lbo.csv") +#softimpute_err = process_csv("cvrange_30sims/results/est_errors-softimpute-lbo.csv") # Extract errors for each method as a numpy array 4 x 30 @@ -57,6 +58,7 @@ def _process_csv(filepath: str) -> np.ndarray: # USVT_errors = np.nanmean(usvt_err, axis = 1) TSNN_errors = np.nanmean(tsnn_err, axis=1) # Softimpute_errors = np.nanmean(softimpute_err, axis = 1) +Auto_errors = np.nanmean(auto_err, axis=1) unn_stderr = np.nanstd(row_err, axis=1) / np.sqrt(row_err.shape[1]) @@ -64,6 +66,7 @@ def _process_csv(filepath: str) -> np.ndarray: drnn_stderr = np.nanstd(drnn_err, axis=1) / np.sqrt(drnn_err.shape[1]) # usvt_stderr = np.nanstd(usvt_err, axis = 1) / np.sqrt(usvt_err.shape[1]) tsnn_stderr = np.nanstd(tsnn_err, axis=1) / np.sqrt(tsnn_err.shape[1]) +auto_stderr = np.nanstd(auto_err, axis=1) / np.sqrt(auto_err.shape[1]) # softimpute_stderr = np.nanstd(softimpute_err, axis = 1) / np.sqrt(softimpute_err.shape[1]) @@ -89,6 +92,7 @@ def _add_regression_line( tnn_slope = _add_regression_line(T_values, TimeNN_errors, "orange", "Time-NN", ":") drnn_slope = _add_regression_line(T_values, DRNN_errors, "blue", "DR-NN", "--") tsnn_slope = _add_regression_line(T_values, TSNN_errors, "purple", "Time-NN", ":") +auto_slope = _add_regression_line(T_values, Auto_errors, "orange", "Auto", ":") # softimpute_slope = add_regression_line(T_values, Softimpute_errors, 'black', 'SoftImpute', ':') # Plot each method with corresponding markers, colors, and line styles @@ -132,6 +136,15 @@ def _add_regression_line( linestyle="None", label=rf"TS-NN: $T^{{{tsnn_slope:.2f}}}$", ) +plt.errorbar( + T_values, + Auto_errors, + fmt="o", + yerr=auto_stderr, + markersize=12, + linestyle="None", + label=rf"Auto-NN: $T^{{{auto_slope:.2f}}}$", +) # plt.errorbar(T_values, Softimpute_errors, fmt='k^', yerr=softimpute_stderr, markersize=12, linestyle="None", label=rf'SoftImpute: $T^{{{softimpute_slope:.2f}}}$') # Logarithmic scale for both axes plt.xscale("log", base=2) diff --git a/examples/simulations/run_scalar.py b/examples/simulations/run_scalar.py index 7b3474f..6e58c84 100644 --- a/examples/simulations/run_scalar.py +++ b/examples/simulations/run_scalar.py @@ -20,13 +20,13 @@ # import nearest neighbor methods from nearest_neighbors.data_types import Scalar -from nearest_neighbors.estimation_methods import TSEstimator # , AutoEstimator +from nearest_neighbors.estimation_methods import TSEstimator, AutoEstimator from nearest_neighbors import NearestNeighborImputer from nearest_neighbors.fit_methods import ( DRLeaveBlockOutValidation, TSLeaveBlockOutValidation, LeaveBlockOutValidation, - # AutoDRTSLeaveBlockOutValidation, + AutoDRTSLeaveBlockOutValidation, ) from nearest_neighbors.datasets.dataloader_factory import NNData from nearest_neighbors.vanilla_nn import row_row, col_col @@ -454,6 +454,23 @@ def last_col_trial() -> None: allow_self_neighbor=True, ) allow_self_neighbor = True + elif estimation_method == "auto": + logger.info("Using AutoNN estimation") + estimator = AutoEstimator() + imputer = NearestNeighborImputer( + estimator, data_type + ) + logger.info("Using AutoNN fit method") + # Fit the imputer using leave-block-out validation + fitter = AutoDRTSLeaveBlockOutValidation( + block, + distance_threshold_range_row=(0, 1), + distance_threshold_range_col=(0, 1), + alpha_range=(0, 1), + n_trials=100, + data_type=data_type, + allow_self_neighbor=args.allow_self_neighbor, + ) else: raise ValueError( f"Estimation method {estimation_method} and fit method {fit_method} not supported" diff --git a/examples/simulations/slurm_scripts/run_accuracy.sh b/examples/simulations/slurm_scripts/run_accuracy.sh index 0f12fa7..a398e15 100755 --- a/examples/simulations/slurm_scripts/run_accuracy.sh +++ b/examples/simulations/slurm_scripts/run_accuracy.sh @@ -9,11 +9,13 @@ LOG_LEVEL=$2 METHODS=( # "softimpute" # "usvt" + "auto" "row-row" "col-col" "dr" "ts" "softimpute" + ) for em in ${METHODS[@]}; do diff --git a/src/nearest_neighbors/estimation_methods.py b/src/nearest_neighbors/estimation_methods.py index 01b8902..989782d 100644 --- a/src/nearest_neighbors/estimation_methods.py +++ b/src/nearest_neighbors/estimation_methods.py @@ -6,7 +6,7 @@ import logging import warnings from typing import Optional -from .data_types import Scalar, DistributionWassersteinSamples +from .data_types import Scalar logger = logging.getLogger(__name__) @@ -860,18 +860,19 @@ def _calculate_distances( self.row_distances = row_distances - - class AutoEstimator(EstimationMethod): """Estimate the missing entry using "Auto-NN" idea (Kyuseong Choi).""" - def __init__(self): + def __init__(self, is_percentile: bool = True): + super().__init__(is_percentile) self.row_distances = dict() self.col_distances = dict() # insert default f and g functions - self.f = lambda x: x - self.g = lambda x: x - self.gamma = 1.0 + # self.f = lambda x: x + # self.g = lambda x: x + self.alpha = 1.0 + self.drnn_imputer = DREstimator(is_percentile=is_percentile) + self.ts_imputer = TSEstimator(is_percentile=is_percentile) def impute( self, @@ -899,84 +900,37 @@ def impute( **kwargs (Any): Additional keyword arguments """ - if self.gamma is None and "gamma" not in kwargs: + if self.alpha is None and "alpha" not in kwargs: raise TypeError( "AutoEstimator.impute() missing 1 required keyword-only argument: 'gamma'" ) - gamma = self.gamma if self.gamma else kwargs.pop("gamma") - self.f = lambda x: (-gamma * 0.5 + 0.5) * x + (gamma *0.5 + 0.5) - self.g = lambda x: (-gamma * 0.5 + 0.5) * x - if isinstance(distance_threshold, tuple): - distance_threshold_row = distance_threshold[0] - distance_threshold_col = distance_threshold[1] - else: - distance_threshold_row = distance_threshold - distance_threshold_col = distance_threshold - - with warnings.catch_warnings(): - warnings.simplefilter("ignore", category=RuntimeWarning) - self._calculate_distances(row, column, data_array, mask_array, data_type) - all_dists = np.copy(self.row_distances[row]) - # Exclude the target column - if not allow_self_neighbor: - all_dists[:, column] = np.nan - row_dists = np.nanmean(all_dists, axis=1) - if not mask_array[row, column] and not allow_self_neighbor: - row_dists[row] = np.inf # Exclude the target row - # Exclude the target row - all_dists = np.copy(self.col_distances[column]) - if not allow_self_neighbor: - all_dists[row, :] = np.nan - col_dists = np.nanmean(all_dists, axis=0) - if not mask_array[row, column] and not allow_self_neighbor: - col_dists[column] = np.inf # Exclude the target col - - # Find the row nearest neighbors indexes - row_nearest_neighbors = np.nonzero(row_dists <= distance_threshold_row)[0] - - # Find the col nearest neighbors indexes - col_nearest_neighbors = np.nonzero(col_dists <= distance_threshold_col)[0] - - # for unobserved col and row neighbors, construct Z_tilde - col_z_tilde = np.zeros(len(col_nearest_neighbors)) - row_z_tilde = np.zeros(len(row_nearest_neighbors)) - - col_obs_mask = mask_array[row, col_nearest_neighbors] - f_col_obs_mask = self.f(col_obs_mask) - col_z_tilde[col_obs_mask == 1] = col_nearest_neighbors[col_obs_mask == 1] - # take mean across entire (obs) column if col neighbor is unobserved - col_z_tilde[col_obs_mask == 0] = np.mean(data_array[mask_array[:, column] == 1, col_obs_mask == 0], axis = 0) - - row_obs_mask = mask_array[row_nearest_neighbors, column] - f_row_obs_mask = self.f(row_obs_mask) - row_z_tilde[row_obs_mask == 1] = row_nearest_neighbors[row_obs_mask == 1] - # take mean across entire (obs) row if row neighbor is unobserved - row_z_tilde[row_obs_mask == 0] = np.mean(data_array[row_obs_mask == 0, mask_array[row_nearest_neighbors, column] == 1], axis = 1) - - row_z_tilde = self.g(row_z_tilde) - col_z_tilde = self.g(col_z_tilde) - # numerator is col_z_tilde + row_z_tilde + intersection - j_inds, s_inds = np.meshgrid( - row_nearest_neighbors, col_nearest_neighbors, indexing="ij" + alpha = self.alpha if self.alpha else kwargs.pop("alpha") + # TODO: handle allow self neighbor (Caleb) + drnn_impute = self.drnn_imputer.impute( + row, + column, + data_array, + mask_array, + distance_threshold, + data_type, + allow_self_neighbor=False, + ) + ts_impute = self.ts_imputer.impute( + row, + column, + data_array, + mask_array, + distance_threshold, + data_type, + allow_self_neighbor=True, ) - mask_js = mask_array[j_inds, s_inds] - data_js = data_array[j_inds, s_inds] - # this should be: len(row_nn) + len(col_nn) => row_nn x col_nn. Then mask_js is also row_nn x col_nn - tot_mask = f_row_obs_mask + f_col_obs_mask.T + mask_js - - # z est is addition of Z_tilde_row, Z_tilde_col, and intersection (same broadcast as mask) - z_est = row_z_tilde + col_z_tilde.T + gamma * data_js - z_numerator = np.nansum(tot_mask * z_est) - z_denominator = np.nansum(tot_mask) + # interpolate between tsnn and drnn + final_impute = ( + (1 - alpha) * drnn_impute + alpha * ts_impute + ) - if z_denominator == 0: - logger.log( - logging.WARNING, - "Warning: Cannot divide by zero in AutoEstimator imputation. Returning np.nan.", - ) - return np.array(np.nan) - return z_numerator / z_denominator + return final_impute def _calculate_distances( @@ -987,27 +941,6 @@ def _calculate_distances( mask_array: npt.NDArray, data_type: DataType, ) -> None: - """Computes distances, caches them.""" - # TODO add validation checks here - n_rows, n_cols = data_array.shape - row_distances = np.zeros((n_rows, n_cols)) - - for i in range(n_rows): - for j in range(i + 1, n_rows): - overlap_cols = np.logical_and(mask_array[i, :], mask_array[j, :]) - if not np.any(overlap_cols): - row_distances[i, j] = np.inf - row_distances[j, i] = np.inf - continue - for k in range(n_cols): - if not overlap_cols[k]: - continue - row_distances[i, j] += data_type.distance( - data_array[i, k], data_array[j, k] - ) - row_distances[i, j] /= np.sum(overlap_cols) - row_distances[j, i] = row_distances[i, j] - self.row_distances = row_distances """Sets the distances for the imputer. Sets the distances as a class attribute, so returns nothing. @@ -1071,4 +1004,215 @@ def _calculate_distances( data_array[i, col], data_array[i, j] ) self.col_distances[col] = col_dists - # self.col_distances[col][col] = np.inf \ No newline at end of file + # self.col_distances[col][col] = np.inf + +# class AutoEstimator(EstimationMethod): +# """Estimate the missing entry using "Auto-NN" idea (Kyuseong Choi).""" + +# def __init__(self): +# self.row_distances = dict() +# self.col_distances = dict() +# # insert default f and g functions +# self.f = lambda x: x +# self.g = lambda x: x +# self.gamma = 1.0 + +# def impute( +# self, +# row: int, +# column: int, +# data_array: npt.NDArray, +# mask_array: npt.NDArray, +# distance_threshold: Union[float, Tuple[float, float]], +# data_type: DataType, +# allow_self_neighbor: bool = False, +# **kwargs: Any, +# ) -> npt.NDArray: +# """Impute the missing value at the given row and column using doubly robust method. + +# Args: +# ---- +# row (int): Row index +# column (int): Column index +# data_array (npt.NDArray): Data matrix +# mask_array (npt.NDArray): Mask matrix +# distance_threshold (float or Tuple[float, float]): Distance threshold for nearest neighbors +# or a tuple of (row_threshold, col_threshold) for row and column respectively. +# data_type (DataType): Data type to use (e.g. scalars, distributions) +# allow_self_neighbor (bool): Whether to allow self-neighbor. Defaults to False. +# **kwargs (Any): Additional keyword arguments + +# """ +# if self.gamma is None and "gamma" not in kwargs: +# raise TypeError( +# "AutoEstimator.impute() missing 1 required keyword-only argument: 'gamma'" +# ) +# gamma = self.gamma if self.gamma else kwargs.pop("gamma") +# self.f = lambda x: (-gamma * 0.5 + 0.5) * x + (gamma *0.5 + 0.5) +# self.g = lambda x: (-gamma * 0.5 + 0.5) * x +# if isinstance(distance_threshold, tuple): +# distance_threshold_row = distance_threshold[0] +# distance_threshold_col = distance_threshold[1] +# else: +# distance_threshold_row = distance_threshold +# distance_threshold_col = distance_threshold + +# with warnings.catch_warnings(): +# warnings.simplefilter("ignore", category=RuntimeWarning) +# self._calculate_distances(row, column, data_array, mask_array, data_type) +# all_dists = np.copy(self.row_distances[row]) +# # Exclude the target column +# if not allow_self_neighbor: +# all_dists[:, column] = np.nan +# row_dists = np.nanmean(all_dists, axis=1) +# if not mask_array[row, column] and not allow_self_neighbor: +# row_dists[row] = np.inf # Exclude the target row +# # Exclude the target row +# all_dists = np.copy(self.col_distances[column]) +# if not allow_self_neighbor: +# all_dists[row, :] = np.nan +# col_dists = np.nanmean(all_dists, axis=0) +# if not mask_array[row, column] and not allow_self_neighbor: +# col_dists[column] = np.inf # Exclude the target col + +# # Find the row nearest neighbors indexes +# row_nearest_neighbors = np.nonzero(row_dists <= distance_threshold_row)[0] + +# # Find the col nearest neighbors indexes +# col_nearest_neighbors = np.nonzero(col_dists <= distance_threshold_col)[0] + +# # for unobserved col and row neighbors, construct Z_tilde +# col_z_tilde = np.zeros(len(col_nearest_neighbors)) +# row_z_tilde = np.zeros(len(row_nearest_neighbors)) + +# col_obs_mask = mask_array[row, col_nearest_neighbors] +# f_col_obs_mask = self.f(col_obs_mask) +# col_z_tilde[col_obs_mask == 1] = col_nearest_neighbors[col_obs_mask == 1] +# # take mean across entire (obs) column if col neighbor is unobserved +# col_z_tilde[col_obs_mask == 0] = np.mean(data_array[mask_array[:, column] == 1, col_obs_mask == 0], axis = 0) + +# row_obs_mask = mask_array[row_nearest_neighbors, column] +# f_row_obs_mask = self.f(row_obs_mask) +# row_z_tilde[row_obs_mask == 1] = row_nearest_neighbors[row_obs_mask == 1] +# # take mean across entire (obs) row if row neighbor is unobserved +# row_z_tilde[row_obs_mask == 0] = np.mean(data_array[row_obs_mask == 0, mask_array[row_nearest_neighbors, column] == 1], axis = 1) + +# row_z_tilde = self.g(row_z_tilde) +# col_z_tilde = self.g(col_z_tilde) +# # numerator is col_z_tilde + row_z_tilde + intersection +# j_inds, s_inds = np.meshgrid( +# row_nearest_neighbors, col_nearest_neighbors, indexing="ij" +# ) +# mask_js = mask_array[j_inds, s_inds] +# data_js = data_array[j_inds, s_inds] +# # this should be: len(row_nn) + len(col_nn) => row_nn x col_nn. Then mask_js is also row_nn x col_nn +# tot_mask = f_row_obs_mask + f_col_obs_mask.T + mask_js + +# # z est is addition of Z_tilde_row, Z_tilde_col, and intersection (same broadcast as mask) +# z_est = row_z_tilde + col_z_tilde.T + gamma * data_js + +# z_numerator = np.nansum(tot_mask * z_est) +# z_denominator = np.nansum(tot_mask) + +# if z_denominator == 0: +# logger.log( +# logging.WARNING, +# "Warning: Cannot divide by zero in AutoEstimator imputation. Returning np.nan.", +# ) +# return np.array(np.nan) +# return z_numerator / z_denominator + + +# def _calculate_distances( +# self, +# row: int, +# col: int, +# data_array: npt.NDArray, +# mask_array: npt.NDArray, +# data_type: DataType, +# ) -> None: +# """Computes distances, caches them.""" +# # TODO add validation checks here +# n_rows, n_cols = data_array.shape +# row_distances = np.zeros((n_rows, n_cols)) + +# for i in range(n_rows): +# for j in range(i + 1, n_rows): +# overlap_cols = np.logical_and(mask_array[i, :], mask_array[j, :]) +# if not np.any(overlap_cols): +# row_distances[i, j] = np.inf +# row_distances[j, i] = np.inf +# continue +# for k in range(n_cols): +# if not overlap_cols[k]: +# continue +# row_distances[i, j] += data_type.distance( +# data_array[i, k], data_array[j, k] +# ) +# row_distances[i, j] /= np.sum(overlap_cols) +# row_distances[j, i] = row_distances[i, j] +# self.row_distances = row_distances +# """Sets the distances for the imputer. +# Sets the distances as a class attribute, so returns nothing. + +# Args: +# row (int): Row index +# col (int): Column index +# data_array (npt.NDArray): Data matrix +# mask_array (npt.NDArray): Mask matrix +# data_type (DataType): Data type to use (e.g. scalars, distributions) + +# """ +# data_shape = data_array.shape +# n_rows = data_shape[0] +# n_cols = data_shape[1] + +# if row not in self.row_distances: +# # Calculate distances between rows +# row_dists = np.zeros((n_rows, n_cols)) + +# for i in range(n_rows): +# # Get columns observed in both row i and row +# overlap_columns = np.logical_and(mask_array[row], mask_array[i]) + +# if not np.any(overlap_columns): +# row_dists[i, :] = np.nan +# continue + +# # Calculate distance between rows +# for j in range(n_cols): +# if not overlap_columns[ +# j +# ]: # Skip missing values and the target column +# row_dists[i, j] = np.nan +# else: +# row_dists[i, j] = data_type.distance( +# data_array[row, j], data_array[i, j] +# ) +# self.row_distances[row] = row_dists +# # self.row_distances[row][row] = np.inf # Exclude the row itself + +# if col not in self.col_distances: +# # Calculate distances between columns +# col_dists = np.zeros((n_rows, n_cols)) + +# for j in range(n_cols): +# # Get rows observed in both row i and row +# overlap_columns = np.logical_and(mask_array[:, col], mask_array[:, j]) + +# if not np.any(overlap_columns): +# col_dists[:, j] = np.nan +# continue + +# # Calculate distance between columns +# for i in range(n_rows): +# if not overlap_columns[ +# i +# ]: # Skip missing values and the target column +# col_dists[i, j] = np.nan +# else: +# col_dists[i, j] = data_type.distance( +# data_array[i, col], data_array[i, j] +# ) +# self.col_distances[col] = col_dists +# # self.col_distances[col][col] = np.inf \ No newline at end of file diff --git a/src/nearest_neighbors/fit_methods.py b/src/nearest_neighbors/fit_methods.py index d231d89..67ce69e 100644 --- a/src/nearest_neighbors/fit_methods.py +++ b/src/nearest_neighbors/fit_methods.py @@ -1,5 +1,5 @@ from .nnimputer import FitMethod, DataType, NearestNeighborImputer -from .estimation_methods import DREstimator, TSEstimator # , AutoEstimator +from .estimation_methods import DREstimator, TSEstimator, AutoEstimator import numpy.typing as npt from hyperopt import hp, fmin, tpe, Trials from typing import cast, Union, Any @@ -319,3 +319,122 @@ def fit( ) imputer.estimation_method = cast(TSEstimator, imputer.estimation_method) return super().fit(data_array, mask_array, imputer) + +class AutoDRTSLeaveBlockOutValidation(DualThresholdLeaveBlockOutValidation): + """Fit method by leaving out a block of cells using separate thresholds for rows and columns with a AutoEstimator.""" + + expected_estimator_type = AutoEstimator + + def __init__( + self, + block: list[tuple[int, int]], + distance_threshold_range_row: tuple[float, float], + distance_threshold_range_col: tuple[float, float], + alpha_range: tuple[float, float], + n_trials: int, + data_type: DataType, + allow_self_neighbor: bool = False, + ): + """Initialize the dual threshold block fit method with AutoEstimator. + + Args: + block (list[tuple[int, int]]): List of cells as tuples of row and column indices. + distance_threshold_range_row (tuple[float, float]): Range of row distance thresholds to test. + distance_threshold_range_col (tuple[float, float]): Range of column distance thresholds to test. + alpha_range (tuple[float, float]): Range of alpha values to test. + n_trials (int): Number of trials to run. + data_type (DataType): Data type to use (e.g. scalars, distributions). + allow_self_neighbor (bool, optional): Whether to allow the entry itself as a neighbor. Defaults to False. + + """ + self.alpha_range = alpha_range + super().__init__( + block, + distance_threshold_range_row, + distance_threshold_range_col, + n_trials, + data_type, + ) + self.allow_self_neighbor = allow_self_neighbor + + def fit( + self, + data_array: npt.NDArray, + mask_array: npt.NDArray, + imputer: NearestNeighborImputer, + ret_trials: bool = False, + ) -> Union[tuple[float, float], tuple[tuple[float, float], Trials]]: + """Find the best distance thresholds for rows and columns by leaving out a block of cells and testing imputation. + + Args: + data_array (npt.NDArray): Data matrix. + mask_array (npt.NDArray): Mask matrix. + imputer (NearestNeighborImputer): Imputer object. + ret_trials (bool): If True, return the trials object which contains metadata on hyperparameter search. + + Returns: + tuple[float, float]: Best distance thresholds for rows and columns. + + """ + if not isinstance(imputer.estimation_method, AutoEstimator): + raise ValueError( + f"The imputer must use a AutoEstimator for {self.__class__.__name__}." + ) + imputer.estimation_method = cast(AutoEstimator, imputer.estimation_method) + + def _objective(params: dict[str, float]) -> float: + """Objective function for hyperopt. + + Args: + params (dict[str, float]): Dictionary containing row and column distance thresholds + + Returns: + float: Average imputation error + + """ + row_threshold = params["distance_threshold_row"] + col_threshold = params["distance_threshold_col"] + alpha = params["alpha"] + imputer.distance_threshold = (row_threshold, col_threshold) + if not isinstance(imputer.estimation_method, AutoEstimator): + raise ValueError( + f"The imputer must use a AutoEstimator for {self.__class__.__name__}." + ) + imputer.estimation_method.alpha = alpha + return evaluate_imputation( + data_array, mask_array, imputer, self.block, self.data_type, self.allow_self_neighbor + ) + + lower_bound_row, upper_bound_row = self.distance_threshold_range_row + lower_bound_col, upper_bound_col = self.distance_threshold_range_col + lower_bound_alpha, upper_bound_alpha = self.alpha_range + trials = Trials() + best_params = fmin( + fn=_objective, + space={ + "distance_threshold_row": hp.uniform( + "distance_threshold_row", lower_bound_row, upper_bound_row + ), + "distance_threshold_col": hp.uniform( + "distance_threshold_col", lower_bound_col, upper_bound_col + ), + "alpha": hp.uniform("alpha", lower_bound_alpha, upper_bound_alpha), + }, + algo=tpe.suggest, + max_evals=self.n_trials, + verbose=False, + trials=trials, + ) + + if best_params is None: + return float("nan"), float("nan") + + imputer.distance_threshold = ( + best_params["distance_threshold_row"], + best_params["distance_threshold_col"], + ) + imputer.estimation_method.alpha = best_params["alpha"] + + if ret_trials: + return imputer.distance_threshold, trials + return imputer.distance_threshold From 6a0a3774ce3c963d1efb1b8eb1aba33b0e0e8fbd Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Wed, 14 May 2025 16:57:26 -0400 Subject: [PATCH 06/19] Add linter fixes and prompteval bug fix --- examples/simulations/plot_size_error.py | 2 +- examples/simulations/run_scalar.py | 4 +- .../simulations/slurm_scripts/run_accuracy.sh | 2 +- src/nearest_neighbors/data_types.py | 3 +- src/nearest_neighbors/estimation_methods.py | 227 +----------------- src/nearest_neighbors/fit_methods.py | 8 +- 6 files changed, 16 insertions(+), 230 deletions(-) diff --git a/examples/simulations/plot_size_error.py b/examples/simulations/plot_size_error.py index cabcd2e..6844ce9 100644 --- a/examples/simulations/plot_size_error.py +++ b/examples/simulations/plot_size_error.py @@ -47,7 +47,7 @@ def _process_csv(filepath: str) -> np.ndarray: drnn_err = _process_csv(f"{output_dir}/results/est_errors-dr-lbo.csv") tsnn_err = _process_csv(f"{output_dir}/results/est_errors-ts-lbo.csv") auto_err = _process_csv(f"{output_dir}/results/est_errors-auto-lbo.csv") -#softimpute_err = process_csv("cvrange_30sims/results/est_errors-softimpute-lbo.csv") +# softimpute_err = process_csv("cvrange_30sims/results/est_errors-softimpute-lbo.csv") # Extract errors for each method as a numpy array 4 x 30 diff --git a/examples/simulations/run_scalar.py b/examples/simulations/run_scalar.py index 6e58c84..cb166c6 100644 --- a/examples/simulations/run_scalar.py +++ b/examples/simulations/run_scalar.py @@ -457,9 +457,7 @@ def last_col_trial() -> None: elif estimation_method == "auto": logger.info("Using AutoNN estimation") estimator = AutoEstimator() - imputer = NearestNeighborImputer( - estimator, data_type - ) + imputer = NearestNeighborImputer(estimator, data_type) logger.info("Using AutoNN fit method") # Fit the imputer using leave-block-out validation fitter = AutoDRTSLeaveBlockOutValidation( diff --git a/examples/simulations/slurm_scripts/run_accuracy.sh b/examples/simulations/slurm_scripts/run_accuracy.sh index a398e15..e8aba88 100755 --- a/examples/simulations/slurm_scripts/run_accuracy.sh +++ b/examples/simulations/slurm_scripts/run_accuracy.sh @@ -15,7 +15,7 @@ METHODS=( "dr" "ts" "softimpute" - + ) for em in ${METHODS[@]}; do diff --git a/src/nearest_neighbors/data_types.py b/src/nearest_neighbors/data_types.py index 46e478f..b272384 100644 --- a/src/nearest_neighbors/data_types.py +++ b/src/nearest_neighbors/data_types.py @@ -157,7 +157,7 @@ class DistributionWassersteinSamples(DataType): def __init__(self, num_samples: int): """Initialize the distribution data type with Wasserstein distance. - + Args: num_samples (int): Number of samples in the distributions (n) @@ -206,7 +206,6 @@ def average(self, object_list: npt.NDArray[Any]) -> npt.NDArray: return np.full((self.num_samples,), np.nan) - class DistributionWassersteinQuantile(DataType): """Data type for distributions using Wasserstein distance where distributions are given by their quantile functions. diff --git a/src/nearest_neighbors/estimation_methods.py b/src/nearest_neighbors/estimation_methods.py index 989782d..b3dac8e 100644 --- a/src/nearest_neighbors/estimation_methods.py +++ b/src/nearest_neighbors/estimation_methods.py @@ -78,7 +78,7 @@ def impute( # Find the nearest neighbors indexes nearest_neighbors = np.where(row_dists <= eta_row)[0] - + # NOTE: this code block will never be called since the target row # is always a nearest neighbor if len(nearest_neighbors) == 0: @@ -96,9 +96,7 @@ def impute( # Calculate the average of the nearest neighbors nearest_neighbors_data = data_array[nearest_neighbors, column] nearest_neighbors_mask = mask_array[nearest_neighbors, column] - nearest_neighbors_data = nearest_neighbors_data[ - nearest_neighbors_mask == 1 - ] + nearest_neighbors_data = nearest_neighbors_data[nearest_neighbors_mask == 1] return data_type.average(nearest_neighbors_data) def _calculate_distances( @@ -860,6 +858,7 @@ def _calculate_distances( self.row_distances = row_distances + class AutoEstimator(EstimationMethod): """Estimate the missing entry using "Auto-NN" idea (Kyuseong Choi).""" @@ -902,7 +901,7 @@ def impute( """ if self.alpha is None and "alpha" not in kwargs: raise TypeError( - "AutoEstimator.impute() missing 1 required keyword-only argument: 'gamma'" + "AutoEstimator.impute() missing 1 required keyword-only argument: 'alpha'" ) alpha = self.alpha if self.alpha else kwargs.pop("alpha") # TODO: handle allow self neighbor (Caleb) @@ -926,13 +925,10 @@ def impute( ) # interpolate between tsnn and drnn - final_impute = ( - (1 - alpha) * drnn_impute + alpha * ts_impute - ) + final_impute = (1 - alpha) * drnn_impute + alpha * ts_impute return final_impute - def _calculate_distances( self, row: int, @@ -979,7 +975,6 @@ def _calculate_distances( data_array[row, j], data_array[i, j] ) self.row_distances[row] = row_dists - # self.row_distances[row][row] = np.inf # Exclude the row itself if col not in self.col_distances: # Calculate distances between columns @@ -1004,215 +999,3 @@ def _calculate_distances( data_array[i, col], data_array[i, j] ) self.col_distances[col] = col_dists - # self.col_distances[col][col] = np.inf - -# class AutoEstimator(EstimationMethod): -# """Estimate the missing entry using "Auto-NN" idea (Kyuseong Choi).""" - -# def __init__(self): -# self.row_distances = dict() -# self.col_distances = dict() -# # insert default f and g functions -# self.f = lambda x: x -# self.g = lambda x: x -# self.gamma = 1.0 - -# def impute( -# self, -# row: int, -# column: int, -# data_array: npt.NDArray, -# mask_array: npt.NDArray, -# distance_threshold: Union[float, Tuple[float, float]], -# data_type: DataType, -# allow_self_neighbor: bool = False, -# **kwargs: Any, -# ) -> npt.NDArray: -# """Impute the missing value at the given row and column using doubly robust method. - -# Args: -# ---- -# row (int): Row index -# column (int): Column index -# data_array (npt.NDArray): Data matrix -# mask_array (npt.NDArray): Mask matrix -# distance_threshold (float or Tuple[float, float]): Distance threshold for nearest neighbors -# or a tuple of (row_threshold, col_threshold) for row and column respectively. -# data_type (DataType): Data type to use (e.g. scalars, distributions) -# allow_self_neighbor (bool): Whether to allow self-neighbor. Defaults to False. -# **kwargs (Any): Additional keyword arguments - -# """ -# if self.gamma is None and "gamma" not in kwargs: -# raise TypeError( -# "AutoEstimator.impute() missing 1 required keyword-only argument: 'gamma'" -# ) -# gamma = self.gamma if self.gamma else kwargs.pop("gamma") -# self.f = lambda x: (-gamma * 0.5 + 0.5) * x + (gamma *0.5 + 0.5) -# self.g = lambda x: (-gamma * 0.5 + 0.5) * x -# if isinstance(distance_threshold, tuple): -# distance_threshold_row = distance_threshold[0] -# distance_threshold_col = distance_threshold[1] -# else: -# distance_threshold_row = distance_threshold -# distance_threshold_col = distance_threshold - -# with warnings.catch_warnings(): -# warnings.simplefilter("ignore", category=RuntimeWarning) -# self._calculate_distances(row, column, data_array, mask_array, data_type) -# all_dists = np.copy(self.row_distances[row]) -# # Exclude the target column -# if not allow_self_neighbor: -# all_dists[:, column] = np.nan -# row_dists = np.nanmean(all_dists, axis=1) -# if not mask_array[row, column] and not allow_self_neighbor: -# row_dists[row] = np.inf # Exclude the target row -# # Exclude the target row -# all_dists = np.copy(self.col_distances[column]) -# if not allow_self_neighbor: -# all_dists[row, :] = np.nan -# col_dists = np.nanmean(all_dists, axis=0) -# if not mask_array[row, column] and not allow_self_neighbor: -# col_dists[column] = np.inf # Exclude the target col - -# # Find the row nearest neighbors indexes -# row_nearest_neighbors = np.nonzero(row_dists <= distance_threshold_row)[0] - -# # Find the col nearest neighbors indexes -# col_nearest_neighbors = np.nonzero(col_dists <= distance_threshold_col)[0] - -# # for unobserved col and row neighbors, construct Z_tilde -# col_z_tilde = np.zeros(len(col_nearest_neighbors)) -# row_z_tilde = np.zeros(len(row_nearest_neighbors)) - -# col_obs_mask = mask_array[row, col_nearest_neighbors] -# f_col_obs_mask = self.f(col_obs_mask) -# col_z_tilde[col_obs_mask == 1] = col_nearest_neighbors[col_obs_mask == 1] -# # take mean across entire (obs) column if col neighbor is unobserved -# col_z_tilde[col_obs_mask == 0] = np.mean(data_array[mask_array[:, column] == 1, col_obs_mask == 0], axis = 0) - -# row_obs_mask = mask_array[row_nearest_neighbors, column] -# f_row_obs_mask = self.f(row_obs_mask) -# row_z_tilde[row_obs_mask == 1] = row_nearest_neighbors[row_obs_mask == 1] -# # take mean across entire (obs) row if row neighbor is unobserved -# row_z_tilde[row_obs_mask == 0] = np.mean(data_array[row_obs_mask == 0, mask_array[row_nearest_neighbors, column] == 1], axis = 1) - -# row_z_tilde = self.g(row_z_tilde) -# col_z_tilde = self.g(col_z_tilde) -# # numerator is col_z_tilde + row_z_tilde + intersection -# j_inds, s_inds = np.meshgrid( -# row_nearest_neighbors, col_nearest_neighbors, indexing="ij" -# ) -# mask_js = mask_array[j_inds, s_inds] -# data_js = data_array[j_inds, s_inds] -# # this should be: len(row_nn) + len(col_nn) => row_nn x col_nn. Then mask_js is also row_nn x col_nn -# tot_mask = f_row_obs_mask + f_col_obs_mask.T + mask_js - -# # z est is addition of Z_tilde_row, Z_tilde_col, and intersection (same broadcast as mask) -# z_est = row_z_tilde + col_z_tilde.T + gamma * data_js - -# z_numerator = np.nansum(tot_mask * z_est) -# z_denominator = np.nansum(tot_mask) - -# if z_denominator == 0: -# logger.log( -# logging.WARNING, -# "Warning: Cannot divide by zero in AutoEstimator imputation. Returning np.nan.", -# ) -# return np.array(np.nan) -# return z_numerator / z_denominator - - -# def _calculate_distances( -# self, -# row: int, -# col: int, -# data_array: npt.NDArray, -# mask_array: npt.NDArray, -# data_type: DataType, -# ) -> None: -# """Computes distances, caches them.""" -# # TODO add validation checks here -# n_rows, n_cols = data_array.shape -# row_distances = np.zeros((n_rows, n_cols)) - -# for i in range(n_rows): -# for j in range(i + 1, n_rows): -# overlap_cols = np.logical_and(mask_array[i, :], mask_array[j, :]) -# if not np.any(overlap_cols): -# row_distances[i, j] = np.inf -# row_distances[j, i] = np.inf -# continue -# for k in range(n_cols): -# if not overlap_cols[k]: -# continue -# row_distances[i, j] += data_type.distance( -# data_array[i, k], data_array[j, k] -# ) -# row_distances[i, j] /= np.sum(overlap_cols) -# row_distances[j, i] = row_distances[i, j] -# self.row_distances = row_distances -# """Sets the distances for the imputer. -# Sets the distances as a class attribute, so returns nothing. - -# Args: -# row (int): Row index -# col (int): Column index -# data_array (npt.NDArray): Data matrix -# mask_array (npt.NDArray): Mask matrix -# data_type (DataType): Data type to use (e.g. scalars, distributions) - -# """ -# data_shape = data_array.shape -# n_rows = data_shape[0] -# n_cols = data_shape[1] - -# if row not in self.row_distances: -# # Calculate distances between rows -# row_dists = np.zeros((n_rows, n_cols)) - -# for i in range(n_rows): -# # Get columns observed in both row i and row -# overlap_columns = np.logical_and(mask_array[row], mask_array[i]) - -# if not np.any(overlap_columns): -# row_dists[i, :] = np.nan -# continue - -# # Calculate distance between rows -# for j in range(n_cols): -# if not overlap_columns[ -# j -# ]: # Skip missing values and the target column -# row_dists[i, j] = np.nan -# else: -# row_dists[i, j] = data_type.distance( -# data_array[row, j], data_array[i, j] -# ) -# self.row_distances[row] = row_dists -# # self.row_distances[row][row] = np.inf # Exclude the row itself - -# if col not in self.col_distances: -# # Calculate distances between columns -# col_dists = np.zeros((n_rows, n_cols)) - -# for j in range(n_cols): -# # Get rows observed in both row i and row -# overlap_columns = np.logical_and(mask_array[:, col], mask_array[:, j]) - -# if not np.any(overlap_columns): -# col_dists[:, j] = np.nan -# continue - -# # Calculate distance between columns -# for i in range(n_rows): -# if not overlap_columns[ -# i -# ]: # Skip missing values and the target column -# col_dists[i, j] = np.nan -# else: -# col_dists[i, j] = data_type.distance( -# data_array[i, col], data_array[i, j] -# ) -# self.col_distances[col] = col_dists -# # self.col_distances[col][col] = np.inf \ No newline at end of file diff --git a/src/nearest_neighbors/fit_methods.py b/src/nearest_neighbors/fit_methods.py index 67ce69e..dbdda86 100644 --- a/src/nearest_neighbors/fit_methods.py +++ b/src/nearest_neighbors/fit_methods.py @@ -320,6 +320,7 @@ def fit( imputer.estimation_method = cast(TSEstimator, imputer.estimation_method) return super().fit(data_array, mask_array, imputer) + class AutoDRTSLeaveBlockOutValidation(DualThresholdLeaveBlockOutValidation): """Fit method by leaving out a block of cells using separate thresholds for rows and columns with a AutoEstimator.""" @@ -402,7 +403,12 @@ def _objective(params: dict[str, float]) -> float: ) imputer.estimation_method.alpha = alpha return evaluate_imputation( - data_array, mask_array, imputer, self.block, self.data_type, self.allow_self_neighbor + data_array, + mask_array, + imputer, + self.block, + self.data_type, + self.allow_self_neighbor, ) lower_bound_row, upper_bound_row = self.distance_threshold_range_row From b18b948ed04e535aa5ebf8c2fbe86fbd20288e33 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Wed, 14 May 2025 17:00:46 -0400 Subject: [PATCH 07/19] Add prompteval change --- examples/prompteval/run_distribution.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/examples/prompteval/run_distribution.py b/examples/prompteval/run_distribution.py index bd36e2c..519fb8f 100644 --- a/examples/prompteval/run_distribution.py +++ b/examples/prompteval/run_distribution.py @@ -70,16 +70,6 @@ rng = np.random.default_rng(seed=seed) -match data_type: - case "kernel_mmd": - data_type = DistributionKernelMMD( - kernel="exponential", tuning_parameter=tuning_parameter - ) - case "wasserstein_samples": - data_type = DistributionWassersteinSamples() - case _: - raise ValueError(f"Data type {data_type} not supported") - dataloader = NNData.create( "prompteval", # NOTE: uncomment to run on a subset of models and tasks (for debugging) @@ -90,6 +80,17 @@ ) data, mask = dataloader.process_data_distribution(data_type) +match data_type: + case "kernel_mmd": + data_type = DistributionKernelMMD( + kernel="exponential", tuning_parameter=tuning_parameter + ) + case "wasserstein_samples": + n = data[0, 0].shape[0] + data_type = DistributionWassersteinSamples(num_samples=n) + case _: + raise ValueError(f"Data type {data_type} not supported") + holdout_inds = np.nonzero(mask == 1) inds_rows = holdout_inds[0] inds_cols = holdout_inds[1] From 1da0054cdf1e180bec77161cabb6d7be7ba0cd15 Mon Sep 17 00:00:00 2001 From: Jacob Feitelberg Date: Thu, 15 May 2025 17:44:31 -0400 Subject: [PATCH 08/19] updated prompteval --- examples/prompteval/plot_dist_error.py | 3 ++- examples/prompteval/plot_distribution.py | 6 +++-- examples/prompteval/run_distribution.py | 5 ++-- .../slurm_scripts/run_distribution.sh | 26 +++++++++++++++---- .../datasets/prompteval/loader.py | 12 ++++++--- 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/examples/prompteval/plot_dist_error.py b/examples/prompteval/plot_dist_error.py index 421f8d4..d338a10 100644 --- a/examples/prompteval/plot_dist_error.py +++ b/examples/prompteval/plot_dist_error.py @@ -33,7 +33,8 @@ figures_dir = os.path.join(output_dir, "figures") os.makedirs(figures_dir, exist_ok=True) -files = glob(os.path.join(results_dir, f"est_errors-*-p{propensity}-*.csv")) +files = glob(os.path.join(results_dir, f"est_errors-*-p{propensity}-tp4.0.csv")) +print(files) df_list = [] for file in files: df = pd.read_csv(file) diff --git a/examples/prompteval/plot_distribution.py b/examples/prompteval/plot_distribution.py index 5f935ea..e5f5dff 100644 --- a/examples/prompteval/plot_distribution.py +++ b/examples/prompteval/plot_distribution.py @@ -80,6 +80,8 @@ COLORS = { ("row-row", "lbo", "kernel_mmd"): "teal", ("col-col", "lbo", "kernel_mmd"): "blue", + ("row-row", "lbo", "wasserstein_samples"): "green", + ("col-col", "lbo", "wasserstein_samples"): "gray", } for i, row in df.head(20).iterrows(): @@ -111,7 +113,7 @@ row["data"]["ground_truth"], bins=bins, alpha=0.5, - label="Ground Truth", + label="Ground\nTruth", edgecolor="black", density=True, color="yellow", @@ -130,7 +132,7 @@ ) # Move y-axis outward # Only add legend to the first subplot to avoid clutter - ax.legend() + ax.legend(loc='upper left', fontsize=plotting_utils.LEGEND_FONT_SIZE) figures_path = os.path.join( figures_dir, diff --git a/examples/prompteval/run_distribution.py b/examples/prompteval/run_distribution.py index 519fb8f..49440d1 100644 --- a/examples/prompteval/run_distribution.py +++ b/examples/prompteval/run_distribution.py @@ -78,7 +78,6 @@ propensity=propensity, seed=seed, ) -data, mask = dataloader.process_data_distribution(data_type) match data_type: case "kernel_mmd": @@ -86,11 +85,13 @@ kernel="exponential", tuning_parameter=tuning_parameter ) case "wasserstein_samples": - n = data[0, 0].shape[0] + n = 100 data_type = DistributionWassersteinSamples(num_samples=n) case _: raise ValueError(f"Data type {data_type} not supported") +data, mask = dataloader.process_data_distribution(data_type) + holdout_inds = np.nonzero(mask == 1) inds_rows = holdout_inds[0] inds_cols = holdout_inds[1] diff --git a/examples/prompteval/slurm_scripts/run_distribution.sh b/examples/prompteval/slurm_scripts/run_distribution.sh index aecabc4..9277a00 100755 --- a/examples/prompteval/slurm_scripts/run_distribution.sh +++ b/examples/prompteval/slurm_scripts/run_distribution.sh @@ -9,12 +9,28 @@ METHODS=( "row-row" "col-col" ) -for em in ${METHODS[@]}; + +DATA_TYPE=( + "wasserstein_samples" + "kernel_mmd" +) + +ps=( + "0.1" + "0.5" + "0.9" +) + +for data_type in ${DATA_TYPE[@]}; do - for p in $(seq 0.1 0.1 1.0); + for em in ${METHODS[@]}; do - CMD="python run_distribution.py -od $OUTPUT_DIR -em $em -p $p -tp 4 -s 1 -f" - echo $CMD - eval $CMD + for p in ${ps[@]}; + do + echo $data_type + CMD="python run_distribution.py -em $em -p $p -tp 4.0 --data_type $data_type -s 1 --force" + echo $CMD + eval $CMD + done done done diff --git a/src/nearest_neighbors/datasets/prompteval/loader.py b/src/nearest_neighbors/datasets/prompteval/loader.py index be950a9..f60f5cb 100644 --- a/src/nearest_neighbors/datasets/prompteval/loader.py +++ b/src/nearest_neighbors/datasets/prompteval/loader.py @@ -23,6 +23,7 @@ import logging from joblib import Memory from datasets import load_dataset, Dataset +from tqdm import tqdm memory = Memory(".joblib_cache", verbose=0) @@ -163,6 +164,11 @@ def __init__( seed=self.seed ) # instantiate random seed if provided but do it only once here self.n_examples_per_task = n_examples_per_task + + # print('Loading dataset') + # for task in tqdm(self.tasks): + # # Download the dataset to cache + # load_dataset("PromptEval/PromptEval_MMLU_correctness", name=task) @staticmethod @memory.cache @@ -188,7 +194,7 @@ def load_config_data( dataset = cast( Dataset, load_dataset( - "PromptEval/PromptEval_MMLU_correctness", name=task, split=model + "PromptEval/PromptEval_MMLU_correctness", name=task, split=model, num_proc=12, keep_in_memory=True ), ) # rows are format templates, columns are examples @@ -234,7 +240,7 @@ def process_data_scalar(self) -> tuple[np.ndarray, np.ndarray]: ds = cast( Dataset, load_dataset( - "PromptEval/PromptEval_MMLU_correctness", name=task, split=model + "PromptEval/PromptEval_MMLU_correctness", name=task, split=model, keep_in_memory=True, num_proc=8 ), ) df = cast(pd.DataFrame, ds.to_pandas()) @@ -275,7 +281,7 @@ def process_data_distribution( # Load the data for the multiple config and model df_list = [] - for task in tasks: + for task in tqdm(tasks): for model in models: df = self.load_config_data( task, model, self.n_examples_per_task, self.seed From dc8de0e16f97bd595ada08991a9aa73e419810a8 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Thu, 15 May 2025 17:47:41 -0400 Subject: [PATCH 09/19] Add auto nn to heartsteps --- examples/heartsteps/run_scalar.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/examples/heartsteps/run_scalar.py b/examples/heartsteps/run_scalar.py index 662d04c..386c524 100644 --- a/examples/heartsteps/run_scalar.py +++ b/examples/heartsteps/run_scalar.py @@ -21,12 +21,13 @@ # import nearest neighbor methods from nearest_neighbors.data_types import Scalar -from nearest_neighbors.estimation_methods import StarNNEstimator, TSEstimator +from nearest_neighbors.estimation_methods import StarNNEstimator, TSEstimator, AutoEstimator from nearest_neighbors import NearestNeighborImputer from nearest_neighbors.fit_methods import ( DRLeaveBlockOutValidation, TSLeaveBlockOutValidation, LeaveBlockOutValidation, + AutoDRTSLeaveBlockOutValidation, ) from nearest_neighbors.datasets.dataloader_factory import NNData from nearest_neighbors.vanilla_nn import row_row, col_col @@ -61,7 +62,7 @@ # Load the heartsteps dataset # NOTE: the raw and processed data is cached in .joblib_cache start_time = time() -hs_dataloader = NNData.create("heartsteps", agg="std") +hs_dataloader = NNData.create("heartsteps", agg="mean") data, mask = hs_dataloader.process_data_scalar() data = data[:, :200] # only use the first 200 timesteps mask = mask[:, :200] @@ -269,9 +270,25 @@ distance_threshold_range_col=(0, 1), n_trials=100, data_type=data_type, + allow_self_neighbor=True, ) # for TSNN, self neighbor is necessary (for now) allow_self_neighbor = True + elif estimation_method == "auto": + logger.info("Using AutoNN estimation") + estimator = AutoEstimator(is_percentile=True) + imputer = NearestNeighborImputer(estimator, data_type) + logger.info("Using AutoNN fit method") + # Fit the imputer using leave-block-out validation + fitter = AutoDRTSLeaveBlockOutValidation( + block, + distance_threshold_range_row=(0, 1), + distance_threshold_range_col=(0, 1), + alpha_range=(0, 1), + n_trials=200, + data_type=data_type, + allow_self_neighbor=args.allow_self_neighbor, + ) else: raise ValueError( f"Estimation method {estimation_method} and fit method {fit_method} not supported" From 43fb2a4989902e689e6acd5003b596d5cf088181 Mon Sep 17 00:00:00 2001 From: Albert Gong Date: Tue, 3 Jun 2025 21:35:03 -0400 Subject: [PATCH 10/19] add support for auto nn in prop99 example --- examples/prop99/plot_sc_error.py | 2 +- examples/prop99/plot_synthetic_control.py | 22 ++++++++++++++----- examples/prop99/run_scalar.py | 22 ++++++++++++++++++- examples/prop99/slurm_scripts/run_accuracy.sh | 1 + .../prop99/slurm_scripts/run_california.sh | 1 + src/nearest_neighbors/utils/plotting_utils.py | 10 ++++++--- 6 files changed, 48 insertions(+), 10 deletions(-) diff --git a/examples/prop99/plot_sc_error.py b/examples/prop99/plot_sc_error.py index 3a8ac01..a0f556e 100644 --- a/examples/prop99/plot_sc_error.py +++ b/examples/prop99/plot_sc_error.py @@ -49,7 +49,7 @@ ) # rearrange the order of the estimation methods -ORDER = ["usvt", "softimpute", "col-col", "row-row", "dr", "ts", "star", "sc"] +ORDER = ["usvt", "softimpute", "col-col", "row-row", "dr", "ts", "auto", "star", "sc"] df_grouped = df_grouped.sort_values( by="estimation_method", key=lambda x: x.map(lambda y: ORDER.index(y)) ) diff --git a/examples/prop99/plot_synthetic_control.py b/examples/prop99/plot_synthetic_control.py index 140f88d..5994c30 100644 --- a/examples/prop99/plot_synthetic_control.py +++ b/examples/prop99/plot_synthetic_control.py @@ -59,9 +59,9 @@ # NOTE: va is opposite of what you'd expect (set top to nudge down, bottom to nudge up) match estimation_method: case "dr": + va = "top" + case "col-col": va = "bottom" - # case "col-col": - # va = "bottom" case "row-row": va = "top" case _: @@ -72,13 +72,25 @@ method, # type: ignore fontsize=plotting_utils.TICK_FONT_SIZE, va=va, + color=plotting_utils.COLORS[estimation_method], ) + # # add a line segment from the text label to the last valid value + # ax.plot( + # [2000, 2010], + # [last_valid_value, last_valid_value], + # color=plotting_utils.COLORS[estimation_method], + # linestyle="-", + # ) if i == 0: ax.plot( df.index, df["obs"], label="Observed", linestyle="-", color="orange" ) ax.text( - 2001, df["obs"].iloc[-1], "Obs.", fontsize=plotting_utils.TICK_FONT_SIZE + 2001, + df["obs"].iloc[-1], + "Obs.", + fontsize=plotting_utils.TICK_FONT_SIZE, + color="orange", ) # add a vertical line at 1989 called Proposition 99 ax.axvline(x=1989, color="k", alpha=0.25, linestyle="dotted") @@ -107,7 +119,7 @@ # ax.set_ylim(40, 160) # set the y-axis label to be the number of cigarettes smoked per capita ax.set_ylabel( - "Cigarette Consumption\n(Pack Sales Per Capita)", + "Cigarette Consumption", fontsize=plotting_utils.LABEL_FONT_SIZE, ) @@ -121,7 +133,7 @@ ) # Move y-axis outward # ax.legend(fontsize=plotting_utils.LEGEND_FONT_SIZE) plt.subplots_adjust( - left=0.15, + left=0.2, right=0.85, top=0.95, bottom=0.2, diff --git a/examples/prop99/run_scalar.py b/examples/prop99/run_scalar.py index 798bc38..4575966 100644 --- a/examples/prop99/run_scalar.py +++ b/examples/prop99/run_scalar.py @@ -42,12 +42,17 @@ # %% # import nearest neighbor methods from nearest_neighbors.data_types import Scalar -from nearest_neighbors.estimation_methods import StarNNEstimator, TSEstimator +from nearest_neighbors.estimation_methods import ( + StarNNEstimator, + TSEstimator, + AutoEstimator, +) from nearest_neighbors import NearestNeighborImputer from nearest_neighbors.fit_methods import ( DRLeaveBlockOutValidation, TSLeaveBlockOutValidation, LeaveBlockOutValidation, + AutoDRTSLeaveBlockOutValidation, ) from nearest_neighbors.datasets.dataloader_factory import NNData from nearest_neighbors.vanilla_nn import row_row, col_col @@ -264,6 +269,21 @@ allow_self_neighbor=True, ) allow_self_neighbor = True + elif estimation_method == "auto": + logger.info("Using AutoNN estimation") + estimator = AutoEstimator(is_percentile=is_percentile) + imputer = NearestNeighborImputer(estimator, data_type) + logger.info("Using AutoNN fit method") + # Fit the imputer using leave-block-out validation + fitter = AutoDRTSLeaveBlockOutValidation( + block, + distance_threshold_range_row=(0, 300**2), + distance_threshold_range_col=(0, 300**2), + alpha_range=(0, 1), + n_trials=200, + data_type=data_type, + allow_self_neighbor=allow_self_neighbor, + ) else: raise ValueError( f"Estimation method {estimation_method} and fit method {fit_method} not supported" diff --git a/examples/prop99/slurm_scripts/run_accuracy.sh b/examples/prop99/slurm_scripts/run_accuracy.sh index 4b633f4..65c4e89 100755 --- a/examples/prop99/slurm_scripts/run_accuracy.sh +++ b/examples/prop99/slurm_scripts/run_accuracy.sh @@ -13,6 +13,7 @@ METHODS=( "ts" "star" "softimpute" + "auto" ) CONTROL_STATES=( "TX" "WI" "MT" "RI" "KS" "ME" "UT" "VA" "IN" "GA" diff --git a/examples/prop99/slurm_scripts/run_california.sh b/examples/prop99/slurm_scripts/run_california.sh index 32d426e..4a4c810 100755 --- a/examples/prop99/slurm_scripts/run_california.sh +++ b/examples/prop99/slurm_scripts/run_california.sh @@ -13,6 +13,7 @@ METHODS=( "ts" "star" "softimpute" + "auto" ) for em in ${METHODS[@]}; do diff --git a/src/nearest_neighbors/utils/plotting_utils.py b/src/nearest_neighbors/utils/plotting_utils.py index 566a50b..a9489bc 100644 --- a/src/nearest_neighbors/utils/plotting_utils.py +++ b/src/nearest_neighbors/utils/plotting_utils.py @@ -25,7 +25,8 @@ "softimpute": "Soft\nImpute", "nadaraya": "NW", "star": "AW-\nNN", - "sc": "Synth.", + "sc": "SC", + "auto": "Auto-\nNN", } METHOD_ALIASES_SINGLE_LINE = { @@ -37,7 +38,8 @@ "softimpute": "SI", "nadaraya": "NW", "star": "AWNN", - "sc": "Synth.", + "sc": "SC", + "auto": "AutoNN", } METHOD_LINE_STYLES = { @@ -50,12 +52,13 @@ "nadaraya": "-", "star": "dashdot", "sc": "-", + "auto": "-", } NEURIPS_TEXTWIDTH = 5.5 COLORS = { - "row-row": "grey", + "row-row": "red", "col-col": "grey", "dr": "grey", "ts": "grey", @@ -63,6 +66,7 @@ "softimpute": "lightgrey", "star": "grey", "sc": "blue", + "auto": "grey", } DATA_TYPE_ALIASES = { From ba28bcbdfe3a52ad752eb63676360971a1b62020 Mon Sep 17 00:00:00 2001 From: Albert Gong Date: Tue, 3 Jun 2025 22:28:56 -0400 Subject: [PATCH 11/19] bug fix: AutoNN color/alias --- src/nsquared/utils/plotting_utils.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/nsquared/utils/plotting_utils.py b/src/nsquared/utils/plotting_utils.py index 64a2010..454b326 100644 --- a/src/nsquared/utils/plotting_utils.py +++ b/src/nsquared/utils/plotting_utils.py @@ -25,7 +25,8 @@ "softimpute": "Soft\nImpute", "nadaraya": "NW", "aw": "AW-\nNN", - "sc": "Synth.", + "sc": "SC", + "auto": "Auto-\nNN", } METHOD_ALIASES_SINGLE_LINE = { @@ -36,8 +37,9 @@ "usvt": "USVT", "softimpute": "SI", "nadaraya": "NW", - "aw": "aw", - "sc": "Synth.", + "aw": "AWNN", + "sc": "SC", + "auto": "AutoNN", } METHOD_LINE_STYLES = { @@ -50,12 +52,13 @@ "nadaraya": "-", "aw": "dashdot", "sc": "-", + "auto": "-", } NEURIPS_TEXTWIDTH = 5.5 COLORS = { - "row-row": "grey", + "row-row": "red", "col-col": "grey", "dr": "grey", "ts": "grey", @@ -63,6 +66,7 @@ "softimpute": "lightgrey", "aw": "grey", "sc": "blue", + "auto": "grey", } DATA_TYPE_ALIASES = { From 632e7bd1b3c2d8e054e081ebb6520a8500cb3e59 Mon Sep 17 00:00:00 2001 From: Albert Gong Date: Tue, 3 Jun 2025 22:39:02 -0400 Subject: [PATCH 12/19] removed commented code --- examples/prop99/run_scalar.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/prop99/run_scalar.py b/examples/prop99/run_scalar.py index 265464e..831805e 100644 --- a/examples/prop99/run_scalar.py +++ b/examples/prop99/run_scalar.py @@ -231,7 +231,6 @@ logger.info("Using leave-block-out validation") fitter = LeaveBlockOutValidation( block, - # distance_threshold_range=(0, 50), distance_threshold_range=(0, 300**2), n_trials=200, data_type=data_type, From 1182dd789dc9cccbaace5b2a5446a5eed43a3563 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Tue, 3 Jun 2025 23:03:13 -0400 Subject: [PATCH 13/19] Add scripts for plots --- .../heartsteps/plot_distribution_histogram.py | 99 +++++++++++ examples/prompteval/run_ksbyp_plot.py | 165 ++++++++++++++++++ 2 files changed, 264 insertions(+) create mode 100644 examples/heartsteps/plot_distribution_histogram.py create mode 100644 examples/prompteval/run_ksbyp_plot.py diff --git a/examples/heartsteps/plot_distribution_histogram.py b/examples/heartsteps/plot_distribution_histogram.py new file mode 100644 index 0000000..725c0b1 --- /dev/null +++ b/examples/heartsteps/plot_distribution_histogram.py @@ -0,0 +1,99 @@ +"""Script to plot the distribution of step counts for different estimation methods + +NOTE: imputation time is per imputation, fit time is for the entire fitting procedure +TODO: change fit time to be a bar plot + +Example usage from the examples/heartsteps directory: +```bash +python plot_distribution_histogram.py -od OUTPUT_DIR +``` +""" + +import os + +import matplotlib.pyplot as plt +import logging +import numpy as np + +from nsquared.utils.experiments import get_base_parser +from nsquared.utils import plotting_utils + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +parser = get_base_parser() +args = parser.parse_args() +output_dir = args.output_dir +results_dir = os.path.join(output_dir, "results") +figures_dir = os.path.join(output_dir, "figures") +os.makedirs(figures_dir, exist_ok=True) + +wasserstein_ests = np.load( + os.path.join(results_dir, "imputations-col-col-lbo-wasserstein_samples.npy"), + allow_pickle=True, +) +kernel_ests = np.load( + os.path.join(results_dir, "imputations-col-col-lbo-kernel.npy"), allow_pickle=True +) +ground_truth = np.load( + os.path.join(results_dir, "ground_truth-col-col-lbo.npy"), allow_pickle=True +) + +# NOTE: set the width to be the physical size of the figure in inches +# The NeurIPS text is 5.5 inches wide and 9 inches long +# If we use wrapfigure with 0.4\textwidth, then the figure needs to be 2.2 inches wide +for i in range(0, len(ground_truth)): + fig = plt.figure(figsize=(2.2, 2)) + # Create boxplot + ax = fig.add_subplot(111) + # box = ax.boxplot( + # df_grouped[col_name], patch_artist=True, widths=0.6, showfliers=False + # ) + bins = list(np.linspace(0, 8, 12)) + weights_gt = np.ones_like(ground_truth[i]) / len(ground_truth[i]) + ax.hist( + ground_truth[i], + bins=bins, + weights=weights_gt, + alpha=0.6, + label="Ground truth", + color="white", + edgecolor="black", + linestyle="--", + ) + weights_kernel = np.ones_like(kernel_ests[i]) / len(kernel_ests[i]) + ax.hist( + kernel_ests[i], + bins=bins, + weights=weights_kernel, + alpha=0.6, + label=str(plotting_utils.METHOD_ALIASES_SINGLE_LINE.get("kernel", "kernel")), + color="teal", + ) + weights_wasserstein = np.ones_like(wasserstein_ests[i]) / len(wasserstein_ests[i]) + ax.hist( + wasserstein_ests[i], + bins=bins, + weights=weights_wasserstein, + alpha=0.6, + label=str( + plotting_utils.METHOD_ALIASES_SINGLE_LINE.get("wasserstein_samples", "W2S") + ), + color="orange", + ) + + ax.set_ylim(0, None) + + ax.set_ylabel("Proportion", fontsize=plotting_utils.LABEL_FONT_SIZE) + ax.set_xlabel("Step count", fontsize=plotting_utils.LABEL_FONT_SIZE) + ax.legend(loc="upper right", fontsize=plotting_utils.LEGEND_FONT_SIZE) + + ax.spines["top"].set_visible(False) + ax.spines["right"].set_visible(False) + ax.spines["left"].set_visible(False) + ax.grid(True, alpha=0.4) + + save_path = os.path.join(figures_dir, f"hs_distplot_{i}.pdf") + logger.info(f"Saving plot to {save_path}...") + plt.savefig(save_path, bbox_inches="tight") + plt.close() diff --git a/examples/prompteval/run_ksbyp_plot.py b/examples/prompteval/run_ksbyp_plot.py new file mode 100644 index 0000000..8d7ea33 --- /dev/null +++ b/examples/prompteval/run_ksbyp_plot.py @@ -0,0 +1,165 @@ +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd +import argparse +from nsquared.utils import plotting_utils + +# Define T values and corresponding error rates for each method +T_values = np.array([2**4, 2**5, 2**6, 2**7]) + + +# Define T values and corresponding error rates for each method +T_values = np.array([2**4, 2**5, 2**6, 2**7]) + + +parser = argparse.ArgumentParser(description="Plot estimation errors") +parser.add_argument("--num_sims", type=int, default=30, help="Number of simulations") +parser.add_argument("--output_dir", type=str, help="Output directory") +args = parser.parse_args() +# Define T values (sizes) +T_values = np.array([2**4, 2**5, 2**6, 2**7]) +num_sims = args.num_sims +output_dir = args.output_dir + + +# Function to process a single CSV file and extract errors by size +df_mmd_col_03 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-kernel_mmd-p0.3-tp4.0.csv") +df_mmd_col_05 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-kernel_mmd-p0.5-tp4.0.csv") +df_mmd_col_07 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-kernel_mmd-p0.7-tp4.0.csv") + +df_wasserstein_03 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-wasserstein_samples-p0.3-tp4.0.csv") +df_wasserstein_05 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-wasserstein_samples-p0.5-tp4.0.csv") +df_wasserstein_07 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-wasserstein_samples-p0.7-tp4.0.csv") + +df_mmd_row_03 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-kernel_mmd-p0.3-tp4.0.csv") +df_mmd_row_05 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-kernel_mmd-p0.5-tp4.0.csv") +df_mmd_row_07 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-kernel_mmd-p0.7-tp4.0.csv") + +df_wasserstein_row_03 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-wasserstein_samples-p0.3-tp4.0.csv") +df_wasserstein_row_05 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-wasserstein_samples-p0.5-tp4.0.csv") +df_wasserstein_row_07 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-wasserstein_samples-p0.7-tp4.0.csv") + +df_mmd_col = pd.concat([df_mmd_col_03, df_mmd_col_05, df_mmd_col_07], ignore_index=True) +df_wasserstein_col = pd.concat([df_wasserstein_03, df_wasserstein_05, df_wasserstein_07], ignore_index=True) + +propensity = np.array([0.3, 0.5, 0.7]) + +mmd_col_error_03 = np.array(df_mmd_col_03['est_errors'].values) +mmd_col_error_05 = np.array(df_mmd_col_05['est_errors'].values) +mmd_col_error_07 = np.array(df_mmd_col_07['est_errors'].values) + +mmd_row_error_03 = np.array(df_mmd_row_03['est_errors'].values) +mmd_row_error_05 = np.array(df_mmd_row_05['est_errors'].values) +mmd_row_error_07 = np.array(df_mmd_row_07['est_errors'].values) + +wasserstein_col_error_03 = np.array(df_wasserstein_03['est_errors'].values) +wasserstein_col_error_05 = np.array(df_wasserstein_05['est_errors'].values) +wasserstein_col_error_07 = np.array(df_wasserstein_07['est_errors'].values) + +wasserstein_row_error_03 = np.array(df_wasserstein_row_03['est_errors'].values) +wasserstein_row_error_05 = np.array(df_wasserstein_row_05['est_errors'].values) +wasserstein_row_error_07 = np.array(df_wasserstein_row_07['est_errors'].values) + +mmd_row_errors = np.array([np.nanmean(mmd_row_error_03), np.nanmean(mmd_row_error_05), np.nanmean(mmd_row_error_07)]) +mmd_col_errors = np.array([np.nanmean(mmd_col_error_03), np.nanmean(mmd_col_error_05), np.nanmean(mmd_col_error_07)]) +wasserstein_row_errors = np.array([np.nanmean(wasserstein_row_error_03), np.nanmean(wasserstein_row_error_05), np.nanmean(wasserstein_row_error_07)]) +wasserstein_col_errors = np.array([np.nanmean(wasserstein_col_error_03), np.nanmean(wasserstein_col_error_05), np.nanmean(wasserstein_col_error_07)]) + +mmd_row_stderr = np.array([np.nanstd(mmd_row_error_03) / np.sqrt(mmd_row_error_03.shape), np.nanstd(mmd_row_error_05) / np.sqrt(mmd_row_error_05.shape), np.nanstd(mmd_row_error_07) / np.sqrt(mmd_row_error_07.shape)]) +mmd_col_stderr = np.array([np.nanstd(mmd_col_error_03) / np.sqrt(mmd_col_error_03.shape), np.nanstd(mmd_col_error_05) / np.sqrt(mmd_col_error_05.shape), np.nanstd(mmd_col_error_07) / np.sqrt(mmd_col_error_07.shape)]) +wasserstein_row_stderr = np.array([np.nanstd(wasserstein_row_error_03) / np.sqrt(wasserstein_row_error_03.shape), np.nanstd(wasserstein_row_error_05) / np.sqrt(wasserstein_row_error_05.shape), np.nanstd(wasserstein_row_error_07) / np.sqrt(wasserstein_row_error_07.shape)]) +wasserstein_col_stderr = np.array([np.nanstd(wasserstein_col_error_03) / np.sqrt(wasserstein_col_error_03.shape), np.nanstd(wasserstein_col_error_05) / np.sqrt(wasserstein_col_error_05.shape), np.nanstd(wasserstein_col_error_07) / np.sqrt(wasserstein_col_error_07.shape)]) + +# Create the plot +plt.figure(figsize=(3.25, 2.5)) +#figsize=(plotting_utils.NEURIPS_TEXTWIDTH / 2, 2.5) +# plt.plot(T_values, USVT_errors, 'r', linestyle='-', marker='D', markersize=8, linewidth=2, label=r'USVT: $T^{-0.46}$') + + +def _add_regression_line( + x: np.ndarray, y: np.ndarray, color: str, label: str, linestyle: str +) -> float: + # Fit a line to log-transformed data + slope, intercept = np.polyfit(x, y, 1) + plt.plot( + x, slope*x + intercept, color=color, linestyle=linestyle, linewidth=2 + ) + # label=f"{label} (slope: {slope:.2f})") + return slope + + +col_mmd_slope = _add_regression_line(propensity, mmd_col_errors, "blue", "", ":") +row_mmd_slope = _add_regression_line(propensity, mmd_row_errors, "magenta", "", ":") +col_wasserstein_slope = _add_regression_line(propensity, wasserstein_col_errors, "red", "", "--") +row_wasserstein_slope = _add_regression_line(propensity, wasserstein_row_errors, "green", "", "--") +# softimpute_slope = add_regression_line(T_values, Softimpute_errors, 'black', 'SoftImpute', ':') + +def _format_lbl(method:str) -> str: + return str(plotting_utils.METHOD_ALIASES_SINGLE_LINE.get(method, method)) + +plt.errorbar( + propensity, + mmd_col_errors, + fmt="Db", + yerr=mmd_col_stderr.squeeze(), + markersize=5, + linestyle="None", + label=rf"{_format_lbl('kernel')} (col)", +) +plt.errorbar( + propensity, + mmd_row_errors, + fmt="mo", + yerr=mmd_row_stderr.squeeze(), + markersize=5, + linestyle="None", + label=rf"{_format_lbl('kernel')} (row)", +) +plt.errorbar( + propensity, + wasserstein_col_errors, + fmt="vr", + yerr=wasserstein_col_stderr.squeeze(), + markersize=5, + linestyle="None", + label=rf"{_format_lbl('wasserstein_samples')} (col)", +) +plt.errorbar( + propensity, + wasserstein_row_errors, + fmt="^g", + yerr=wasserstein_row_stderr.squeeze(), + markersize=5, + linestyle="None", + label=rf"{_format_lbl('wasserstein_samples')} (row)", +) + +# Axis labels +plt.xlabel(r"Propensity (p)", fontsize=plotting_utils.LABEL_FONT_SIZE) +plt.ylabel(r"Kolmogorov-Smirnov distance", fontsize=plotting_utils.LABEL_FONT_SIZE) + +# Title +# plt.title(r'Decay of avg. error across users (N = T, 30 trials)', fontsize=16) + +# Add legend +plt.legend(fontsize=plotting_utils.LEGEND_FONT_SIZE, loc="upper right") + +# set tick font size +#print(plotting_utils.TICK_FONT_SIZE) +plt.tick_params(axis="both", which="major", labelsize=plotting_utils.LABEL_FONT_SIZE) + +# set exact x ticks +plt.xticks( + [0.3, 0.5, 0.7], + fontsize=plotting_utils.LABEL_FONT_SIZE, +) +# Grid for better readability +# plt.grid(True, which="both", linestyle='--', linewidth=0.5) +ax1 = plt.gca() +ax1.spines["top"].set_visible(False) +ax1.spines["right"].set_visible(False) +ax1.spines["left"].set_visible(False) +ax1.grid(True, alpha=0.4) +plt.tight_layout() +# Show the plot +plt.savefig(f"{output_dir}/ksbyp_prompteval_plot.pdf", bbox_inches="tight") From 954952ce1f703e5eae65a6bd0d774585951908a7 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Tue, 3 Jun 2025 23:08:10 -0400 Subject: [PATCH 14/19] Fix linter errs --- examples/prompteval/run_ksbyp_plot.py | 160 +++++++++++++++++++------- 1 file changed, 119 insertions(+), 41 deletions(-) diff --git a/examples/prompteval/run_ksbyp_plot.py b/examples/prompteval/run_ksbyp_plot.py index 8d7ea33..2ac94e9 100644 --- a/examples/prompteval/run_ksbyp_plot.py +++ b/examples/prompteval/run_ksbyp_plot.py @@ -23,56 +23,130 @@ # Function to process a single CSV file and extract errors by size -df_mmd_col_03 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-kernel_mmd-p0.3-tp4.0.csv") -df_mmd_col_05 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-kernel_mmd-p0.5-tp4.0.csv") -df_mmd_col_07 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-kernel_mmd-p0.7-tp4.0.csv") +df_mmd_col_03 = pd.read_csv( + f"{output_dir}/results/est_errors-col-col-lbo-kernel_mmd-p0.3-tp4.0.csv" +) +df_mmd_col_05 = pd.read_csv( + f"{output_dir}/results/est_errors-col-col-lbo-kernel_mmd-p0.5-tp4.0.csv" +) +df_mmd_col_07 = pd.read_csv( + f"{output_dir}/results/est_errors-col-col-lbo-kernel_mmd-p0.7-tp4.0.csv" +) -df_wasserstein_03 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-wasserstein_samples-p0.3-tp4.0.csv") -df_wasserstein_05 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-wasserstein_samples-p0.5-tp4.0.csv") -df_wasserstein_07 = pd.read_csv(f"{output_dir}/results/est_errors-col-col-lbo-wasserstein_samples-p0.7-tp4.0.csv") +df_wasserstein_03 = pd.read_csv( + f"{output_dir}/results/est_errors-col-col-lbo-wasserstein_samples-p0.3-tp4.0.csv" +) +df_wasserstein_05 = pd.read_csv( + f"{output_dir}/results/est_errors-col-col-lbo-wasserstein_samples-p0.5-tp4.0.csv" +) +df_wasserstein_07 = pd.read_csv( + f"{output_dir}/results/est_errors-col-col-lbo-wasserstein_samples-p0.7-tp4.0.csv" +) -df_mmd_row_03 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-kernel_mmd-p0.3-tp4.0.csv") -df_mmd_row_05 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-kernel_mmd-p0.5-tp4.0.csv") -df_mmd_row_07 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-kernel_mmd-p0.7-tp4.0.csv") +df_mmd_row_03 = pd.read_csv( + f"{output_dir}/results/est_errors-row-row-lbo-kernel_mmd-p0.3-tp4.0.csv" +) +df_mmd_row_05 = pd.read_csv( + f"{output_dir}/results/est_errors-row-row-lbo-kernel_mmd-p0.5-tp4.0.csv" +) +df_mmd_row_07 = pd.read_csv( + f"{output_dir}/results/est_errors-row-row-lbo-kernel_mmd-p0.7-tp4.0.csv" +) -df_wasserstein_row_03 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-wasserstein_samples-p0.3-tp4.0.csv") -df_wasserstein_row_05 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-wasserstein_samples-p0.5-tp4.0.csv") -df_wasserstein_row_07 = pd.read_csv(f"{output_dir}/results/est_errors-row-row-lbo-wasserstein_samples-p0.7-tp4.0.csv") +df_wasserstein_row_03 = pd.read_csv( + f"{output_dir}/results/est_errors-row-row-lbo-wasserstein_samples-p0.3-tp4.0.csv" +) +df_wasserstein_row_05 = pd.read_csv( + f"{output_dir}/results/est_errors-row-row-lbo-wasserstein_samples-p0.5-tp4.0.csv" +) +df_wasserstein_row_07 = pd.read_csv( + f"{output_dir}/results/est_errors-row-row-lbo-wasserstein_samples-p0.7-tp4.0.csv" +) df_mmd_col = pd.concat([df_mmd_col_03, df_mmd_col_05, df_mmd_col_07], ignore_index=True) -df_wasserstein_col = pd.concat([df_wasserstein_03, df_wasserstein_05, df_wasserstein_07], ignore_index=True) +df_wasserstein_col = pd.concat( + [df_wasserstein_03, df_wasserstein_05, df_wasserstein_07], ignore_index=True +) propensity = np.array([0.3, 0.5, 0.7]) -mmd_col_error_03 = np.array(df_mmd_col_03['est_errors'].values) -mmd_col_error_05 = np.array(df_mmd_col_05['est_errors'].values) -mmd_col_error_07 = np.array(df_mmd_col_07['est_errors'].values) +mmd_col_error_03 = np.array(df_mmd_col_03["est_errors"].values) +mmd_col_error_05 = np.array(df_mmd_col_05["est_errors"].values) +mmd_col_error_07 = np.array(df_mmd_col_07["est_errors"].values) -mmd_row_error_03 = np.array(df_mmd_row_03['est_errors'].values) -mmd_row_error_05 = np.array(df_mmd_row_05['est_errors'].values) -mmd_row_error_07 = np.array(df_mmd_row_07['est_errors'].values) +mmd_row_error_03 = np.array(df_mmd_row_03["est_errors"].values) +mmd_row_error_05 = np.array(df_mmd_row_05["est_errors"].values) +mmd_row_error_07 = np.array(df_mmd_row_07["est_errors"].values) -wasserstein_col_error_03 = np.array(df_wasserstein_03['est_errors'].values) -wasserstein_col_error_05 = np.array(df_wasserstein_05['est_errors'].values) -wasserstein_col_error_07 = np.array(df_wasserstein_07['est_errors'].values) +wasserstein_col_error_03 = np.array(df_wasserstein_03["est_errors"].values) +wasserstein_col_error_05 = np.array(df_wasserstein_05["est_errors"].values) +wasserstein_col_error_07 = np.array(df_wasserstein_07["est_errors"].values) -wasserstein_row_error_03 = np.array(df_wasserstein_row_03['est_errors'].values) -wasserstein_row_error_05 = np.array(df_wasserstein_row_05['est_errors'].values) -wasserstein_row_error_07 = np.array(df_wasserstein_row_07['est_errors'].values) +wasserstein_row_error_03 = np.array(df_wasserstein_row_03["est_errors"].values) +wasserstein_row_error_05 = np.array(df_wasserstein_row_05["est_errors"].values) +wasserstein_row_error_07 = np.array(df_wasserstein_row_07["est_errors"].values) -mmd_row_errors = np.array([np.nanmean(mmd_row_error_03), np.nanmean(mmd_row_error_05), np.nanmean(mmd_row_error_07)]) -mmd_col_errors = np.array([np.nanmean(mmd_col_error_03), np.nanmean(mmd_col_error_05), np.nanmean(mmd_col_error_07)]) -wasserstein_row_errors = np.array([np.nanmean(wasserstein_row_error_03), np.nanmean(wasserstein_row_error_05), np.nanmean(wasserstein_row_error_07)]) -wasserstein_col_errors = np.array([np.nanmean(wasserstein_col_error_03), np.nanmean(wasserstein_col_error_05), np.nanmean(wasserstein_col_error_07)]) +mmd_row_errors = np.array( + [ + np.nanmean(mmd_row_error_03), + np.nanmean(mmd_row_error_05), + np.nanmean(mmd_row_error_07), + ] +) +mmd_col_errors = np.array( + [ + np.nanmean(mmd_col_error_03), + np.nanmean(mmd_col_error_05), + np.nanmean(mmd_col_error_07), + ] +) +wasserstein_row_errors = np.array( + [ + np.nanmean(wasserstein_row_error_03), + np.nanmean(wasserstein_row_error_05), + np.nanmean(wasserstein_row_error_07), + ] +) +wasserstein_col_errors = np.array( + [ + np.nanmean(wasserstein_col_error_03), + np.nanmean(wasserstein_col_error_05), + np.nanmean(wasserstein_col_error_07), + ] +) -mmd_row_stderr = np.array([np.nanstd(mmd_row_error_03) / np.sqrt(mmd_row_error_03.shape), np.nanstd(mmd_row_error_05) / np.sqrt(mmd_row_error_05.shape), np.nanstd(mmd_row_error_07) / np.sqrt(mmd_row_error_07.shape)]) -mmd_col_stderr = np.array([np.nanstd(mmd_col_error_03) / np.sqrt(mmd_col_error_03.shape), np.nanstd(mmd_col_error_05) / np.sqrt(mmd_col_error_05.shape), np.nanstd(mmd_col_error_07) / np.sqrt(mmd_col_error_07.shape)]) -wasserstein_row_stderr = np.array([np.nanstd(wasserstein_row_error_03) / np.sqrt(wasserstein_row_error_03.shape), np.nanstd(wasserstein_row_error_05) / np.sqrt(wasserstein_row_error_05.shape), np.nanstd(wasserstein_row_error_07) / np.sqrt(wasserstein_row_error_07.shape)]) -wasserstein_col_stderr = np.array([np.nanstd(wasserstein_col_error_03) / np.sqrt(wasserstein_col_error_03.shape), np.nanstd(wasserstein_col_error_05) / np.sqrt(wasserstein_col_error_05.shape), np.nanstd(wasserstein_col_error_07) / np.sqrt(wasserstein_col_error_07.shape)]) +mmd_row_stderr = np.array( + [ + np.nanstd(mmd_row_error_03) / np.sqrt(mmd_row_error_03.shape), + np.nanstd(mmd_row_error_05) / np.sqrt(mmd_row_error_05.shape), + np.nanstd(mmd_row_error_07) / np.sqrt(mmd_row_error_07.shape), + ] +) +mmd_col_stderr = np.array( + [ + np.nanstd(mmd_col_error_03) / np.sqrt(mmd_col_error_03.shape), + np.nanstd(mmd_col_error_05) / np.sqrt(mmd_col_error_05.shape), + np.nanstd(mmd_col_error_07) / np.sqrt(mmd_col_error_07.shape), + ] +) +wasserstein_row_stderr = np.array( + [ + np.nanstd(wasserstein_row_error_03) / np.sqrt(wasserstein_row_error_03.shape), + np.nanstd(wasserstein_row_error_05) / np.sqrt(wasserstein_row_error_05.shape), + np.nanstd(wasserstein_row_error_07) / np.sqrt(wasserstein_row_error_07.shape), + ] +) +wasserstein_col_stderr = np.array( + [ + np.nanstd(wasserstein_col_error_03) / np.sqrt(wasserstein_col_error_03.shape), + np.nanstd(wasserstein_col_error_05) / np.sqrt(wasserstein_col_error_05.shape), + np.nanstd(wasserstein_col_error_07) / np.sqrt(wasserstein_col_error_07.shape), + ] +) # Create the plot plt.figure(figsize=(3.25, 2.5)) -#figsize=(plotting_utils.NEURIPS_TEXTWIDTH / 2, 2.5) +# figsize=(plotting_utils.NEURIPS_TEXTWIDTH / 2, 2.5) # plt.plot(T_values, USVT_errors, 'r', linestyle='-', marker='D', markersize=8, linewidth=2, label=r'USVT: $T^{-0.46}$') @@ -81,22 +155,26 @@ def _add_regression_line( ) -> float: # Fit a line to log-transformed data slope, intercept = np.polyfit(x, y, 1) - plt.plot( - x, slope*x + intercept, color=color, linestyle=linestyle, linewidth=2 - ) + plt.plot(x, slope * x + intercept, color=color, linestyle=linestyle, linewidth=2) # label=f"{label} (slope: {slope:.2f})") return slope col_mmd_slope = _add_regression_line(propensity, mmd_col_errors, "blue", "", ":") row_mmd_slope = _add_regression_line(propensity, mmd_row_errors, "magenta", "", ":") -col_wasserstein_slope = _add_regression_line(propensity, wasserstein_col_errors, "red", "", "--") -row_wasserstein_slope = _add_regression_line(propensity, wasserstein_row_errors, "green", "", "--") +col_wasserstein_slope = _add_regression_line( + propensity, wasserstein_col_errors, "red", "", "--" +) +row_wasserstein_slope = _add_regression_line( + propensity, wasserstein_row_errors, "green", "", "--" +) # softimpute_slope = add_regression_line(T_values, Softimpute_errors, 'black', 'SoftImpute', ':') -def _format_lbl(method:str) -> str: + +def _format_lbl(method: str) -> str: return str(plotting_utils.METHOD_ALIASES_SINGLE_LINE.get(method, method)) + plt.errorbar( propensity, mmd_col_errors, @@ -145,7 +223,7 @@ def _format_lbl(method:str) -> str: plt.legend(fontsize=plotting_utils.LEGEND_FONT_SIZE, loc="upper right") # set tick font size -#print(plotting_utils.TICK_FONT_SIZE) +# print(plotting_utils.TICK_FONT_SIZE) plt.tick_params(axis="both", which="major", labelsize=plotting_utils.LABEL_FONT_SIZE) # set exact x ticks From 9724bb9aa012fe178d81652243f78e4633646d0a Mon Sep 17 00:00:00 2001 From: Albert Gong Date: Tue, 3 Jun 2025 23:16:39 -0400 Subject: [PATCH 15/19] pass rng to LeaveBlockOutValidation --- examples/prop99/run_scalar.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/prop99/run_scalar.py b/examples/prop99/run_scalar.py index 831805e..ed2386d 100644 --- a/examples/prop99/run_scalar.py +++ b/examples/prop99/run_scalar.py @@ -107,7 +107,7 @@ logger.info(f"Time to load and process data: {elapsed_time:.2f} seconds") treatment_row = 0 # row corresponding to treated unit (California) -logger.info(f"Mask for row {treatment_row}:", mask[treatment_row]) +logger.info(f"Mask for row {treatment_row}: {mask[treatment_row]}") # %% logger.info("Using scalar data type") @@ -235,6 +235,7 @@ n_trials=200, data_type=data_type, allow_self_neighbor=allow_self_neighbor, + rng=rng, ) elif estimation_method == "col-col": logger.info("Using col-col estimation") @@ -247,6 +248,7 @@ n_trials=200, data_type=data_type, allow_self_neighbor=allow_self_neighbor, + rng=rng, ) elif estimation_method == "ts": logger.info("Using two-sided estimation") From 2470ccfbbb5fc2894e5d1a969f67fe650010ea05 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Tue, 10 Jun 2025 23:07:27 -0400 Subject: [PATCH 16/19] Simulation readme update and more cleanup --- examples/heartsteps/plot_error_and_time.py | 9 +- examples/heartsteps/run_distribution.py | 10 +- .../heartsteps/slurm_scripts/run_accuracy.sh | 1 + examples/prompteval/run_distribution.py | 4 +- .../slurm_scripts/run_distribution.sh | 6 +- examples/simulations/README.md | 12 ++ .../example_plots/sims_plot_highsnr.pdf | Bin 0 -> 231668 bytes .../example_plots/sims_plot_lowsnr.pdf | Bin 0 -> 231664 bytes examples/simulations/plot_size_error.py | 105 ++++++++++-------- examples/simulations/run_scalar.py | 12 +- .../simulations/slurm_scripts/run_accuracy.sh | 39 +++++-- src/nsquared/datasets/prompteval/loader.py | 5 +- src/nsquared/utils/plotting_utils.py | 13 ++- 13 files changed, 141 insertions(+), 75 deletions(-) create mode 100644 examples/simulations/README.md create mode 100644 examples/simulations/example_plots/sims_plot_highsnr.pdf create mode 100644 examples/simulations/example_plots/sims_plot_lowsnr.pdf diff --git a/examples/heartsteps/plot_error_and_time.py b/examples/heartsteps/plot_error_and_time.py index 4a22eac..98403ea 100644 --- a/examples/heartsteps/plot_error_and_time.py +++ b/examples/heartsteps/plot_error_and_time.py @@ -32,6 +32,7 @@ files = glob(os.path.join(results_dir, "est_errors-*.csv")) df_list = [] for file in files: + print(file) df = pd.read_csv(file) df_list.append(df) df = pd.concat(df_list, ignore_index=True) @@ -43,8 +44,8 @@ .reset_index() ) # rearrange the order of the estimation methods by -# "usvt", "row-row", "col-col", "dr", "ts", "aw" -ORDER = ["usvt", "softimpute", "col-col", "row-row", "dr", "ts", "aw"] +# "usvt", "row-row", "col-col", "dr", "ts", "star" +ORDER = ["usvt", "softimpute", "col-col", "row-row", "dr", "ts", "auto", "star", "kernel", "wasserstein_samples"] df_grouped = df_grouped.sort_values( by="estimation_method", key=lambda x: x.map(lambda y: ORDER.index(y)) ) @@ -57,7 +58,7 @@ # NOTE: set the width to be the physical size of the figure in inches # The NeurIPS text is 5.5 inches wide and 9 inches long # If we use wrapfigure with 0.4\textwidth, then the figure needs to be 2.2 inches wide - fig = plt.figure(figsize=(2.2, 2)) + fig = plt.figure(figsize=(3.25, 2)) # Create boxplot ax = fig.add_subplot(111) box = ax.boxplot( @@ -83,7 +84,7 @@ ) ax.tick_params(axis="x", length=0) # Set tick length to 0 ax.set_ylabel(alias, fontsize=plotting_utils.LABEL_FONT_SIZE) - # ax.set_xlabel("Estimation method", fontsize=plotting_utils.LABEL_FONT_SIZE) + #ax.set_xlabel("Estimation methods",color="white", fontsize=plotting_utils.LABEL_FONT_SIZE) ax.spines["top"].set_visible(False) ax.spines["right"].set_visible(False) diff --git a/examples/heartsteps/run_distribution.py b/examples/heartsteps/run_distribution.py index d0f1b29..000efc9 100644 --- a/examples/heartsteps/run_distribution.py +++ b/examples/heartsteps/run_distribution.py @@ -22,6 +22,7 @@ from nsquared.data_types import ( DistributionKernelMMD, DistributionWassersteinSamples, + Scalar ) from nsquared import NearestNeighborImputer from nsquared.fit_methods import ( @@ -61,7 +62,7 @@ # Load the heartsteps dataset # NOTE: the raw and processed data is cached in .joblib_cache start_time = time() -hs_dataloader = NNData.create("heartsteps") +hs_dataloader = NNData.create("heartsteps", freq="1min", num_measurements=60) data, mask = hs_dataloader.process_data_distribution() data = data[:, :200] # only use the first 200 timesteps mask = mask[:, :200] @@ -197,15 +198,16 @@ ground_truth = data[test_inds_rows, test_inds_cols] est_errors = [] +error_datatype = Scalar() for i in range(len(imputations)): - est_errors.append(imputer.data_type.distance(imputations[i], ground_truth[i])) + est_errors.append(error_datatype.distance(np.nanmean(imputations[i]), np.nanmean(ground_truth[i]))) # est_errors = np.abs(imputations - ground_truth) logger.info(f"Mean absolute error: {np.mean(est_errors)}") save_imputations = np.array(imputations, dtype=object) ground_truth = np.array(ground_truth, dtype=object) # save imputations to pkl imputations_save_path = os.path.join( - results_dir, f"imputations-{estimation_method}-{fit_method}.npy" + results_dir, f"imputations-{estimation_method}-{fit_method}-{args.data_type}.npy" ) logger.info(f"Saving imputations to {imputations_save_path}...") np.save(imputations_save_path, save_imputations) @@ -218,7 +220,7 @@ df = pd.DataFrame( data={ - "estimation_method": estimation_method, + "estimation_method": args.data_type, # "imputation": save_imputations, # "ground_truth": ground_truth, "data_type": args.data_type, diff --git a/examples/heartsteps/slurm_scripts/run_accuracy.sh b/examples/heartsteps/slurm_scripts/run_accuracy.sh index db7da6d..9e0d3ce 100755 --- a/examples/heartsteps/slurm_scripts/run_accuracy.sh +++ b/examples/heartsteps/slurm_scripts/run_accuracy.sh @@ -14,6 +14,7 @@ METHODS=( "dr" "ts" "aw" + "auto" ) for em in ${METHODS[@]}; do diff --git a/examples/prompteval/run_distribution.py b/examples/prompteval/run_distribution.py index 0fa11f0..a2c69eb 100644 --- a/examples/prompteval/run_distribution.py +++ b/examples/prompteval/run_distribution.py @@ -134,7 +134,7 @@ raise ValueError(f"Estimation method {estimation_method} not supported") fit_method = LeaveBlockOutValidation( - block, distance_threshold_range=(0, 1.0), n_trials=10, data_type=data_type, rng=rng + block, distance_threshold_range=(0, 1.0), n_trials=50, data_type=data_type, rng=rng ) imputer = NearestNeighborImputer( estimator, @@ -187,4 +187,4 @@ print(df[["est_errors"]].describe()) logger.info(f"Saving est_errors to {save_path}...") -df.to_csv(save_path, index=False) +df.to_csv(save_path, index=False) \ No newline at end of file diff --git a/examples/prompteval/slurm_scripts/run_distribution.sh b/examples/prompteval/slurm_scripts/run_distribution.sh index 9277a00..6736534 100755 --- a/examples/prompteval/slurm_scripts/run_distribution.sh +++ b/examples/prompteval/slurm_scripts/run_distribution.sh @@ -16,9 +16,9 @@ DATA_TYPE=( ) ps=( - "0.1" + "0.3" "0.5" - "0.9" + "0.7" ) for data_type in ${DATA_TYPE[@]}; @@ -28,7 +28,7 @@ do for p in ${ps[@]}; do echo $data_type - CMD="python run_distribution.py -em $em -p $p -tp 4.0 --data_type $data_type -s 1 --force" + CMD="python run_distribution.py -em $em -p $p -tp 4.0 --data_type $data_type -s 1 --force -od $OUTPUT_DIR" echo $CMD eval $CMD done diff --git a/examples/simulations/README.md b/examples/simulations/README.md new file mode 100644 index 0000000..2282fb7 --- /dev/null +++ b/examples/simulations/README.md @@ -0,0 +1,12 @@ +# Replicating experiments +![High SNR Figure](example_plots/sims_plot_highsnr.pdf) + +To replicate Figure 1, run the following commands while in the `examples/simulations` directory. + +```bash +# Run simulated experiments with high SNR (noise std = 0.001) +./slurm_scripts run_acccuracy.sh -o OUTPUT_DIR -l ERROR -n 0.001 +# Plot the figure +python plot_size_error.py --output_dir OUTPUT_DIR +``` +To replicate the low SNR case, run the same commands with option `-n 1.0` instead. \ No newline at end of file diff --git a/examples/simulations/example_plots/sims_plot_highsnr.pdf b/examples/simulations/example_plots/sims_plot_highsnr.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dd313d546c59f250d6754921b7d1e8331ad7c673 GIT binary patch literal 231668 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%0Di@ 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/simulations/example_plots/sims_plot_lowsnr.pdf b/examples/simulations/example_plots/sims_plot_lowsnr.pdf new file mode 100644 index 0000000000000000000000000000000000000000..084face0acfdd04ba124f6307678e185b488ea19 GIT binary patch literal 231664 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 Z>Edea?D~5PgGT~!vm;SaNhnDo{T~Y1>^T4c literal 0 HcmV?d00001 diff --git a/examples/simulations/plot_size_error.py b/examples/simulations/plot_size_error.py index 6844ce9..3c016ee 100644 --- a/examples/simulations/plot_size_error.py +++ b/examples/simulations/plot_size_error.py @@ -2,13 +2,14 @@ import matplotlib.pyplot as plt import pandas as pd import argparse +from nsquared.utils import plotting_utils # Define T values and corresponding error rates for each method -T_values = np.array([2**4, 2**5, 2**6, 2**7]) +#T_values = np.array([2**4, 2**5, 2**6, 2**7]) # Define T values and corresponding error rates for each method -T_values = np.array([2**4, 2**5, 2**6, 2**7]) +#T_values = np.array([2**4, 2**5, 2**6, 2**7]) parser = argparse.ArgumentParser(description="Plot estimation errors") @@ -41,8 +42,8 @@ def _process_csv(filepath: str) -> np.ndarray: # Process each CSV file -col_err = _process_csv(f"{output_dir}/results/est_errors-col-col-lbo.csv") -row_err = _process_csv(f"{output_dir}/results/est_errors-row-row-lbo.csv") +#col_err = _process_csv(f"{output_dir}/results/est_errors-col-col-lbo.csv") +#ow_err = _process_csv(f"{output_dir}/results/est_errors-row-row-lbo.csv") # usvt_err = process_csv(f"{output_dir}/results/est_errors-usvt-lbo.csv") drnn_err = _process_csv(f"{output_dir}/results/est_errors-dr-lbo.csv") tsnn_err = _process_csv(f"{output_dir}/results/est_errors-ts-lbo.csv") @@ -52,8 +53,8 @@ def _process_csv(filepath: str) -> np.ndarray: # Extract errors for each method as a numpy array 4 x 30 # USVT_errors = 2**-3 * T_values**-0.10 -UserNN_errors = np.nanmean(row_err, axis=1) -TimeNN_errors = np.nanmean(col_err, axis=1) +#UserNN_errors = np.nanmean(row_err, axis=1) +#TimeNN_errors = np.nanmean(col_err, axis=1) DRNN_errors = np.nanmean(drnn_err, axis=1) # USVT_errors = np.nanmean(usvt_err, axis = 1) TSNN_errors = np.nanmean(tsnn_err, axis=1) @@ -61,8 +62,8 @@ def _process_csv(filepath: str) -> np.ndarray: Auto_errors = np.nanmean(auto_err, axis=1) -unn_stderr = np.nanstd(row_err, axis=1) / np.sqrt(row_err.shape[1]) -tnn_stderr = np.nanstd(col_err, axis=1) / np.sqrt(col_err.shape[1]) +#unn_stderr = np.nanstd(row_err, axis=1) / np.sqrt(row_err.shape[1]) +#tnn_stderr = np.nanstd(col_err, axis=1) / np.sqrt(col_err.shape[1]) drnn_stderr = np.nanstd(drnn_err, axis=1) / np.sqrt(drnn_err.shape[1]) # usvt_stderr = np.nanstd(usvt_err, axis = 1) / np.sqrt(usvt_err.shape[1]) tsnn_stderr = np.nanstd(tsnn_err, axis=1) / np.sqrt(tsnn_err.shape[1]) @@ -71,7 +72,8 @@ def _process_csv(filepath: str) -> np.ndarray: # Create the plot -plt.figure() +plt.figure(figsize=(plotting_utils.NEURIPS_TEXTWIDTH / 2, 2.5)) +#figsize=(plotting_utils.NEURIPS_TEXTWIDTH / 2, 2.5) # plt.plot(T_values, USVT_errors, 'r', linestyle='-', marker='D', markersize=8, linewidth=2, label=r'USVT: $T^{-0.46}$') @@ -88,62 +90,65 @@ def _add_regression_line( # usvt_slope = add_regression_line(T_values, USVT_errors, 'red', 'USVT', '--') -unn_slope = _add_regression_line(T_values, UserNN_errors, "green", "User-NN", ":") -tnn_slope = _add_regression_line(T_values, TimeNN_errors, "orange", "Time-NN", ":") -drnn_slope = _add_regression_line(T_values, DRNN_errors, "blue", "DR-NN", "--") -tsnn_slope = _add_regression_line(T_values, TSNN_errors, "purple", "Time-NN", ":") -auto_slope = _add_regression_line(T_values, Auto_errors, "orange", "Auto", ":") +#unn_slope = _add_regression_line(T_values, UserNN_errors, "green", "User-NN", ":") +#tnn_slope = _add_regression_line(T_values, TimeNN_errors, "orange", "Time-NN", ":") +drnn_slope = _add_regression_line(T_values, DRNN_errors, "blue", "DR-NN", ":") +tsnn_slope = _add_regression_line(T_values, TSNN_errors, "green", "Time-NN", ":") +auto_slope = _add_regression_line(T_values, Auto_errors, "red", "Auto-NN", "--") # softimpute_slope = add_regression_line(T_values, Softimpute_errors, 'black', 'SoftImpute', ':') # Plot each method with corresponding markers, colors, and line styles # plt.errorbar(T_values, USVT_errors, yerr=usvt_stderr, fmt = 'r', marker='>', markersize=12, linestyle='None', barsabove=True, label=rf'USVT: $T^{{{usvt_slope:.2f}}}$') -plt.errorbar( - T_values, - UserNN_errors, - yerr=unn_stderr, - fmt="g", - marker="o", - markersize=12, - linestyle="None", - label=rf"Row-NN: $T^{{{unn_slope:.2f}}}$", -) -plt.errorbar( - T_values, - TimeNN_errors, - yerr=tnn_stderr, - fmt="s", - color="orange", - marker="s", - linestyle="None", - markersize=12, - label=rf"Col-NN: $T^{{{tnn_slope:.2f}}}$", -) +# plt.errorbar( +# T_values, +# UserNN_errors, +# yerr=unn_stderr, +# fmt="g", +# marker="o", +# markersize=12, +# linestyle="None", +# label=rf"Row-NN: $T^{{{unn_slope:.2f}}}$", +# ) +# plt.errorbar( +# T_values, +# TimeNN_errors, +# yerr=tnn_stderr, +# fmt="s", +# color="orange", +# marker="s", +# linestyle="None", +# markersize=12, +# label=rf"Col-NN: $T^{{{tnn_slope:.2f}}}$", +# ) +def _format_lbl(method:str) -> str: + return str(plotting_utils.METHOD_ALIASES_SINGLE_LINE.get(method, method)) + plt.errorbar( T_values, DRNN_errors, - fmt="bD", + fmt="Db", yerr=drnn_stderr, - markersize=12, + markersize=5, linestyle="None", - label=rf"DR-NN: $T^{{{drnn_slope:.2f}}}$", + label=rf"{_format_lbl('dr')}: $T^{{{drnn_slope:.2f}}}$", ) plt.errorbar( T_values, TSNN_errors, - fmt="p", + fmt="go", yerr=tsnn_stderr, - markersize=12, + markersize=5, linestyle="None", - label=rf"TS-NN: $T^{{{tsnn_slope:.2f}}}$", + label=rf"{_format_lbl('ts')}: $T^{{{tsnn_slope:.2f}}}$", ) plt.errorbar( T_values, Auto_errors, - fmt="o", + fmt="vr", yerr=auto_stderr, - markersize=12, + markersize=5, linestyle="None", - label=rf"Auto-NN: $T^{{{auto_slope:.2f}}}$", + label=rf"{_format_lbl('auto')}: $T^{{{auto_slope:.2f}}}$", ) # plt.errorbar(T_values, Softimpute_errors, fmt='k^', yerr=softimpute_stderr, markersize=12, linestyle="None", label=rf'SoftImpute: $T^{{{softimpute_slope:.2f}}}$') # Logarithmic scale for both axes @@ -151,14 +156,18 @@ def _add_regression_line( plt.yscale("log", base=2) # Axis labels -plt.xlabel(r"T", fontsize=15) -plt.ylabel(r"Error for t = T, a = 1", fontsize=15) +plt.xlabel(r"\# Columns (T)", fontsize=plotting_utils.LABEL_FONT_SIZE) +plt.ylabel(r"Absolute error", color="black", fontsize=plotting_utils.LABEL_FONT_SIZE) # Title # plt.title(r'Decay of avg. error across users (N = T, 30 trials)', fontsize=16) # Add legend -plt.legend(fontsize=12) +plt.legend(fontsize=plotting_utils.LEGEND_FONT_SIZE, loc="upper right") + +# set tick font size +#print(plotting_utils.TICK_FONT_SIZE) +plt.tick_params(axis="both", which="major", labelsize=plotting_utils.LABEL_FONT_SIZE) # Grid for better readability # plt.grid(True, which="both", linestyle='--', linewidth=0.5) @@ -167,6 +176,6 @@ def _add_regression_line( ax1.spines["right"].set_visible(False) ax1.spines["left"].set_visible(False) ax1.grid(True, alpha=0.4) - +plt.tight_layout() # Show the plot plt.savefig(f"{output_dir}/sims_plot.pdf", bbox_inches="tight") diff --git a/examples/simulations/run_scalar.py b/examples/simulations/run_scalar.py index a12df01..de42e6f 100644 --- a/examples/simulations/run_scalar.py +++ b/examples/simulations/run_scalar.py @@ -35,7 +35,15 @@ from nsquared.utils.experiments import get_base_parser, setup_logging parser = get_base_parser() +parser.add_argument( + "--noise_stddev", + "-nstd", + type=float, + default=0.001, + help="Standard deviation of the noise added to the data", +) args = parser.parse_args() +noise_stddev = args.noise_stddev output_dir = args.output_dir estimation_method = args.estimation_method fit_method = args.fit_method @@ -60,7 +68,7 @@ # Load the simulated data dataset # NOTE: the raw and processed data is cached in .joblib_cache m_size = [2**4, 2**5, 2**6, 2**7] -num_trials = 15 +num_trials = 30 def random_trial() -> None: @@ -312,7 +320,7 @@ def last_col_trial() -> None: num_cols=size, seed=cantor(i, j), miss_prob=0.5, - stddev_noise=0.001, + stddev_noise=noise_stddev, latent_factor_combination_model="multiplicative", ) data, mask = sim_dataloader.process_data_scalar() diff --git a/examples/simulations/slurm_scripts/run_accuracy.sh b/examples/simulations/slurm_scripts/run_accuracy.sh index e8aba88..94b85e9 100755 --- a/examples/simulations/slurm_scripts/run_accuracy.sh +++ b/examples/simulations/slurm_scripts/run_accuracy.sh @@ -1,23 +1,48 @@ #!/bin/bash # Example usage: -# ./run_accuracy.sh OUTPUT_DIR +# ./run_accuracy.sh OUTPUT_DIR LOG_LEVEL NOISE_LEVEL -OUTPUT_DIR=$1 -LOG_LEVEL=$2 +OUTPUT_DIR="out" +LOG_LEVEL="WARNING" +NOISE_SIGMA=0.001 + +usage() { + echo "Usage: $0 [-o OUTPUT_DIR] [-l LOG_LEVEL] [-n NOISE_SIGMA]" + exit 1 +} + +while getopts ":o:l:n:" opt; do + case ${opt} in + o ) OUTPUT_DIR=$OPTARG ;; + l ) LOG_LEVEL=$OPTARG ;; + n ) NOISE_SIGMA=$OPTARG ;; + \? ) + echo "Invalid option: -$OPTARG" 1>&2 + usage + ;; + : ) + echo "Invalid option: -$OPTARG requires an argument" 1>&2 + usage + ;; + esac +done +shift $((OPTIND -1)) METHODS=( # "softimpute" # "usvt" "auto" - "row-row" - "col-col" + #"row-row" + #"col-col" "dr" "ts" - "softimpute" + #"softimpute" ) + + for em in ${METHODS[@]}; do - python run_scalar.py -od $OUTPUT_DIR -em $em --force --log_level $LOG_LEVEL + python run_scalar.py -od $OUTPUT_DIR -em $em --force --log_level $LOG_LEVEL -nstd $NOISE_SIGMA done diff --git a/src/nsquared/datasets/prompteval/loader.py b/src/nsquared/datasets/prompteval/loader.py index 3ed56f5..61ee8e8 100644 --- a/src/nsquared/datasets/prompteval/loader.py +++ b/src/nsquared/datasets/prompteval/loader.py @@ -255,7 +255,7 @@ def process_data_scalar(self) -> tuple[np.ndarray, np.ndarray]: mask = np.random.binomial(1, propensity, size=df.shape) data = df.to_numpy(dtype=float) - data[mask == 0] = np.nan + #data[mask == 0] = np.nan self.data = data self.mask = mask return data, mask @@ -324,7 +324,8 @@ def process_data_distribution( # Simulate MCAR missingness mask = np.random.binomial(1, propensity, size=data.shape[:2]) - data[mask == 0] = np.nan + #TODO: change this back later + #data[mask == 0] = np.nan self.data = data self.mask = mask diff --git a/src/nsquared/utils/plotting_utils.py b/src/nsquared/utils/plotting_utils.py index 454b326..72cb8e4 100644 --- a/src/nsquared/utils/plotting_utils.py +++ b/src/nsquared/utils/plotting_utils.py @@ -17,6 +17,9 @@ OUTWARD = 4 METHOD_ALIASES = { + "kernel": "Kernel-\nNN", + "wasserstein_samples": "W$_2$-\nNN", + "auto": "Auto-\nNN", "row-row": "Row-\nNN", "col-col": "Col-\nNN", "dr": "DR-\nNN", @@ -26,10 +29,10 @@ "nadaraya": "NW", "aw": "AW-\nNN", "sc": "SC", - "auto": "Auto-\nNN", } METHOD_ALIASES_SINGLE_LINE = { + "auto": "AutoNN", "row-row": "RowNN", "col-col": "ColNN", "dr": "DRNN", @@ -39,7 +42,8 @@ "nadaraya": "NW", "aw": "AWNN", "sc": "SC", - "auto": "AutoNN", + "kernel": "KernelNN", + "wasserstein_samples": "W$_2$NN", } METHOD_LINE_STYLES = { @@ -59,6 +63,10 @@ COLORS = { "row-row": "red", + "auto": "grey", + "kernel": "dimgrey", + "wasserstein_samples": "dimgrey", + # "row-row": "grey", "col-col": "grey", "dr": "grey", "ts": "grey", @@ -66,7 +74,6 @@ "softimpute": "lightgrey", "aw": "grey", "sc": "blue", - "auto": "grey", } DATA_TYPE_ALIASES = { From 11911535be87eaf21947b5ee8f74554f6fba7190 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Thu, 17 Jul 2025 22:33:34 -0700 Subject: [PATCH 17/19] Add explicit bench directory and reproducibility instructions --- README.md | 3 +- bench/README.md | 169 +++++++++ bench/experiments.sh | 94 +++++ examples/heartsteps/run_distribution.py | 5 +- examples/movielens/run_scalar.py | 328 ++++++++++++++++++ .../movielens/slurm_scripts/run_accuracy.sh | 39 +++ examples/prompteval/plot_distribution.py | 214 +++++++++--- examples/prompteval/run_distribution.py | 2 +- examples/prompteval/run_scalar.py | 12 +- examples/simulations/README.md | 11 +- examples/simulations/plot_size_error.py | 3 +- 11 files changed, 824 insertions(+), 56 deletions(-) create mode 100644 bench/README.md create mode 100755 bench/experiments.sh create mode 100644 examples/movielens/run_scalar.py create mode 100755 examples/movielens/slurm_scripts/run_accuracy.sh diff --git a/README.md b/README.md index aa23650..3b2a7b4 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,8 @@ import nsquared as nsq > [!NOTE] > If using VSCode, make sure to set the interpreter to the .venv environment using `Cmd + Shift + P` -> `Python: Select Interpreter`. - +## $N^2$ Bench and New Methods/Datasets +To replicate the experiments in [our paper](https://arxiv.org/abs/2506.04166) and test out new methods or datasets, check out the `bench` directory. For direct access to the data used in the $N^2$ bench, we host the data for download on [this repo](https://github.com/calebchin/nsquared_bench_data). ## Submitting Changes ### Linting diff --git a/bench/README.md b/bench/README.md new file mode 100644 index 0000000..bf9fa62 --- /dev/null +++ b/bench/README.md @@ -0,0 +1,169 @@ +# $N^2$ Bench +In this directory, we provide resources for replicating our experimental results, adding and testing new methods, and adding new datasets. +## Replicating experimental results + +### For Windows users +We run our experiments with shell scripts, which requires additional setup for Windows users. A recommended option is Git Bash. + +#### Using Git Bash +1. Install [Git for Windows](https://gitforwindows.org/) +2. Open Git Bash +3. Navigate to project bench directory + +### For Mac / Linux Users +No additional setup should be necessary. + +### Experiments: +To replicate the experimental results in [our paper](https://arxiv.org/pdf/2506.04166), run `bench/experiments.sh` as follows: + +```bash +# from the bench directory +./experiments.sh -o OUTPUT_DIR -l LOG_LEVEL -e EXPERIMENT_NAME +``` +If `EXPERIMENT_NAME` is `all` (default), experiments on all four datasets (heartsteps, movielens, prompteval, and prop99) will be run and stored in `OUTPUT_DIR`. You can also run the experiments for a specific dataset setting `EXPERIMENT_NAME` to `heartsteps`, `movielens`, `prompteval`, and `prop99`. + +The experiments for `movielens` are very memory-intensive due to the size of the dataset and could terminate unexpectedly. + +For plotting utilities, see the `examples` directory for files with names prefixed by `plot`. + + +## Adding and testing new methods + +### Nearest neighbor variants: +To add a new nearest neighbor variant: + +1. Define an `EstimationMethod` in `nsquared/estimation_methods.py`. + + ```python + class MyNewEstimator(EstimationMethod): + """Estimate things""" + def __init__(self, is_percentile: bool = True): + super().__init__(is_percentile) + ... + + def impute( + self, + row: int, + column: int, + data_array: npt.NDArray, + mask_array: npt.NDArray, + distance_threshold: Union[float, Tuple[float, float]], + data_type: DataType, + allow_self_neighbor: bool = False, + **kwargs: Any, + ) -> npt.NDArray: + """ + Impute the missing value at + the given row and column using + XYZ method + """ + ... + ``` + +2. Define a `FitMethod` (if needed). + ```python + class MyNewFitMethod(FitMethod): + def __init__( + self, + block: list[tuple[int, int]], + distance_threshold_range_row: tuple[float, float], + distance_threshold_range_col: tuple[float, float], + alpha_range: tuple[float, float], + n_trials: int, + data_type: DataType, + allow_self_neighbor: bool = False, + ): + ... + + def fit( + self, + data_array: npt.NDArray, + mask_array: npt.NDArray, + imputer: NearestNeighborImputer, + ret_trials: bool = False, + ) -> Union[tuple[float, float], tuple[tuple[float, float], Trials]]: + ... + + ``` + +3. To ensure compatability with the experiments and plotting functions, add an alias for your method in [`nsquared/utils/experiments.py`](https://github.com/aashish-khub/NearestNeighbors/blob/441a382efba2cf68c22ac379bd5750f91d9e03ee/src/nsquared/utils/experiments.py#L19) under the parser argument for `--estimation_method` and fill out [`nsquared/utils/plotting_utils.py`](https://github.com/aashish-khub/NearestNeighbors/blob/441a382efba2cf68c22ac379bd5750f91d9e03ee/src/nsquared/utils/plotting_utils.py#L19) with your desired plot settings. + +4. To test on a given dataset (for example: `heartsteps`), navigate to `examples/heartsteps/run_scalar.py` and add your method following the existing template. In general, all that is required is adding a block to [this conditional structure](https://github.com/aashish-khub/NearestNeighbors/blob/441a382efba2cf68c22ac379bd5750f91d9e03ee/examples/heartsteps/run_scalar.py#L157), but your method is not required to use the exact format of the `run_scalar.py` script. For distributional methods, do the same, but in `run_distribution.py`. + +5. Adjust the corresponding `slurm_scripts/*.sh` files in the `examples` directory to add your new methods alias under `METHODS`. + +### Non-nearest neigbor methods +If you wish to test methods on the benchmark that do not follow the $N^2$ framework, there are two options: + +#### Option 1: +Use downloaded data hosted [here](https://github.com/calebchin/nsquared_bench_data). + +This contains the masked (missingness included) matrix used in our experiments, the corresponding unmasked (no missingness) matrix, and the masking matrix for each dataset. + +#### Option 2: +Use the dataloader in `nsquared.datasets`. + +For examples on how the dataloader works, check out the use of the loader [here](https://github.com/aashish-khub/NearestNeighbors/blob/main/examples/heartsteps/run_scalar.py) or [here](https://github.com/aashish-khub/NearestNeighbors/blob/main/examples/prop99/run_scalar.py). + + +## Adding new datasets + +To add a new dataset: + +1. Create a new directory inside the `nsquared/datasets` directory with two files: `loader.py` and `__init__.py`. +2. The `loader.py` file should look something like: + ```python + from nsquared.datasets.dataloader_base import NNDataLoader + from nsquared.datasets.dataloader_factory import register_dataset + # imports + ... + # + memory = Memory(".joblib_cache", verbose=2) + logger = logging.getLogger(__name__) + params = { + # specific parameters for the dataset + } + + @register_dataset("MyNewDataset", params) + class MyNewDatasetLoader(NNDataLoader): + """ + ... + """ + def __init__( + self, + # specific params + agg: str = "mean", + **kwargs: Any, + ): + """ + Initialize data loader + """ + super().__init__( + agg=agg, + **kwargs, + ) + ... + + def process_data_scalar(self, agg: str = "mean") -> tuple[np.ndarray, np.ndarray]: + """ + Process new dataset in the scalar setting (# of entries is 1) + """ + ... + + def process_data_distribution(self, data_type: DataType | None = None) -> tuple[np.ndarray, np.ndarray]: + """ + Process new dataset in distribuional setting (# of entries is > 1) + """ + ... + + def get_full_state_as_dict(self, include_metadata: bool = False) -> dict: + """ + Returns the full state as a dictionary (including data matrix, mask, and specific params). + """ + ... + ``` +3. The `__init__.py` should contain: + ```python + from .loader import MyNewDatasetLoader # noqa: F401 + ``` +4. To run the existing methods on the dataset, follow the template provided in any of the example `run_scalar.py` or `run_distribution.py` files. It is possible that all you will need to change is the data loading step (e.g. `my_new_dataloader = NNData.create("MyNewDataset")`). \ No newline at end of file diff --git a/bench/experiments.sh b/bench/experiments.sh new file mode 100755 index 0000000..d908e83 --- /dev/null +++ b/bench/experiments.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Example usage: + +OUTPUT_DIR="out" +LOG_LEVEL="WARNING" +EXPERIMENT="all" + + +usage() { + echo "Usage: $0 [-o OUTPUT_DIR] [-l LOG_LEVEL] [-e EXPERIMENT]" + exit 1 +} + +while getopts ":o:l:e:" opt; do + case ${opt} in + o ) OUTPUT_DIR=$OPTARG ;; + l ) LOG_LEVEL=$OPTARG ;; + e ) EXPERIMENT=$OPTARG ;; + \? ) + echo "Invalid option: -$OPTARG" 1>&2 + usage + ;; + : ) + echo "Invalid option: -$OPTARG requires an argument" 1>&2 + usage + ;; + esac +done +shift $((OPTIND -1)) +echo $EXPERIMENT + +if [ "$EXPERIMENT" = "all" ] +then + EXPERIMENTS=("heartsteps" "movielens" "prompteval" "prop99") +else + EXPERIMENTS=($EXPERIMENT) +fi + +for exper in ${EXPERIMENTS[@]}; +do + if [ "$exper" = "heartsteps" ] + then + HEARTSTEPS_DIR="../../bench/${OUTPUT_DIR}/heartsteps" + echo "Running heartsteps experiment" + cd ../examples/heartsteps + ./slurm_scripts/run_accuracy.sh $HEARTSTEPS_DIR $LOG_LEVEL + python run_distribution.py -od $HEARTSTEPS_DIR -dt kernel_mmd --force --log_level $LOG_LEVEL -em col-col + python run_distribution.py -od $HEARTSTEPS_DIR -dt wasserstein_samples --force --log_level $LOG_LEVEL -em col-col + cd ../../bench + elif [ "$exper" = "movielens" ] + then + MOVIELENS_DIR="../../bench/${OUTPUT_DIR}/movielens" + echo "Running movielens experiment" + cd ../examples/movielens + ./slurm_scripts/run_accuracy.sh $MOVIELENS_DIR $LOG_LEVEL + cd ../../bench + elif [ "$exper" = "prompteval" ] + then + PROMPTEVAL_DIR="../../bench/${OUTPUT_DIR}/prompteval" + echo "Running prompteval experiment" + cd ../examples/prompteval + ./slurm_scripts/run_accuracy.sh $PROMPTEVAL_DIR $LOG_LEVEL + python run_distribution.py -od $PROMPTEVAL_DIR -dt kernel_mmd --force --log_level $LOG_LEVEL -em col-col + python run_distribution.py -od $PROMPTEVAL_DIR -dt wasserstein_samples --force --log_level $LOG_LEVEL -em col-col + cd ../../bench + elif [ "$exper" = "prop99" ] + then + PROP99_DIR="../../bench/${OUTPUT_DIR}/prop99" + cd ../examples/prop99 + echo "Running prop99 experiment" + ./slurm_scripts/run_accuracy.sh $PROP99_DIR $LOG_LEVEL + ./slurm_scripts/run_california.sh $PROP99_DIR $LOG_LEVEL + python proposal_99.py -od $OUTPUT_DIR --force --log_level $LOG_LEVEL + cd ../../bench + else + echo "$exper is not a valid experiment. Please choose from heartsteps, movielens, prompteval, or prop99." + fi +done +# SIM_METHODS=( +# "auto" +# "dr" +# "ts" +# ) +# SIM_OUTPUT_DIR="${OUTPUT_DIR}/simulations" +# for em in ${SIM_METHODS[@]}; +# do +# python ../examples/simulations/run_scalar.py -od "${SIM_OUTPUT_DIR}/high_snr" -em $em --force --log_level $LOG_LEVEL -nstd 0.001 +# done + +# for em in ${SIMMETHODS[@]}; +# do +# python ../examples/simulations/run_scalar.py -od ${SIM_OUTPUT_DIR}/low_snr -em $em --force --log_level $LOG_LEVEL -nstd 1.0 +# done diff --git a/examples/heartsteps/run_distribution.py b/examples/heartsteps/run_distribution.py index 000efc9..741a61d 100644 --- a/examples/heartsteps/run_distribution.py +++ b/examples/heartsteps/run_distribution.py @@ -39,8 +39,8 @@ "--data_type", "-dt", type=str, - default="kernel", - choices=["kernel", "wasserstein_samples"], + default="kernel_mmd", + choices=["kernel_mmd", "wasserstein_samples"], help="Data type to use", ) args = parser.parse_args() @@ -66,6 +66,7 @@ data, mask = hs_dataloader.process_data_distribution() data = data[:, :200] # only use the first 200 timesteps mask = mask[:, :200] + elapsed_time = time() - start_time logger.info(f"Time to load and process data: {elapsed_time:.2f} seconds") diff --git a/examples/movielens/run_scalar.py b/examples/movielens/run_scalar.py new file mode 100644 index 0000000..eee7e5e --- /dev/null +++ b/examples/movielens/run_scalar.py @@ -0,0 +1,328 @@ + +"""Script to run NN imputers + USVT baseline on the MovieLens dataset +using 20% of the observed indices as a test block. + +Example usage (from root of repo): +```bash +python run_scalar.py -od OUTPUT_DIR -em ESTIMATION_METHOD -fm FIT_METHOD +``` +""" + +# %% +# standard imports +import numpy as np +from tqdm import tqdm +import logging +import os +from time import time +import pandas as pd +from hyperopt import Trials + +# import baseline methods +from baselines import usvt, softimpute + +# import nearest neighbor methods +from nsquared.data_types import Scalar +from nsquared.estimation_methods import ( + ColColEstimator, + RowRowEstimator, + TSEstimator, + AWNNEstimator, + AutoEstimator, +) +from nsquared import NearestNeighborImputer +from nsquared.fit_methods import ( + DRLeaveBlockOutValidation, + TSLeaveBlockOutValidation, + LeaveBlockOutValidation, + AutoDRTSLeaveBlockOutValidation, +) +from nsquared.datasets.dataloader_factory import NNData +from nsquared.vanilla_nn import row_row, col_col +from nsquared.dr_nn import dr_nn + +from nsquared.utils.experiments import get_base_parser, setup_logging + +# %% + +parser = get_base_parser() +args = parser.parse_args() +output_dir = args.output_dir +estimation_method = args.estimation_method +fit_method = args.fit_method +seed = args.seed +log_level = args.log_level + +setup_logging(log_level) +logger = logging.getLogger(__name__) + +os.makedirs(output_dir, exist_ok=True) +results_dir = os.path.join(output_dir, "results") +os.makedirs(results_dir, exist_ok=True) +save_path = os.path.join( + results_dir, f"est_errors-{estimation_method}-{fit_method}.csv" +) + +if os.path.exists(save_path) and not args.force: + logger.info(f"Results already exist at {save_path}. Use --force to overwrite.") + exit() + +rng = np.random.default_rng(seed=seed) + +# Load the movielens +# NOTE: the raw and processed data is cached in .joblib_cache +start_time = time() +sample_users = None # 1000 +sample_movies = None # 1000 +seed = 0 +ml_dataloader = NNData.create( + "movielens", sample_users=sample_users, sample_movies=sample_movies, seed=seed +) + +data, mask = ml_dataloader.process_data_scalar() +data_sparsity = 1 - np.sum(mask) / mask.size +data_shape = data.shape +logger.info(f"Data shape: {data_shape}") +logger.info(f"Data sparsity: {data_sparsity:.2%}") +elapsed_time = time() - start_time +logger.info(f"Time to load and process data: {elapsed_time:.2f} seconds") + +logger.info("Using scalar data type") +data_type = Scalar() + +holdout_inds = np.nonzero(mask == 1) +inds_rows = holdout_inds[0] +inds_cols = holdout_inds[1] + +range_inds = np.arange(len(inds_rows)) + +# randomly shuffle indices +rng.shuffle(range_inds) +# 20% of the indices will be used for testing +test_size = int(0.8 * len(range_inds)) +test_inds = range_inds[:test_size] +test_inds = test_inds[:500] +# 80% of the indices will be used for training +train_inds = range_inds[test_size:] +range_train_inds = np.arange(len(train_inds)) +rng.shuffle(range_train_inds) +# 20% of the training indices will be used for cv holdout +# cv_size = int(0.01 * len(train_inds)) +cv_size = 100 +cv_inds = range_train_inds[:cv_size] +# get the rows and columns of the train indices + +cv_inds_rows = list(inds_rows[train_inds][cv_inds]) +cv_inds_cols = list(inds_cols[train_inds][cv_inds]) +# get the rows and columns of the test indices +test_inds_rows = list(inds_rows[test_inds]) +test_inds_cols = list(inds_cols[test_inds]) + +block = list(zip(cv_inds_rows, cv_inds_cols)) + +# # Convert dense data_array to sparse, skipping NaNs using mask +valid_mask = (~np.isnan(data)) & (mask == 1) +# rows, cols = np.where(valid_mask) +# values = data[rows, cols] + +# data_sparse = coo_matrix((values, (rows, cols)), shape=data.shape).tocsc() + +test_block = list(zip(test_inds_rows, test_inds_cols)) + +mask_test = mask.copy() +mask_test[test_inds_rows, test_inds_cols] = 0 + +# %% + +num_trials = 10 +if estimation_method == "usvt": + logger.info("Using USVT estimation") + # setup usvt imputation + usvt_data = data.copy() + usvt_mask = mask.copy() + usvt_mask[test_inds_rows, test_inds_cols] = 0 + usvt_data[usvt_mask != 1] = np.nan + # impute missing values simultaneously + start_time = time() + usvt_imputed = usvt(usvt_data) + elapsed_time = time() - start_time + imputations = usvt_imputed[test_inds_rows, test_inds_cols] + # set the time to the average time per imputation + imputation_times = [elapsed_time / len(test_block)] * len(test_block) + fit_times = [0] * len(test_block) +elif estimation_method == "softimpute": + logger.info("Using SoftImpute estimation") + # setup softimpute imputation + si_data = data.copy() + si_mask = mask.copy() + si_mask[test_inds_rows, test_inds_cols] = 0 + si_data[si_mask != 1] = np.nan + # impute missing values simultaneously + start_time = time() + si_imputed = softimpute(si_data) + elapsed_time = time() - start_time + imputations = si_imputed[test_inds_rows, test_inds_cols] + # set the time to the average time per imputation + imputation_times = [elapsed_time / len(test_block)] * len(test_block) + fit_times = [0] * len(test_block) +elif estimation_method == "aw": + logger.info("Using AWNN estimation") + estimator = AWNNEstimator() + imputer = NearestNeighborImputer(estimator, data_type, distance_threshold=-1) + # Impute missing values + imputations = [] + imputation_times = [] + for row, col in tqdm(test_block, desc="Imputing missing values"): + start_time = time() + imputed_value = imputer.impute(row, col, data, mask_test) + elapsed_time = time() - start_time + imputation_times.append(elapsed_time) + imputations.append(imputed_value) + imputations = np.array(imputations) + fit_times = [0] * len(test_block) +else: + if estimation_method == "dr": + logger.info("Using doubly robust estimation") + imputer = dr_nn() + + logger.info("Using doubly robust fit method") + # Fit the imputer using leave-block-out validation + fitter = DRLeaveBlockOutValidation( + block, + distance_threshold_range_row=(0, 1), + distance_threshold_range_col=(0, 1), + n_trials=num_trials, + data_type=data_type, + ) + elif estimation_method == "row-row": + logger.info("Using row-row estimation") + imputer = row_row() + if not isinstance(imputer.estimation_method, RowRowEstimator): + raise ValueError( + f"Estimation method {imputer.estimation_method} not supported for row-row" + ) + # imputer.estimation_method._precalculate_distances( + # data, mask, np.array(cv_inds_rows) + # ) + + logger.info("Using leave-block-out validation") + fitter = LeaveBlockOutValidation( + block, + distance_threshold_range=(0, 1), + n_trials=num_trials, + data_type=data_type, + ) + elif estimation_method == "col-col": + logger.info("Using col-col estimation") + imputer = col_col() + + if not isinstance(imputer.estimation_method, ColColEstimator): + raise ValueError( + f"Estimation method {imputer.estimation_method} not supported for col-col" + ) + + # imputer.estimation_method.estimator._precalculate_distances( + # np.swapaxes(data, 0, 1), np.swapaxes(mask, 0, 1), np.array(cv_inds_cols) + # ) + + logger.info("Using leave-block-out validation") + fitter = LeaveBlockOutValidation( + block, + distance_threshold_range=(0, 1), + n_trials=num_trials, + data_type=data_type, + ) + elif estimation_method == "ts": + logger.info("Using two-sided estimation") + estimator = TSEstimator() + imputer = NearestNeighborImputer(estimator, data_type) + + logger.info("Using two-sided fit method") + # Fit the imputer using leave-block-out validation + fitter = TSLeaveBlockOutValidation( + block, + distance_threshold_range_row=(0, 1), + distance_threshold_range_col=(0, 1), + n_trials=num_trials, + data_type=data_type, + ) + elif estimation_method == "auto": + logger.info("Using AutoNN estimation") + estimator = AutoEstimator(is_percentile=True) + imputer = NearestNeighborImputer(estimator, data_type) + logger.info("Using AutoNN fit method") + # Fit the imputer using leave-block-out validation + fitter = AutoDRTSLeaveBlockOutValidation( + block, + distance_threshold_range_row=(0, 1), + distance_threshold_range_col=(0, 1), + alpha_range=(0, 1), + n_trials=num_trials, + data_type=data_type, + allow_self_neighbor=args.allow_self_neighbor, + ) + else: + raise ValueError( + f"Estimation method {estimation_method} and fit method {fit_method} not supported" + ) + + start_time = time() + trials = fitter.fit(data, valid_mask, imputer, ret_trials=True) + end_time = time() + fit_times = [end_time - start_time] * len(test_block) + + # CODE FOR EXTRACTING TRIAL METADATA + if ( + not isinstance(trials, float) + and not isinstance(trials, int) + and isinstance(trials[1], Trials) + ): + trials = trials[1] + trial_data = [] + for trial in trials.trials: + row = {} + # get param vals + params = trial["misc"]["vals"] + for param_name, param_values in params.items(): + if param_values: + row[param_name] = float(param_values[0]) + + row["loss"] = float(trial["result"]["loss"]) + trial_data.append(row) + + df_trials = pd.DataFrame(trial_data) + trials_save_path = os.path.join( + results_dir, f"cvtrials-{estimation_method}-{fit_method}.csv" + ) + logger.info(f"Saving trials data to {trials_save_path}...") + df_trials.to_csv(trials_save_path, index=False) + + # Impute missing values + imputations = [] + imputation_times = [] + for row, col in tqdm(test_block, desc="Imputing missing values"): + start_time = time() + imputed_value = imputer.impute(row, col, data, mask_test) + elapsed_time = time() - start_time + imputation_times.append(elapsed_time) + imputations.append(imputed_value) + imputations = np.array(imputations) + +ground_truth = data[test_inds_rows, test_inds_cols] +est_errors = np.abs(imputations - ground_truth) +logger.info(f"Mean absolute error: {np.mean(est_errors)}") + +df = pd.DataFrame( + data={ + "estimation_method": estimation_method, + "fit_method": fit_method, + "est_errors": est_errors, + "row": test_inds_rows, + "col": test_inds_cols, + "time_impute": imputation_times, + "time_fit": fit_times, + } +) +print(df[["est_errors", "time_impute", "time_fit"]].describe()) +logger.info(f"Saving est_errors to {save_path}...") +df.to_csv(save_path, index=False) \ No newline at end of file diff --git a/examples/movielens/slurm_scripts/run_accuracy.sh b/examples/movielens/slurm_scripts/run_accuracy.sh new file mode 100755 index 0000000..0ec14c7 --- /dev/null +++ b/examples/movielens/slurm_scripts/run_accuracy.sh @@ -0,0 +1,39 @@ +# #!/bin/bash + +# # Example usage: +# # ./run_accuracy.sh OUTPUT_DIR + +# OUTPUT_DIR=$1 + +# METHODS=( +# "usvt" +# "row-row" +# "col-col" +# "dr" +# "ts" +# ) +# for em in ${METHODS[@]}; +# do +# python run_scalar.py -od $OUTPUT_DIR -em $em --force +# done +#!/bin/bash + +# Example usage: +# ./run_accuracy.sh OUTPUT_DIR + +OUTPUT_DIR=$1 + +METHODS=( + "usvt" + "softimpute" + "row-row" + "col-col" + "dr" + "ts" + "aw" + "auto" +) +for em in ${METHODS[@]}; +do + python run_scalar.py -od $OUTPUT_DIR -em $em --force +done \ No newline at end of file diff --git a/examples/prompteval/plot_distribution.py b/examples/prompteval/plot_distribution.py index 96a880e..4c89286 100644 --- a/examples/prompteval/plot_distribution.py +++ b/examples/prompteval/plot_distribution.py @@ -28,7 +28,7 @@ "--tuning_parameter", "-tp", type=float, - default=0.5, + default=4.0, ) args = parser.parse_args() output_dir = args.output_dir @@ -45,21 +45,63 @@ os.makedirs(figures_dir, exist_ok=True) results_dir = os.path.join(output_dir, "results") -files = glob( - os.path.join(results_dir, f"est_errors-*-p{propensity}-tp{tuning_parameter}.csv") +#print(os.path.join(results_dir, f"est_errors-*-p{0.3}-tp{tuning_parameter}.csv")) +# files01 = glob( +# os.path.join(results_dir, f"est_errors-*-p{0.3}-tp{tuning_parameter}.csv") +# ) +files05 = glob( + os.path.join(results_dir, f"est_errors-*-p{0.7}-tp{tuning_parameter}.csv") ) -df_list = [] -for file in files: +# files09 = glob( +# os.path.join(results_dir, f"est_errors-*-p{0.7}-tp{tuning_parameter}.csv") +# ) +df_list_01 = [] +# for file in files01: +# df = pd.read_csv(file) +# # Convert string representations of lists to actual lists +# df["imputation"] = df["imputation"].apply(lambda x: np.array(eval(x))) +# df["ground_truth"] = df["ground_truth"].apply(lambda x: np.array(eval(x))) +# df_list_01.append(df) +df_list_05 = [] +for file in files05: df = pd.read_csv(file) # Convert string representations of lists to actual lists df["imputation"] = df["imputation"].apply(lambda x: np.array(eval(x))) df["ground_truth"] = df["ground_truth"].apply(lambda x: np.array(eval(x))) - df_list.append(df) -df = pd.concat(df_list, ignore_index=True) + df_list_05.append(df) +# df_list_09 = [] +# for file in files09: +# df = pd.read_csv(file) +# # Convert string representations of lists to actual lists +# df["imputation"] = df["imputation"].apply(lambda x: np.array(eval(x))) +# df["ground_truth"] = df["ground_truth"].apply(lambda x: np.array(eval(x))) +# df_list_09.append(df) + +# df_01 = pd.concat(df_list_01, ignore_index=True) +df_05 = pd.concat(df_list_05, ignore_index=True) +# df_09 = pd.concat(df_list_09, ignore_index=True) # each row in the dataframe is a ground truth and imputation pair for a given estimation method, fit method, and data type at row r and column c # groupby r, c and plot the histograms of the ground truth and imputation for each group -df = ( - df.groupby(["row", "col"]) +# df_01 = ( +# df_01.groupby(["row", "col"]) +# .apply( +# lambda x: { +# "imputations": { +# (row["estimation_method"], row["fit_method"], row["data_type"]): row[ +# "imputation" +# ] +# for _, row in x.iterrows() +# }, +# "ground_truth": x["ground_truth"].iloc[ +# 0 +# ], # Take first ground truth since it should be same for all methods +# } +# ) +# .reset_index() +# .rename(columns={0: "data"}) +# ) +df_05 = ( + df_05.groupby(["row", "col"]) .apply( lambda x: { "imputations": { @@ -76,67 +118,153 @@ .reset_index() .rename(columns={0: "data"}) ) +# df_09 = ( +# df_09.groupby(["row", "col"]) +# .apply( +# lambda x: { +# "imputations": { +# (row["estimation_method"], row["fit_method"], row["data_type"]): row[ +# "imputation" +# ] +# for _, row in x.iterrows() +# }, +# "ground_truth": x["ground_truth"].iloc[ +# 0 +# ], # Take first ground truth since it should be same for all methods +# } +# ) +# .reset_index() +# .rename(columns={0: "data"}) +# ) COLORS = { ("row-row", "lbo", "kernel_mmd"): "teal", ("col-col", "lbo", "kernel_mmd"): "blue", ("row-row", "lbo", "wasserstein_samples"): "green", - ("col-col", "lbo", "wasserstein_samples"): "gray", + ("col-col", "lbo", "wasserstein_samples"): "orange", } -for i, row in df.head(20).iterrows(): - fig, ax = plt.subplots(figsize=(5.5 / 2, 5.5 / 2)) - # Determine common bins based on all data - all_data = [row["data"]["ground_truth"]] - for imputation in row["data"]["imputations"].values(): # type: ignore - all_data.append(imputation) +# Determine common bins based on all data + + +# Calculate the min and max across all data to create common bins +bins = list(np.linspace(0, 1, 30)) # 11 points create 10 bins + +for i in range(0, 100): + #row_09 = df_09.iloc[i] + row_05 = df_05.iloc[i] + #row_01 = df_01.iloc[i] + fig, ax2 = plt.subplots(figsize=(3, 2.5)) + + # all_data = row_09["data"]["ground_truth"] + # for imputation in row_09["data"]["imputations"].values(): # type: ignore + # all_data.append(imputation) + # Plot imputation for each method + # for (est_method, fit_method, data_type), imputation in row_09["data"][ # type: ignore + # "imputations" + # ].items(): # type: ignore + # weights = np.ones_like(imputation) / len(imputation) + # ax1.hist( + # imputation, + # bins=bins, + # alpha=0.6, + # label=f"{plotting_utils.METHOD_ALIASES_SINGLE_LINE.get(est_method, est_method)}" + # f"\n({plotting_utils.DATA_TYPE_ALIASES.get(data_type, data_type)})", + # weights=weights, + # color=COLORS[(est_method, fit_method, data_type)], + # ) + # # Plot ground truth + # weights = np.ones_like(row_09["data"]["ground_truth"]) / len(row_09["data"]["ground_truth"]) + # ax1.hist( + # row_09["data"]["ground_truth"], + # weights=weights, + # bins=bins, + # alpha=0.6, + # label="Ground\nTruth", + # edgecolor="black", + # color="white", + # linestyle="--", + # ) + # ax1.set_xlabel("Score", fontsize=plotting_utils.LABEL_FONT_SIZE) + # ax1.set_ylabel("Density", fontsize=plotting_utils.LABEL_FONT_SIZE) + # ax1.set_xlim(0, 1) + + # ax1.spines["top"].set_visible(False) + # ax1.spines["right"].set_visible(False) + # # ax.spines["bottom"].set_position( + # # ("outward", plotting_utils.OUTWARD) + # # ) # Move x-axis outward + # ax1.spines["left"].set_position( + # ("outward", plotting_utils.OUTWARD) + # ) # Move y-axis outward - # Calculate the min and max across all data to create common bins - bins = list(np.linspace(0, 1, 40)) # 11 points create 10 bins + # # Only add legend to the first subplot to avoid clutter + # ax1.legend(loc='upper right', fontsize=plotting_utils.LEGEND_FONT_SIZE) + # all_data = row_05["data"]["ground_truth"] + # for imputation in row_05["data"]["imputations"].values(): # type: ignore + # all_data.append(imputation) # Plot imputation for each method - for (est_method, fit_method, data_type), imputation in row["data"][ # type: ignore + weights = np.ones_like(row_05["data"]["ground_truth"]) / len(row_05["data"]["ground_truth"]) + ax2.hist( + row_05["data"]["ground_truth"], + bins=bins, + weights=weights, + alpha=0.6, + label="Ground\nTruth", + edgecolor="black", + linestyle="--", + color="white", + ) + for (est_method, fit_method, data_type), imputation in row_05["data"][ # type: ignore "imputations" ].items(): # type: ignore - ax.hist( + + if data_type == "wasserstein_samples": + # Convert to numpy array if it's not already + est_method_dt = "wasserstein_samples" + else: + est_method_dt = "kernel" + if est_method == "col-col": + est_method_lbl = "col" + elif est_method == "row-row": + est_method_lbl = "row" + + weights = np.ones_like(imputation) / len(imputation) + ax2.hist( imputation, bins=bins, - alpha=0.5, - label=f"{plotting_utils.METHOD_ALIASES_SINGLE_LINE.get(est_method, est_method)}" - f"\n({plotting_utils.DATA_TYPE_ALIASES.get(data_type, data_type)})", - edgecolor="black", - density=True, + weights=weights, + alpha=0.6, + label=f"{plotting_utils.METHOD_ALIASES_SINGLE_LINE.get(est_method_dt, est_method_dt)}" + f"\n({est_method_lbl})", color=COLORS[(est_method, fit_method, data_type)], ) # Plot ground truth - ax.hist( - row["data"]["ground_truth"], - bins=bins, - alpha=0.5, - label="Ground\nTruth", - edgecolor="black", - density=True, - color="yellow", - ) - ax.set_xlabel("Score", fontsize=plotting_utils.LABEL_FONT_SIZE) - ax.set_ylabel("Density", fontsize=plotting_utils.LABEL_FONT_SIZE) - ax.set_xlim(0, 1) + + ax2.set_ylabel("Proportion", fontsize=plotting_utils.LABEL_FONT_SIZE) + ax2.set_xlabel("Score", fontsize=plotting_utils.LABEL_FONT_SIZE) + ax2.legend(loc="upper right", fontsize=plotting_utils.LEGEND_FONT_SIZE) - ax.spines["top"].set_visible(False) - ax.spines["right"].set_visible(False) + ax2.spines["top"].set_visible(False) + ax2.spines["right"].set_visible(False) + ax2.spines["left"].set_visible(False) + ax2.set_axisbelow(True) + ax2.grid(True, alpha=0.4) # ax.spines["bottom"].set_position( # ("outward", plotting_utils.OUTWARD) # ) # Move x-axis outward - ax.spines["left"].set_position( - ("outward", plotting_utils.OUTWARD) - ) # Move y-axis outward + # ax2.spines["left"].set_position( + # ("outward", plotting_utils.OUTWARD) + # ) # Move y-axis outward # Only add legend to the first subplot to avoid clutter ax.legend(loc="upper left", fontsize=plotting_utils.LEGEND_FONT_SIZE) figures_path = os.path.join( figures_dir, - f"distributions-r{row.row}-c{row.col}-p{propensity}-tp{tuning_parameter}.pdf", + f"distributions-entry{i}-tp{tuning_parameter}.pdf", ) logger.info(f"Saving figure to {figures_path}") plt.savefig(figures_path, dpi=300, bbox_inches="tight") + plt.close() diff --git a/examples/prompteval/run_distribution.py b/examples/prompteval/run_distribution.py index a2c69eb..3c20cc3 100644 --- a/examples/prompteval/run_distribution.py +++ b/examples/prompteval/run_distribution.py @@ -28,10 +28,10 @@ from nsquared.fit_methods import LeaveBlockOutValidation from ks import ks_distance - parser = get_base_parser() parser.add_argument( "--data_type", + "-dt", type=str, default="kernel_mmd", choices=["kernel_mmd", "wasserstein_samples"], diff --git a/examples/prompteval/run_scalar.py b/examples/prompteval/run_scalar.py index 5a9d2de..0bfc0e0 100644 --- a/examples/prompteval/run_scalar.py +++ b/examples/prompteval/run_scalar.py @@ -143,8 +143,8 @@ # Fit the imputer using leave-block-out validation fitter = DRLeaveBlockOutValidation( block, - distance_threshold_range_row=(0, 10), - distance_threshold_range_col=(0, 10), + distance_threshold_range_row=(0, 1), + distance_threshold_range_col=(0, 1), n_trials=200, data_type=data_type, ) @@ -155,7 +155,7 @@ logger.info("Using leave-block-out validation") fitter = LeaveBlockOutValidation( block, - distance_threshold_range=(0, 10), + distance_threshold_range=(0, 1), n_trials=200, data_type=data_type, ) @@ -166,7 +166,7 @@ logger.info("Using leave-block-out validation") fitter = LeaveBlockOutValidation( block, - distance_threshold_range=(0, 10), + distance_threshold_range=(0, 1), n_trials=200, data_type=data_type, ) @@ -179,8 +179,8 @@ # Fit the imputer using leave-block-out validation fitter = TSLeaveBlockOutValidation( block, - distance_threshold_range_row=(0, 10), - distance_threshold_range_col=(0, 10), + distance_threshold_range_row=(0, 1), + distance_threshold_range_col=(0, 1), n_trials=200, data_type=data_type, ) diff --git a/examples/simulations/README.md b/examples/simulations/README.md index 2282fb7..bac30d6 100644 --- a/examples/simulations/README.md +++ b/examples/simulations/README.md @@ -1,5 +1,12 @@ -# Replicating experiments -![High SNR Figure](example_plots/sims_plot_highsnr.pdf) +# Replicating simulations experiments +
+ + + Figure 1: AutoNN recovers DRNN performance with High SNR +
+ + + To replicate Figure 1, run the following commands while in the `examples/simulations` directory. diff --git a/examples/simulations/plot_size_error.py b/examples/simulations/plot_size_error.py index 3c016ee..429efce 100644 --- a/examples/simulations/plot_size_error.py +++ b/examples/simulations/plot_size_error.py @@ -177,5 +177,6 @@ def _format_lbl(method:str) -> str: ax1.spines["left"].set_visible(False) ax1.grid(True, alpha=0.4) plt.tight_layout() -# Show the plot +# Show the plot as pdf (better quality) and png (for markdown) plt.savefig(f"{output_dir}/sims_plot.pdf", bbox_inches="tight") +plt.savefig(f"{output_dir}/sims_plot.png", bbox_inches="tight") From e959f8d7c14c93889cb57dbea7c0804e718a0d7d Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Thu, 17 Jul 2025 22:38:28 -0700 Subject: [PATCH 18/19] Linter happy --- README.md | 2 +- bench/README.md | 38 ++++++++++---------- bench/experiments.sh | 8 ++--- examples/heartsteps/plot_error_and_time.py | 15 ++++++-- examples/heartsteps/run_distribution.py | 6 ++-- examples/movielens/run_scalar.py | 3 +- examples/prompteval/plot_distribution.py | 41 +++++++++++----------- examples/prompteval/run_distribution.py | 3 +- examples/simulations/README.md | 4 +-- examples/simulations/plot_size_error.py | 28 ++++++++------- src/nsquared/datasets/prompteval/loader.py | 6 ++-- 11 files changed, 85 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index 3b2a7b4..f6f7dea 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ import nsquared as nsq > If using VSCode, make sure to set the interpreter to the .venv environment using `Cmd + Shift + P` -> `Python: Select Interpreter`. ## $N^2$ Bench and New Methods/Datasets -To replicate the experiments in [our paper](https://arxiv.org/abs/2506.04166) and test out new methods or datasets, check out the `bench` directory. For direct access to the data used in the $N^2$ bench, we host the data for download on [this repo](https://github.com/calebchin/nsquared_bench_data). +To replicate the experiments in [our paper](https://arxiv.org/abs/2506.04166) and test out new methods or datasets, check out the `bench` directory. For direct access to the data used in the $N^2$ bench, we host the data for download on [this repo](https://github.com/calebchin/nsquared_bench_data). ## Submitting Changes ### Linting diff --git a/bench/README.md b/bench/README.md index bf9fa62..5f222c0 100644 --- a/bench/README.md +++ b/bench/README.md @@ -11,7 +11,7 @@ We run our experiments with shell scripts, which requires additional setup for W 3. Navigate to project bench directory ### For Mac / Linux Users -No additional setup should be necessary. +No additional setup should be necessary. ### Experiments: To replicate the experimental results in [our paper](https://arxiv.org/pdf/2506.04166), run `bench/experiments.sh` as follows: @@ -20,11 +20,11 @@ To replicate the experimental results in [our paper](https://arxiv.org/pdf/2506. # from the bench directory ./experiments.sh -o OUTPUT_DIR -l LOG_LEVEL -e EXPERIMENT_NAME ``` -If `EXPERIMENT_NAME` is `all` (default), experiments on all four datasets (heartsteps, movielens, prompteval, and prop99) will be run and stored in `OUTPUT_DIR`. You can also run the experiments for a specific dataset setting `EXPERIMENT_NAME` to `heartsteps`, `movielens`, `prompteval`, and `prop99`. +If `EXPERIMENT_NAME` is `all` (default), experiments on all four datasets (heartsteps, movielens, prompteval, and prop99) will be run and stored in `OUTPUT_DIR`. You can also run the experiments for a specific dataset setting `EXPERIMENT_NAME` to `heartsteps`, `movielens`, `prompteval`, and `prop99`. -The experiments for `movielens` are very memory-intensive due to the size of the dataset and could terminate unexpectedly. +The experiments for `movielens` are very memory-intensive due to the size of the dataset and could terminate unexpectedly. -For plotting utilities, see the `examples` directory for files with names prefixed by `plot`. +For plotting utilities, see the `examples` directory for files with names prefixed by `plot`. ## Adding and testing new methods @@ -32,8 +32,8 @@ For plotting utilities, see the `examples` directory for files with names prefix ### Nearest neighbor variants: To add a new nearest neighbor variant: -1. Define an `EstimationMethod` in `nsquared/estimation_methods.py`. - +1. Define an `EstimationMethod` in `nsquared/estimation_methods.py`. + ```python class MyNewEstimator(EstimationMethod): """Estimate things""" @@ -54,13 +54,13 @@ To add a new nearest neighbor variant: ) -> npt.NDArray: """ Impute the missing value at - the given row and column using + the given row and column using XYZ method """ ... ``` -2. Define a `FitMethod` (if needed). +2. Define a `FitMethod` (if needed). ```python class MyNewFitMethod(FitMethod): def __init__( @@ -86,24 +86,24 @@ To add a new nearest neighbor variant: ``` -3. To ensure compatability with the experiments and plotting functions, add an alias for your method in [`nsquared/utils/experiments.py`](https://github.com/aashish-khub/NearestNeighbors/blob/441a382efba2cf68c22ac379bd5750f91d9e03ee/src/nsquared/utils/experiments.py#L19) under the parser argument for `--estimation_method` and fill out [`nsquared/utils/plotting_utils.py`](https://github.com/aashish-khub/NearestNeighbors/blob/441a382efba2cf68c22ac379bd5750f91d9e03ee/src/nsquared/utils/plotting_utils.py#L19) with your desired plot settings. +3. To ensure compatability with the experiments and plotting functions, add an alias for your method in [`nsquared/utils/experiments.py`](https://github.com/aashish-khub/NearestNeighbors/blob/441a382efba2cf68c22ac379bd5750f91d9e03ee/src/nsquared/utils/experiments.py#L19) under the parser argument for `--estimation_method` and fill out [`nsquared/utils/plotting_utils.py`](https://github.com/aashish-khub/NearestNeighbors/blob/441a382efba2cf68c22ac379bd5750f91d9e03ee/src/nsquared/utils/plotting_utils.py#L19) with your desired plot settings. + +4. To test on a given dataset (for example: `heartsteps`), navigate to `examples/heartsteps/run_scalar.py` and add your method following the existing template. In general, all that is required is adding a block to [this conditional structure](https://github.com/aashish-khub/NearestNeighbors/blob/441a382efba2cf68c22ac379bd5750f91d9e03ee/examples/heartsteps/run_scalar.py#L157), but your method is not required to use the exact format of the `run_scalar.py` script. For distributional methods, do the same, but in `run_distribution.py`. -4. To test on a given dataset (for example: `heartsteps`), navigate to `examples/heartsteps/run_scalar.py` and add your method following the existing template. In general, all that is required is adding a block to [this conditional structure](https://github.com/aashish-khub/NearestNeighbors/blob/441a382efba2cf68c22ac379bd5750f91d9e03ee/examples/heartsteps/run_scalar.py#L157), but your method is not required to use the exact format of the `run_scalar.py` script. For distributional methods, do the same, but in `run_distribution.py`. - -5. Adjust the corresponding `slurm_scripts/*.sh` files in the `examples` directory to add your new methods alias under `METHODS`. +5. Adjust the corresponding `slurm_scripts/*.sh` files in the `examples` directory to add your new methods alias under `METHODS`. ### Non-nearest neigbor methods If you wish to test methods on the benchmark that do not follow the $N^2$ framework, there are two options: #### Option 1: -Use downloaded data hosted [here](https://github.com/calebchin/nsquared_bench_data). +Use downloaded data hosted [here](https://github.com/calebchin/nsquared_bench_data). -This contains the masked (missingness included) matrix used in our experiments, the corresponding unmasked (no missingness) matrix, and the masking matrix for each dataset. +This contains the masked (missingness included) matrix used in our experiments, the corresponding unmasked (no missingness) matrix, and the masking matrix for each dataset. #### Option 2: -Use the dataloader in `nsquared.datasets`. +Use the dataloader in `nsquared.datasets`. -For examples on how the dataloader works, check out the use of the loader [here](https://github.com/aashish-khub/NearestNeighbors/blob/main/examples/heartsteps/run_scalar.py) or [here](https://github.com/aashish-khub/NearestNeighbors/blob/main/examples/prop99/run_scalar.py). +For examples on how the dataloader works, check out the use of the loader [here](https://github.com/aashish-khub/NearestNeighbors/blob/main/examples/heartsteps/run_scalar.py) or [here](https://github.com/aashish-khub/NearestNeighbors/blob/main/examples/prop99/run_scalar.py). ## Adding new datasets @@ -147,8 +147,8 @@ To add a new dataset: def process_data_scalar(self, agg: str = "mean") -> tuple[np.ndarray, np.ndarray]: """ Process new dataset in the scalar setting (# of entries is 1) - """ - ... + """ + ... def process_data_distribution(self, data_type: DataType | None = None) -> tuple[np.ndarray, np.ndarray]: """ @@ -166,4 +166,4 @@ To add a new dataset: ```python from .loader import MyNewDatasetLoader # noqa: F401 ``` -4. To run the existing methods on the dataset, follow the template provided in any of the example `run_scalar.py` or `run_distribution.py` files. It is possible that all you will need to change is the data loading step (e.g. `my_new_dataloader = NNData.create("MyNewDataset")`). \ No newline at end of file +4. To run the existing methods on the dataset, follow the template provided in any of the example `run_scalar.py` or `run_distribution.py` files. It is possible that all you will need to change is the data loading step (e.g. `my_new_dataloader = NNData.create("MyNewDataset")`). \ No newline at end of file diff --git a/bench/experiments.sh b/bench/experiments.sh index d908e83..76997d5 100755 --- a/bench/experiments.sh +++ b/bench/experiments.sh @@ -39,7 +39,7 @@ fi for exper in ${EXPERIMENTS[@]}; do - if [ "$exper" = "heartsteps" ] + if [ "$exper" = "heartsteps" ] then HEARTSTEPS_DIR="../../bench/${OUTPUT_DIR}/heartsteps" echo "Running heartsteps experiment" @@ -48,14 +48,14 @@ do python run_distribution.py -od $HEARTSTEPS_DIR -dt kernel_mmd --force --log_level $LOG_LEVEL -em col-col python run_distribution.py -od $HEARTSTEPS_DIR -dt wasserstein_samples --force --log_level $LOG_LEVEL -em col-col cd ../../bench - elif [ "$exper" = "movielens" ] + elif [ "$exper" = "movielens" ] then MOVIELENS_DIR="../../bench/${OUTPUT_DIR}/movielens" echo "Running movielens experiment" cd ../examples/movielens ./slurm_scripts/run_accuracy.sh $MOVIELENS_DIR $LOG_LEVEL cd ../../bench - elif [ "$exper" = "prompteval" ] + elif [ "$exper" = "prompteval" ] then PROMPTEVAL_DIR="../../bench/${OUTPUT_DIR}/prompteval" echo "Running prompteval experiment" @@ -64,7 +64,7 @@ do python run_distribution.py -od $PROMPTEVAL_DIR -dt kernel_mmd --force --log_level $LOG_LEVEL -em col-col python run_distribution.py -od $PROMPTEVAL_DIR -dt wasserstein_samples --force --log_level $LOG_LEVEL -em col-col cd ../../bench - elif [ "$exper" = "prop99" ] + elif [ "$exper" = "prop99" ] then PROP99_DIR="../../bench/${OUTPUT_DIR}/prop99" cd ../examples/prop99 diff --git a/examples/heartsteps/plot_error_and_time.py b/examples/heartsteps/plot_error_and_time.py index 98403ea..dca297c 100644 --- a/examples/heartsteps/plot_error_and_time.py +++ b/examples/heartsteps/plot_error_and_time.py @@ -45,7 +45,18 @@ ) # rearrange the order of the estimation methods by # "usvt", "row-row", "col-col", "dr", "ts", "star" -ORDER = ["usvt", "softimpute", "col-col", "row-row", "dr", "ts", "auto", "star", "kernel", "wasserstein_samples"] +ORDER = [ + "usvt", + "softimpute", + "col-col", + "row-row", + "dr", + "ts", + "auto", + "star", + "kernel", + "wasserstein_samples", +] df_grouped = df_grouped.sort_values( by="estimation_method", key=lambda x: x.map(lambda y: ORDER.index(y)) ) @@ -84,7 +95,7 @@ ) ax.tick_params(axis="x", length=0) # Set tick length to 0 ax.set_ylabel(alias, fontsize=plotting_utils.LABEL_FONT_SIZE) - #ax.set_xlabel("Estimation methods",color="white", fontsize=plotting_utils.LABEL_FONT_SIZE) + # ax.set_xlabel("Estimation methods",color="white", fontsize=plotting_utils.LABEL_FONT_SIZE) ax.spines["top"].set_visible(False) ax.spines["right"].set_visible(False) diff --git a/examples/heartsteps/run_distribution.py b/examples/heartsteps/run_distribution.py index 741a61d..57c5611 100644 --- a/examples/heartsteps/run_distribution.py +++ b/examples/heartsteps/run_distribution.py @@ -22,7 +22,7 @@ from nsquared.data_types import ( DistributionKernelMMD, DistributionWassersteinSamples, - Scalar + Scalar, ) from nsquared import NearestNeighborImputer from nsquared.fit_methods import ( @@ -201,7 +201,9 @@ est_errors = [] error_datatype = Scalar() for i in range(len(imputations)): - est_errors.append(error_datatype.distance(np.nanmean(imputations[i]), np.nanmean(ground_truth[i]))) + est_errors.append( + error_datatype.distance(np.nanmean(imputations[i]), np.nanmean(ground_truth[i])) + ) # est_errors = np.abs(imputations - ground_truth) logger.info(f"Mean absolute error: {np.mean(est_errors)}") save_imputations = np.array(imputations, dtype=object) diff --git a/examples/movielens/run_scalar.py b/examples/movielens/run_scalar.py index eee7e5e..15e626e 100644 --- a/examples/movielens/run_scalar.py +++ b/examples/movielens/run_scalar.py @@ -1,4 +1,3 @@ - """Script to run NN imputers + USVT baseline on the MovieLens dataset using 20% of the observed indices as a test block. @@ -325,4 +324,4 @@ ) print(df[["est_errors", "time_impute", "time_fit"]].describe()) logger.info(f"Saving est_errors to {save_path}...") -df.to_csv(save_path, index=False) \ No newline at end of file +df.to_csv(save_path, index=False) diff --git a/examples/prompteval/plot_distribution.py b/examples/prompteval/plot_distribution.py index 4c89286..fa97be6 100644 --- a/examples/prompteval/plot_distribution.py +++ b/examples/prompteval/plot_distribution.py @@ -45,7 +45,7 @@ os.makedirs(figures_dir, exist_ok=True) results_dir = os.path.join(output_dir, "results") -#print(os.path.join(results_dir, f"est_errors-*-p{0.3}-tp{tuning_parameter}.csv")) +# print(os.path.join(results_dir, f"est_errors-*-p{0.3}-tp{tuning_parameter}.csv")) # files01 = glob( # os.path.join(results_dir, f"est_errors-*-p{0.3}-tp{tuning_parameter}.csv") # ) @@ -151,9 +151,9 @@ bins = list(np.linspace(0, 1, 30)) # 11 points create 10 bins for i in range(0, 100): - #row_09 = df_09.iloc[i] + # row_09 = df_09.iloc[i] row_05 = df_05.iloc[i] - #row_01 = df_01.iloc[i] + # row_01 = df_01.iloc[i] fig, ax2 = plt.subplots(figsize=(3, 2.5)) # all_data = row_09["data"]["ground_truth"] @@ -163,7 +163,7 @@ # for (est_method, fit_method, data_type), imputation in row_09["data"][ # type: ignore # "imputations" # ].items(): # type: ignore - # weights = np.ones_like(imputation) / len(imputation) + # weights = np.ones_like(imputation) / len(imputation) # ax1.hist( # imputation, # bins=bins, @@ -205,21 +205,22 @@ # for imputation in row_05["data"]["imputations"].values(): # type: ignore # all_data.append(imputation) # Plot imputation for each method - weights = np.ones_like(row_05["data"]["ground_truth"]) / len(row_05["data"]["ground_truth"]) + weights = np.ones_like(row_05["data"]["ground_truth"]) / len( + row_05["data"]["ground_truth"] + ) ax2.hist( - row_05["data"]["ground_truth"], - bins=bins, - weights=weights, - alpha=0.6, - label="Ground\nTruth", - edgecolor="black", - linestyle="--", - color="white", - ) + row_05["data"]["ground_truth"], + bins=bins, + weights=weights, + alpha=0.6, + label="Ground\nTruth", + edgecolor="black", + linestyle="--", + color="white", + ) for (est_method, fit_method, data_type), imputation in row_05["data"][ # type: ignore "imputations" ].items(): # type: ignore - if data_type == "wasserstein_samples": # Convert to numpy array if it's not already est_method_dt = "wasserstein_samples" @@ -227,10 +228,10 @@ est_method_dt = "kernel" if est_method == "col-col": est_method_lbl = "col" - elif est_method == "row-row": + else: est_method_lbl = "row" - - weights = np.ones_like(imputation) / len(imputation) + + weights = np.ones_like(imputation) / len(imputation) ax2.hist( imputation, bins=bins, @@ -241,7 +242,7 @@ color=COLORS[(est_method, fit_method, data_type)], ) # Plot ground truth - + ax2.set_ylabel("Proportion", fontsize=plotting_utils.LABEL_FONT_SIZE) ax2.set_xlabel("Score", fontsize=plotting_utils.LABEL_FONT_SIZE) ax2.legend(loc="upper right", fontsize=plotting_utils.LEGEND_FONT_SIZE) @@ -259,7 +260,7 @@ # ) # Move y-axis outward # Only add legend to the first subplot to avoid clutter - ax.legend(loc="upper left", fontsize=plotting_utils.LEGEND_FONT_SIZE) + ax2.legend(loc="upper left", fontsize=plotting_utils.LEGEND_FONT_SIZE) figures_path = os.path.join( figures_dir, diff --git a/examples/prompteval/run_distribution.py b/examples/prompteval/run_distribution.py index 3c20cc3..c34411f 100644 --- a/examples/prompteval/run_distribution.py +++ b/examples/prompteval/run_distribution.py @@ -28,6 +28,7 @@ from nsquared.fit_methods import LeaveBlockOutValidation from ks import ks_distance + parser = get_base_parser() parser.add_argument( "--data_type", @@ -187,4 +188,4 @@ print(df[["est_errors"]].describe()) logger.info(f"Saving est_errors to {save_path}...") -df.to_csv(save_path, index=False) \ No newline at end of file +df.to_csv(save_path, index=False) diff --git a/examples/simulations/README.md b/examples/simulations/README.md index bac30d6..f454272 100644 --- a/examples/simulations/README.md +++ b/examples/simulations/README.md @@ -1,7 +1,7 @@ # Replicating simulations experiments
- + Figure 1: AutoNN recovers DRNN performance with High SNR
@@ -16,4 +16,4 @@ To replicate Figure 1, run the following commands while in the `examples/simulat # Plot the figure python plot_size_error.py --output_dir OUTPUT_DIR ``` -To replicate the low SNR case, run the same commands with option `-n 1.0` instead. \ No newline at end of file +To replicate the low SNR case, run the same commands with option `-n 1.0` instead. \ No newline at end of file diff --git a/examples/simulations/plot_size_error.py b/examples/simulations/plot_size_error.py index 429efce..a898839 100644 --- a/examples/simulations/plot_size_error.py +++ b/examples/simulations/plot_size_error.py @@ -5,11 +5,11 @@ from nsquared.utils import plotting_utils # Define T values and corresponding error rates for each method -#T_values = np.array([2**4, 2**5, 2**6, 2**7]) +# T_values = np.array([2**4, 2**5, 2**6, 2**7]) # Define T values and corresponding error rates for each method -#T_values = np.array([2**4, 2**5, 2**6, 2**7]) +# T_values = np.array([2**4, 2**5, 2**6, 2**7]) parser = argparse.ArgumentParser(description="Plot estimation errors") @@ -42,8 +42,8 @@ def _process_csv(filepath: str) -> np.ndarray: # Process each CSV file -#col_err = _process_csv(f"{output_dir}/results/est_errors-col-col-lbo.csv") -#ow_err = _process_csv(f"{output_dir}/results/est_errors-row-row-lbo.csv") +# col_err = _process_csv(f"{output_dir}/results/est_errors-col-col-lbo.csv") +# ow_err = _process_csv(f"{output_dir}/results/est_errors-row-row-lbo.csv") # usvt_err = process_csv(f"{output_dir}/results/est_errors-usvt-lbo.csv") drnn_err = _process_csv(f"{output_dir}/results/est_errors-dr-lbo.csv") tsnn_err = _process_csv(f"{output_dir}/results/est_errors-ts-lbo.csv") @@ -53,8 +53,8 @@ def _process_csv(filepath: str) -> np.ndarray: # Extract errors for each method as a numpy array 4 x 30 # USVT_errors = 2**-3 * T_values**-0.10 -#UserNN_errors = np.nanmean(row_err, axis=1) -#TimeNN_errors = np.nanmean(col_err, axis=1) +# UserNN_errors = np.nanmean(row_err, axis=1) +# TimeNN_errors = np.nanmean(col_err, axis=1) DRNN_errors = np.nanmean(drnn_err, axis=1) # USVT_errors = np.nanmean(usvt_err, axis = 1) TSNN_errors = np.nanmean(tsnn_err, axis=1) @@ -62,8 +62,8 @@ def _process_csv(filepath: str) -> np.ndarray: Auto_errors = np.nanmean(auto_err, axis=1) -#unn_stderr = np.nanstd(row_err, axis=1) / np.sqrt(row_err.shape[1]) -#tnn_stderr = np.nanstd(col_err, axis=1) / np.sqrt(col_err.shape[1]) +# unn_stderr = np.nanstd(row_err, axis=1) / np.sqrt(row_err.shape[1]) +# tnn_stderr = np.nanstd(col_err, axis=1) / np.sqrt(col_err.shape[1]) drnn_stderr = np.nanstd(drnn_err, axis=1) / np.sqrt(drnn_err.shape[1]) # usvt_stderr = np.nanstd(usvt_err, axis = 1) / np.sqrt(usvt_err.shape[1]) tsnn_stderr = np.nanstd(tsnn_err, axis=1) / np.sqrt(tsnn_err.shape[1]) @@ -73,7 +73,7 @@ def _process_csv(filepath: str) -> np.ndarray: # Create the plot plt.figure(figsize=(plotting_utils.NEURIPS_TEXTWIDTH / 2, 2.5)) -#figsize=(plotting_utils.NEURIPS_TEXTWIDTH / 2, 2.5) +# figsize=(plotting_utils.NEURIPS_TEXTWIDTH / 2, 2.5) # plt.plot(T_values, USVT_errors, 'r', linestyle='-', marker='D', markersize=8, linewidth=2, label=r'USVT: $T^{-0.46}$') @@ -90,13 +90,14 @@ def _add_regression_line( # usvt_slope = add_regression_line(T_values, USVT_errors, 'red', 'USVT', '--') -#unn_slope = _add_regression_line(T_values, UserNN_errors, "green", "User-NN", ":") -#tnn_slope = _add_regression_line(T_values, TimeNN_errors, "orange", "Time-NN", ":") +# unn_slope = _add_regression_line(T_values, UserNN_errors, "green", "User-NN", ":") +# tnn_slope = _add_regression_line(T_values, TimeNN_errors, "orange", "Time-NN", ":") drnn_slope = _add_regression_line(T_values, DRNN_errors, "blue", "DR-NN", ":") tsnn_slope = _add_regression_line(T_values, TSNN_errors, "green", "Time-NN", ":") auto_slope = _add_regression_line(T_values, Auto_errors, "red", "Auto-NN", "--") # softimpute_slope = add_regression_line(T_values, Softimpute_errors, 'black', 'SoftImpute', ':') + # Plot each method with corresponding markers, colors, and line styles # plt.errorbar(T_values, USVT_errors, yerr=usvt_stderr, fmt = 'r', marker='>', markersize=12, linestyle='None', barsabove=True, label=rf'USVT: $T^{{{usvt_slope:.2f}}}$') # plt.errorbar( @@ -120,9 +121,10 @@ def _add_regression_line( # markersize=12, # label=rf"Col-NN: $T^{{{tnn_slope:.2f}}}$", # ) -def _format_lbl(method:str) -> str: +def _format_lbl(method: str) -> str: return str(plotting_utils.METHOD_ALIASES_SINGLE_LINE.get(method, method)) + plt.errorbar( T_values, DRNN_errors, @@ -166,7 +168,7 @@ def _format_lbl(method:str) -> str: plt.legend(fontsize=plotting_utils.LEGEND_FONT_SIZE, loc="upper right") # set tick font size -#print(plotting_utils.TICK_FONT_SIZE) +# print(plotting_utils.TICK_FONT_SIZE) plt.tick_params(axis="both", which="major", labelsize=plotting_utils.LABEL_FONT_SIZE) # Grid for better readability diff --git a/src/nsquared/datasets/prompteval/loader.py b/src/nsquared/datasets/prompteval/loader.py index 61ee8e8..0faecd3 100644 --- a/src/nsquared/datasets/prompteval/loader.py +++ b/src/nsquared/datasets/prompteval/loader.py @@ -255,7 +255,7 @@ def process_data_scalar(self) -> tuple[np.ndarray, np.ndarray]: mask = np.random.binomial(1, propensity, size=df.shape) data = df.to_numpy(dtype=float) - #data[mask == 0] = np.nan + # data[mask == 0] = np.nan self.data = data self.mask = mask return data, mask @@ -324,8 +324,8 @@ def process_data_distribution( # Simulate MCAR missingness mask = np.random.binomial(1, propensity, size=data.shape[:2]) - #TODO: change this back later - #data[mask == 0] = np.nan + # TODO: change this back later + # data[mask == 0] = np.nan self.data = data self.mask = mask From ca43a32aa99e2f7f5ca2735ab873c1fa6a5bebe7 Mon Sep 17 00:00:00 2001 From: Caleb Chin Date: Thu, 17 Jul 2025 22:43:18 -0700 Subject: [PATCH 19/19] Update version to 1.1.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f986b73..dfef86b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta" name = "nsquared" requires-python = ">=3.10" description = "A comprehensive nearest neighbors library for matrix completion with scalar and distributional entries" -version = "1.0.0" +version = "1.1.0" authors = [ {name="Aashish Khubchandani", email="akk223@cornell.edu"}, {name="Albert Gong", email="agong@cs.cornell.edu"},