From de9f7de63ba45afd1ecfaf10afd7b400229f6f38 Mon Sep 17 00:00:00 2001 From: PowersPope Date: Sun, 16 Jul 2023 19:06:12 -0700 Subject: [PATCH 1/3] Added in explanatory comments and function doc strings for the first two functions and a couple following ones in gzip-regressor --- gzip_regressor.py | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/gzip_regressor.py b/gzip_regressor.py index a17a9ca..2dbb49a 100644 --- a/gzip_regressor.py +++ b/gzip_regressor.py @@ -10,9 +10,38 @@ def regress_(x1, X_train, y_train, k): + """Generate a byte compression matrix from x1 based upon + passed X_train input concats + + PARAMETERS + ---------- + x1 : str + Input smiles molecule string + + X_train : tuple | list (iterable) + list or tuple of smiles moleclue strings + + y_train : list (iterable) + y labels for each element in X_train + + k : int + Number of neighbors to collect in K-NN + + + RETURNS + ------- + task_preds : list + + """ + # Compress encoded (utf-8) x1 passed in to fun + # take length Cx1 = len(gzip.compress(x1.encode())) distance_from_x1 = [] + # Loop through x2 to generate + # normalized compression distances from Cx1x2 based + # upon Cx1 and Cx2. We normalize by longest compression + # sequence for x2 in X_train: Cx2 = len(gzip.compress(x2.encode())) x1x2 = " ".join([x1, x2]) @@ -20,12 +49,16 @@ def regress_(x1, X_train, y_train, k): ncd = (Cx1x2 - min(Cx1, Cx2)) / max(Cx1, Cx2) distance_from_x1.append(ncd) + # Sort ncd indexes in ascending order based upon distance + # These are used to grab top K-NN for both values and dists distance_from_x1 = np.array(distance_from_x1) sorted_idx = np.argsort(distance_from_x1) top_k_values = y_train[sorted_idx[:k]] top_k_dists = distance_from_x1[sorted_idx[:k]] task_preds = [] + # Loop through both top_k_value.T and top_k_dists.T + # Scale the predictions by the total distance found within a sample for vals, dists in zip(np.array(top_k_values).T, np.array(top_k_dists).T): dists = 1 - dists task_preds.append(np.mean(vals * dists) / np.sum(dists)) @@ -34,6 +67,28 @@ def regress_(x1, X_train, y_train, k): def regress(X_train, y_train, X_test, k): + """Perform Regression based task on dataset + + PARAMETERS + ---------- + X_train : list | tuple (iterable) + Smiles train dataset + + y_train : list | tuple (iterable) + Particular y prediction values associated with + regression task specified + + X_test : list | tuple (iterable) + Smiles testing dataset + + k : int + Amount of neighbors to consider in K-NN + + RETURNS + ------- + preds : np.array + Array of predicted y values for the X_test dataset + """ preds = [] cpu_count = multiprocessing.cpu_count() @@ -53,6 +108,19 @@ def regress(X_train, y_train, X_test, k): def compute_pairwise_ncd(pair): + """Compute the normalized compression pairwise distance + between two smiles + + PARAMTERS + --------- + pair : tuple + Smiles to compare + + RETURNS + ------- + ncd : float + Normalized Compression Distance + """ x1, x2 = pair Cx1 = len(gzip.compress(x1.encode())) Cx2 = len(gzip.compress(x2.encode())) From 753eacadb12e6742035204d1584720e502eb201e Mon Sep 17 00:00:00 2001 From: PowersPope Date: Tue, 18 Jul 2023 23:37:39 -0700 Subject: [PATCH 2/3] Tried to perform Lasso regression on the regression based dataset. I saw that both Lasso regression and a pseudo onehot encoding for each smile and its combination with kNN was not very effective. It could also, be the approach I am applying currently. I need to look into allpying the onehot to classification. --- LASSO_REGRESSION.md | 23 ++++ gzip_lasso_regressor.py | 261 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 284 insertions(+) create mode 100644 LASSO_REGRESSION.md create mode 100644 gzip_lasso_regressor.py diff --git a/LASSO_REGRESSION.md b/LASSO_REGRESSION.md new file mode 100644 index 0000000..214d50b --- /dev/null +++ b/LASSO_REGRESSION.md @@ -0,0 +1,23 @@ +Implementing GZip Lasso Regression (with kNN=0) shows worse performance then using normal base regression with kNN. +The alpha used was 0.03. I used GridSearch to find the best alpha. However, I only did it +for freesolv in this iteration. + +# Results Gzip-based Molecular Lasso-Regression +|Data Set|Split |AUROC/RMSE (Valid)|F1/MAE (Valid) |AUROC/RMSE (Test)| F1/MAE (Test) | +|--------|------|------------------|---------------|-----------------|---------------| +|freesolv|random|0.751 +/- 0.174 |0.341 +/- 0.174|0.653 +/- 0.174 |0.367 +/- 0.174| +|delaney |random|1.562 +/- 0.051 |1.236 +/- 0.051|1.693 +/- 0.051 |1.337 +/- 0.051| +|lipo |random|1.105 +/- 0.035 |0.925 +/- 0.035|1.134 +/- 0.035 |0.954 +/- 0.035| + +Also, tried adding in categorical information from what unique smiles x1 and x2 came from to form the compressed +sequence. It definitely hurt the model. Still wanted to try it out. +freesolv alpha = 0.02 +delaney alpha = 0.0 (Lasso doesn't converge well with an alpha of 0.0) +lip alpha = 0.01 +# Results Gzip-based Molecular Lasso-Regression w/ OneHot +|Data Set|Split |AUROC/RMSE (Valid)|F1/MAE (Valid) |AUROC/RMSE (Test)| F1/MAE (Test) | +|--------|------|------------------|---------------|-----------------|---------------| +|freesolv|random|0.626 +/- 0.076 |0.331 +/- 0.076|0.674 +/- 0.076 |0.328 +/- 0.076| +|delaney |random|1.705 +/- 0.094 |1.33 +/- 0.094 |1.706 +/- 0.094 |1.334 +/- 0.094| +|lipo |random|1.132 +/- 0.022 |0.949 +/- 0.022|1.124 +/- 0.022 |0.93 +/- 0.022| + diff --git a/gzip_lasso_regressor.py b/gzip_lasso_regressor.py new file mode 100644 index 0000000..f7b777e --- /dev/null +++ b/gzip_lasso_regressor.py @@ -0,0 +1,261 @@ +import gzip +import multiprocessing +from typing import Iterable, Tuple +from collections import Counter +from functools import partial +import numpy as np +from tqdm import tqdm +from scipy.linalg import solve +from sklearn.metrics.pairwise import pairwise_distances +from sklearn.linear_model import Lasso +from sklearn.model_selection import GridSearchCV +from sklearn.model_selection import RepeatedKFold + +def genonehot_smiles(smiles: list, onehot_dict: dict=dict()) -> dict: + """Convert smiles into a categorical onehot dictionary. + The model needs to be able to track what it is looking + at not only NCD + + PARAMETERS + ---------- + smiles : List[str] + List containing smiles. + + onehot_dict : dict (default is dict()) + This is either an empty dict or one that needs to be added + to. The keys are the smiles and the values are its column + in the onehot matrix. + + RETURNS + ------- + onehot_dict : dict + The keys are the smiles and the values are its columns + in the onehot matrix. + """ + # determine if empty dict or not + if onehot_dict == {}: + # Pull out unique smiles + unique_smiles = set(smiles) + # make a numpy array that goes from 0 to len + Nunique_smiles = np.arange(len(unique_smiles)) + onehot_dict = dict(zip( + unique_smiles, + Nunique_smiles + )) + else: + # pull out old smiles + key_smiles = list(onehot_dict.keys()) + # combine the list + key_smiles.extend(smiles) + # Pull out unique smiles + unique_smiles = set(key_smiles) + # make a numpy array that goes from 0 to len + Nunique_smiles = np.arange(len(unique_smiles)) + onehot_dict = dict( + zip( + unique_smiles, + Nunique_smiles + ) + ) + return onehot_dict + + +def regress_lasso_traindata_(x1: str, + X_train: np.array, + k: int, + onehot_dict:dict) -> Tuple[np.array, np.array]: + """Generate a byte compression matrix from x1 based upon + passed X_train input concats + + PARAMETERS + ---------- + x1 : str + Input smiles molecule string + + X_train : tuple | list (iterable) + list or tuple of smiles moleclue strings + + y_train : list (iterable) + y labels for each element in X_train + + k: int + Number of Neighbors to consider in k-NN + + RETURNS + ------- + distance_from_x1 : np.array + NCD values associated with each Cx1x2 pair + + k_pairs : np.array + An Array of size (K, 2). The top k Cx1x2 distances + in kNN, but the indices + """ + # Compress encoded (utf-8) x1 passed in to fun + # take length + Cx1 = len(gzip.compress(x1.encode())) + distance_from_x1 = [] + smile_list = [] + + # Loop through x2 to generate + # normalized compression distances from Cx1x2 based + # upon Cx1 and Cx2. We normalize by longest compression + # sequence + for x2 in X_train: + Cx2 = len(gzip.compress(x2.encode())) + x1x2 = " ".join([x1, x2]) + Cx1x2 = len(gzip.compress(x1x2.encode())) + ncd = (Cx1x2 - min(Cx1, Cx2)) / max(Cx1, Cx2) + distance_from_x1.append(ncd) + smile_list.append(x2) + + # Return all of the distances from x1 + distance_from_x1 = np.array(distance_from_x1) + + # if kNN is set then apply neighbors only + if k != 0: + # Sort distances and pull out top k neighbors + sorted_idx = np.argsort(distance_from_x1) + distance_from_x1 = distance_from_x1[sorted_idx[:k]] + top_k_distance = [smile_list[i] for i in sorted_idx[:k]] + # pull out top 5 indexes per row + # k_pairs = sorted_idx[:5] + vectorize_keys = np.vectorize(lambda key1, key2: (onehot_dict[key1], + onehot_dict[key2])) + k_pairs = vectorize_keys([x1]*k, top_k_distance) + k_pairs = np.vstack( + (k_pairs[0], k_pairs[1]), + ) + else: + k_pairs = np.array(0) + + return distance_from_x1, k_pairs.T + + +def regress_lasso(X_train, y_train, X_test, + k, onehot_dict) -> np.array: + """Perform Lasso based Regression on dataset to + train and predict + + PARAMETERS + ---------- + X_train : list | tuple (iterable) + Smiles train dataset + + y_train : list | tuple (iterable) + Particular y prediction values associated with + regression task specified + + X_test : list | tuple (iterable) + Smiles testing dataset + + k : int + Determine number of neighbors to consider in kNN + RETURNS + ------- + preds : np.array + Array of predicted y values for the X_test dataset + """ + # dataset_train = [] + # preds = [] + # k_pairs = [] + + cpu_count = multiprocessing.cpu_count() + + with multiprocessing.Pool(cpu_count) as p: + train_tuple = p.map( + partial( + regress_lasso_traindata_, + X_train=X_train, + k=k, + onehot_dict=onehot_dict, + ), + X_train, + ) + dataset_train, k_pairs_train = zip(*train_tuple) + + with multiprocessing.Pool(cpu_count) as p: + test_tuple = p.map( + partial( + regress_lasso_traindata_, + X_train=X_train, + k=k, + onehot_dict=onehot_dict + ), + X_test + ) + dataset_test, k_pairs_test = zip(*test_tuple) + + + # Convert both datasets to np.arrays for fitting + dataset_train = np.array(dataset_train) + dataset_test = np.array(dataset_test) + + # grab length + train_len = dataset_train.shape[0] + test_len = dataset_test.shape[0] + + # Full dataset + full_dataset = np.concatenate(( + dataset_train, + dataset_test, + )) + + # Number of pairs in data + pairs = np.concatenate(( + np.concatenate(k_pairs_train), + np.concatenate(k_pairs_test) + )) + + # encode string pairs into categorical data + onehot_mat = np.zeros((pairs.shape[0], len(onehot_dict))) + onehot_mat[np.arange(pairs.shape[0]), pairs[:, 0]] = 1. + onehot_mat[np.arange(pairs.shape[0]), pairs[:, 1]] = 1. + + # combine distances and onehote pairs + X_full = np.concatenate( + (onehot_mat, full_dataset.flatten().reshape(-1,1)), + axis=1 + ) + + if k != 0: + train_X = X_full[:train_len*k,:] + test_X = X_full[train_len*k:,:] + # reformat y to fit train_X + y_reshape = np.repeat(y_train, k, axis=0) + else: + train_X = X_full[:train_len*train_len,:] + test_X = X_full[train_len*train_len:,:] + # reformat y to fit train_X + y_reshape = np.repeat(y_train, train_len, axis=0) + + gridsearch_alpha(train_X, y_reshape) + + # Init lasso model + # alpha generated from GridSearchCV + model = Lasso(alpha=0.01) + + # fit and predict values + model.fit(train_X, y_reshape) + preds = model.predict(test_X) + + return np.array(preds) + +def gridsearch_alpha(X_train, y_train) -> int: + print('\n') + print("*********STARTING GRIDSEARCH***********") + model = Lasso() + + # define model evaluation method + cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) + # define grid + grid = dict() + grid['alpha'] = np.linspace(0, 1, 21) + # define search + search = GridSearchCV(model, grid, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1) + # perform the search + results = search.fit(X_train, y_train) + # summarize + print('MAE: %.3f' % results.best_score_) + print('Config: %s' % results.best_params_) + + return 0 From e9bea0ee4cfee479285f083f651fb7157eaece80 Mon Sep 17 00:00:00 2001 From: Andrew Powers Date: Tue, 25 Jul 2023 21:37:39 -0700 Subject: [PATCH 3/3] DATA - Make Gzip Varying Compression Test Graphs * Generated RMSE valid graph with error bars `RMSE_VALID_CLASSIFICATION.png` * Generated RMSE test graph with error bars `RMSE_TEST_CLASSIFICATION.png` * Uploaded dataset of total run. Formated into CSV format. --- .../RMSE_TEST_CLASSIFICATION.png | Bin 0 -> 32382 bytes .../RMSE_VALID_CLASSIFICATION.png | Bin 0 -> 32887 bytes gzip_compression_test/total_results.csv | 81 ++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 gzip_compression_test/RMSE_TEST_CLASSIFICATION.png create mode 100644 gzip_compression_test/RMSE_VALID_CLASSIFICATION.png create mode 100644 gzip_compression_test/total_results.csv diff --git a/gzip_compression_test/RMSE_TEST_CLASSIFICATION.png b/gzip_compression_test/RMSE_TEST_CLASSIFICATION.png new file mode 100644 index 0000000000000000000000000000000000000000..8a75b508f8c73f18355784fd9349bc8c29343375 GIT binary patch literal 32382 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 literal 0 HcmV?d00001 diff --git a/gzip_compression_test/RMSE_VALID_CLASSIFICATION.png b/gzip_compression_test/RMSE_VALID_CLASSIFICATION.png new file mode 100644 index 0000000000000000000000000000000000000000..9efd569a62f2bbab86d3b697e005485cab6d45d5 GIT binary patch literal 32887 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 literal 0 HcmV?d00001 diff --git a/gzip_compression_test/total_results.csv b/gzip_compression_test/total_results.csv new file mode 100644 index 0000000..127a0c3 --- /dev/null +++ b/gzip_compression_test/total_results.csv @@ -0,0 +1,81 @@ +Compression,DataSet,Split,RMSE_Valid,RMSE_STD_VALID,MAE_Valid,MAE_STD_VALID,RMSE_Test,RMSE_STD_TEST,MAE_Test,MAE_STD_TEST, +0,hiv,random,0.493,0.015,0.835,0.015,0.499,0.015,0.832,0.015, +0,sider,random,0.507,0.011,0.52,0.011,0.396,0.011,0.514,0.011, +0,bbbp,scaffold,0.313,0.0,0.338,0.0,0.447,0.0,0.451,0.0, +0,bace_classification,random,0.518,0.008,0.555,0.008,0.501,0.008,0.516,0.008, +0,clintox,random,0.539,0.067,0.792,0.067,0.504,0.067,0.8,0.067, +0,tox21,random,0.519,0.013,0.129,0.013,0.517,0.013,0.129,0.013, +0,muv,random,0.375,0.216,0.0,0.216,0.125,0.216,0.0,0.216, +0,schneider,random,0.0,0.0,0.144,0.0,0.0,0.0,0.144,0.0, +1,hiv,random,0.753,0.013,0.9,0.013,0.753,0.013,0.897,0.013, +1,sider,random,0.442,0.256,0.648,0.256,0.591,0.256,0.658,0.256, +1,bbbp,scaffold,0.916,0.0,0.917,0.0,0.629,0.0,0.618,0.0, +1,bace_classification,random,0.826,0.019,0.828,0.019,0.795,0.019,0.794,0.019, +1,clintox,random,0.913,0.017,0.908,0.017,0.895,0.017,0.915,0.017, +1,tox21,random,0.685,0.003,0.289,0.003,0.691,0.003,0.278,0.003, +1,muv,random,0.407,0.235,0.03,0.235,0.415,0.235,0.039,0.235, +1,schneider,random,0.0,0.0,0.795,0.0,0.0,0.0,0.795,0.0, +2,hiv,random,0.751,0.008,0.896,0.008,0.754,0.008,0.898,0.008, +2,sider,random,0.587,0.015,0.652,0.015,0.595,0.015,0.66,0.015, +2,bbbp,scaffold,0.925,0.0,0.926,0.0,0.65,0.0,0.637,0.0, +2,bace_classification,random,0.804,0.031,0.798,0.031,0.815,0.031,0.816,0.031, +2,clintox,random,0.923,0.03,0.908,0.03,0.884,0.03,0.893,0.03, +2,tox21,random,0.702,0.02,0.3,0.02,0.687,0.02,0.301,0.02, +2,muv,random,0.131,0.228,0.041,0.228,0.28,0.228,0.038,0.228, +2,schneider,random,0.0,0.0,0.798,0.0,0.0,0.0,0.798,0.0, +3,hiv,random,0.761,0.015,0.896,0.015,0.762,0.015,0.897,0.015, +3,sider,random,0.448,0.259,0.661,0.259,0.59,0.259,0.648,0.259, +3,bbbp,scaffold,0.914,0.0,0.917,0.0,0.644,0.0,0.632,0.0, +3,bace_classification,random,0.833,0.028,0.828,0.028,0.794,0.028,0.793,0.028, +3,clintox,random,0.881,0.041,0.893,0.041,0.878,0.041,0.909,0.041, +3,tox21,random,0.695,0.015,0.293,0.015,0.693,0.015,0.294,0.015, +3,muv,random,0.269,0.269,0.027,0.269,0.261,0.269,0.034,0.269, +3,schneider,random,0.0,0.0,0.797,0.0,0.0,0.0,0.797,0.0, +4,hiv,random,0.748,0.018,0.898,0.018,0.762,0.018,0.896,0.018, +4,sider,random,0.583,0.011,0.641,0.011,0.578,0.011,0.646,0.011, +4,bbbp,scaffold,0.931,0.0,0.931,0.0,0.648,0.0,0.637,0.0, +4,bace_classification,random,0.783,0.023,0.785,0.023,0.797,0.023,0.794,0.023, +4,clintox,random,0.899,0.026,0.9,0.026,0.943,0.026,0.918,0.026, +4,tox21,random,0.698,0.015,0.301,0.015,0.686,0.015,0.287,0.015, +4,muv,random,0.279,0.279,0.044,0.279,0.271,0.279,0.029,0.279, +4,schneider,random,0.0,0.0,0.798,0.0,0.0,0.0,0.798,0.0, +5,hiv,random,0.734,0.023,0.894,0.023,0.761,0.023,0.898,0.023, +5,sider,random,0.606,0.006,0.659,0.006,0.591,0.006,0.653,0.006, +5,bbbp,scaffold,0.931,0.0,0.931,0.0,0.634,0.0,0.623,0.0, +5,bace_classification,random,0.809,0.011,0.808,0.011,0.808,0.011,0.806,0.011, +5,clintox,random,0.93,0.008,0.916,0.008,0.856,0.008,0.892,0.008, +5,tox21,random,0.69,0.011,0.296,0.011,0.693,0.011,0.289,0.011, +5,muv,random,0.284,0.284,0.046,0.284,0.278,0.284,0.049,0.284, +5,schneider,random,0.0,0.0,0.802,0.0,0.0,0.0,0.802,0.0, +6,hiv,random,0.747,0.016,0.899,0.016,0.743,0.016,0.899,0.016, +6,sider,random,0.296,0.297,0.658,0.297,0.433,0.297,0.648,0.297, +6,bbbp,scaffold,0.931,0.0,0.931,0.0,0.634,0.0,0.623,0.0, +6,bace_classification,random,0.797,0.018,0.798,0.018,0.799,0.018,0.798,0.018, +6,clintox,random,0.925,0.047,0.926,0.047,0.908,0.047,0.895,0.047, +6,tox21,random,0.7,0.013,0.292,0.013,0.701,0.013,0.305,0.013, +6,muv,random,0.139,0.241,0.037,0.241,0.283,0.241,0.052,0.241, +6,schneider,random,0.0,0.0,0.802,0.0,0.0,0.0,0.802,0.0, +7,hiv,random,0.754,0.015,0.895,0.015,0.729,0.015,0.897,0.015, +7,sider,random,0.583,0.009,0.649,0.009,0.598,0.009,0.646,0.009, +7,bbbp,scaffold,0.931,0.0,0.931,0.0,0.634,0.0,0.623,0.0, +7,bace_classification,random,0.792,0.006,0.79,0.006,0.817,0.006,0.814,0.006, +7,clintox,random,0.938,0.033,0.923,0.033,0.894,0.033,0.911,0.033, +7,tox21,random,0.705,0.014,0.295,0.014,0.693,0.014,0.287,0.014, +7,muv,random,0.156,0.27,0.031,0.27,0.547,0.27,0.035,0.27, +7,schneider,random,0.0,0.0,0.801,0.0,0.0,0.0,0.801,0.0, +8,hiv,random,0.765,0.008,0.899,0.008,0.748,0.008,0.896,0.008, +8,sider,random,0.592,0.016,0.644,0.016,0.602,0.016,0.656,0.016, +8,bbbp,scaffold,0.931,0.0,0.931,0.0,0.634,0.0,0.623,0.0, +8,bace_classification,random,0.798,0.037,0.798,0.037,0.799,0.037,0.798,0.037, +8,clintox,random,0.888,0.025,0.899,0.025,0.904,0.025,0.919,0.025, +8,tox21,random,0.685,0.01,0.281,0.01,0.704,0.01,0.304,0.01, +8,muv,random,0.146,0.252,0.035,0.252,0.411,0.252,0.032,0.252, +8,schneider,random,0.0,0.0,0.801,0.0,0.0,0.0,0.801,0.0, +9,hiv,random,0.75,0.014,0.898,0.014,0.763,0.014,0.898,0.014, +9,sider,random,0.446,0.258,0.663,0.258,0.589,0.258,0.643,0.258, +9,bbbp,scaffold,0.931,0.0,0.931,0.0,0.634,0.0,0.623,0.0, +9,bace_classification,random,0.788,0.045,0.788,0.045,0.828,0.045,0.826,0.045, +9,clintox,random,0.904,0.032,0.92,0.032,0.916,0.032,0.892,0.032, +9,tox21,random,0.699,0.004,0.288,0.004,0.698,0.004,0.305,0.004, +9,muv,random,0.128,0.221,0.038,0.221,0.138,0.221,0.036,0.221, +9,schneider,random,0.0,0.0,0.801,0.0,0.0,0.0,0.801,0.0,