{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":59094,"databundleVersionId":7010844,"sourceType":"competition"},{"sourceId":6997648,"sourceType":"datasetVersion","datasetId":4007386}],"dockerImageVersionId":30588,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"***PLEASE UPVOTE: https://www.kaggle.com/code/ambrosm/scp-quickstart***","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"markdown","source":"***PLEASE UPVOTE: https://www.kaggle.com/code/alexandervc/pyboost-secret-grandmaster-s-tool***","metadata":{}},{"cell_type":"markdown","source":"***PLEASE UPVOTE: https://www.kaggle.com/code/stasborodynkin/pyboost-secret-grandmaster-s-tool/notebook?scriptVersionId=150990150*****","metadata":{}},{"cell_type":"code","source":"import warnings\nwarnings.simplefilter('ignore')\n\nimport pandas as pd\n\npd.set_option('display.max_columns', 30)","metadata":{"execution":{"iopub.status.busy":"2023-11-18T16:09:08.826151Z","iopub.execute_input":"2023-11-18T16:09:08.827078Z","iopub.status.idle":"2023-11-18T16:09:09.236381Z","shell.execute_reply.started":"2023-11-18T16:09:08.827044Z","shell.execute_reply":"2023-11-18T16:09:09.23514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\n\nSEED = 42\nnp.random.seed(SEED)","metadata":{"execution":{"iopub.status.busy":"2023-11-18T16:09:09.238118Z","iopub.execute_input":"2023-11-18T16:09:09.238556Z","iopub.status.idle":"2023-11-18T16:09:09.24352Z","shell.execute_reply.started":"2023-11-18T16:09:09.238512Z","shell.execute_reply":"2023-11-18T16:09:09.242523Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"de_train = pd.read_parquet('/kaggle/input/open-problems-single-cell-perturbations/de_train.parquet')\nid_map = pd.read_csv ('/kaggle/input/open-problems-single-cell-perturbations/id_map.csv')\n\nsub_0_567 = pd.read_csv('/kaggle/input/op-scp-submissions-2/submission_0_567_v7.csv')\nsub_0_567 = pd.concat([id_map, sub_0_567], axis=1).drop(columns='id')\n\nsub_0_568 = pd.read_csv('/kaggle/input/op-scp-submissions-2/submission_0_568.csv')\nsub_0_568 = pd.concat([id_map, sub_0_568], axis=1).drop(columns='id')\n\nsub_0_569 = pd.read_csv('/kaggle/input/op-scp-submissions-2/submission_0_569.csv')\nsub_0_569 = pd.concat([id_map, sub_0_569], axis=1).drop(columns='id')\n\nde_train = pd.concat([de_train, sub_0_567, sub_0_568, sub_0_569], ignore_index=True)\nde_train","metadata":{"execution":{"iopub.status.busy":"2023-11-18T16:09:09.244817Z","iopub.execute_input":"2023-11-18T16:09:09.245158Z","iopub.status.idle":"2023-11-18T16:09:24.733645Z","shell.execute_reply.started":"2023-11-18T16:09:09.245124Z","shell.execute_reply":"2023-11-18T16:09:24.732646Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ids_data_AmbrosM = []\n\nsm_names = ['Idelalisib', \n            'Crizotinib',\n            'Linagliptin',\n            'Palbociclib', \n            'Dabrafenib', \n            'Alvocidib', \n            'LDN 193189',\n            'R428',\n            'Porcn Inhibitor III', \n            'Belinostat',\n            'Foretinib',\n            'MLN 2238',\n            'Penfluridol',\n            'Dactolisib',\n            'O-Demethylated Adapalene',\n            'Oprozomib (ONX 0912)',\n            'CHIR-99021']\n\ncell_types =  ['NK cells', 'T cells CD4+', 'T cells CD8+', 'T regulatory cells']\n\nfor cell_type in cell_types:\n    \n    mask_test = (de_train.cell_type == cell_type) & ~de_train.sm_name.isin(sm_names)\n    mask_train = ~mask_test\n    \n    ids_train = np.where(mask_train > 0)[0]\n    ids_test = np.where(mask_test > 0)[0]\n    \n    ids_data_AmbrosM.append([ids_train, ids_test])\n\nclass KFold_custom:\n    \n    def __init__(self):\n\n        self.folds_index_data = [[np.arange(0), np.arange(0)]]\n        self.folds_index_data = ids_data_AmbrosM\n        \n    def split(self, X=None):\n        \n        for item in self.folds_index_data:\n            \n            yield item[0],item[1]","metadata":{"execution":{"iopub.status.busy":"2023-11-18T16:09:24.736438Z","iopub.execute_input":"2023-11-18T16:09:24.736737Z","iopub.status.idle":"2023-11-18T16:09:24.751581Z","shell.execute_reply.started":"2023-11-18T16:09:24.73671Z","shell.execute_reply":"2023-11-18T16:09:24.750579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def save_submit(Y_submit_pred, i_total, version):\n    \n    submit = pd.DataFrame(Y_submit_pred, columns=de_train.columns[5:])\n    submit.index.name = 'id'\n    \n    submit.to_csv(f'submission_v{version}_m{i_total}.csv')","metadata":{"execution":{"iopub.status.busy":"2023-11-18T16:09:24.753032Z","iopub.execute_input":"2023-11-18T16:09:24.753482Z","iopub.status.idle":"2023-11-18T16:09:24.766789Z","shell.execute_reply.started":"2023-11-18T16:09:24.753442Z","shell.execute_reply":"2023-11-18T16:09:24.765821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install py-boost -q","metadata":{"execution":{"iopub.status.busy":"2023-11-18T16:09:24.767852Z","iopub.execute_input":"2023-11-18T16:09:24.768156Z","iopub.status.idle":"2023-11-18T16:09:39.93531Z","shell.execute_reply.started":"2023-11-18T16:09:24.76813Z","shell.execute_reply":"2023-11-18T16:09:39.933999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.decomposition import TruncatedSVD\nimport category_encoders as ce\n\nfrom py_boost import GradientBoosting\n\nfrom sklearn.metrics import r2_score\nfrom sklearn.metrics import mean_absolute_error\n\nN_COMPONENTS = 70\nMAX_DEPTH = 10\nNTREES = 5000\nSUBSAMPLE = 1\nCOLSAMPLE = 0.35\nLR = 0.01\ni_total = 0\nID_MAP_LEN = len(id_map)\nCELL_TYPE = 'T cells CD8+'\nVERSION = 1\n\nY = de_train.iloc[:, 5:].values\nX = de_train[['cell_type', 'sm_name']]\nX_submit = id_map[['cell_type', 'sm_name']]\n\nmetrics = pd.DataFrame()\n\nfor n_components in [N_COMPONENTS]:\n    \n    tsvd = TruncatedSVD(n_components=n_components, n_iter=7, random_state=42)\n    \n    quantile_encoder = ce.QuantileEncoder(quantile =.8)\n        \n    for max_depth in [MAX_DEPTH]:\n        \n        for ntrees in [NTREES]:\n            \n            for subsample in [SUBSAMPLE]:\n                \n                for colsample in [COLSAMPLE]:\n                    \n                    for lr in [LR]:\n                        \n                        i_total += 1\n\n                        Y_submit_pred = np.zeros((ID_MAP_LEN,  Y.shape[1]))\n                        i_blend_submit = 0 \n\n                        mrrmse_scores = []\n                        r2_scores = []\n                        mae_scores = []\n                        \n                        kf = KFold_custom()   \n                        \n                        for i, (ids_train,ids_test) in enumerate( kf.split()):\n                            \n                            is_cell_type = de_train['cell_type'] == CELL_TYPE\n                            ids_cell_type = list(np.where(is_cell_type>0)[0])\n                            ids_train = [i for i in ids_train if i not in ids_cell_type]\n                            \n                            X_train, X_test = X.values[ids_train], X.values[ids_test]\n                            X_submit_values = X_submit.values\n \n                            Y_tsvd = tsvd.fit_transform(Y[ids_train] )\n\n                            model = GradientBoosting('mse',\n                                                     ntrees=ntrees,\n                                                     lr=lr, \n                                                     max_depth=max_depth,\n                                                     subsample=subsample, \n                                                     colsample=colsample,\n                                                     min_data_in_leaf=1, \n                                                     min_gain_to_split=0,\n                                                     verbose=1000)          \n                            \n                            print(f'I_TOTAL: {i_total}\\nI: {i}\\nN_COMPONENTS: {n_components}\\nNTREES: {ntrees}\\n' + \\\n                                  f'LR: {lr}\\nMAX_DEPTH: {max_depth}\\nCOLSAMPLE: {colsample}\\nSUBSAMPLE: {subsample}\\n')\n                            print(30 * '-')\n                            \n                            for ids_gene in range(Y_tsvd.shape[1]):\n                            \n                                if ids_gene == 0:\n                                    \n                                    X_qe_train = quantile_encoder.fit_transform(X_train, Y_tsvd[:, ids_gene])\n                                    X_qe_test = quantile_encoder.transform(X_test)\n                                    X_qe_submit = quantile_encoder.transform(X_submit_values)\n                                    \n                                else:\n                                    X_qe_current = quantile_encoder.fit_transform(X_train, Y_tsvd[:, ids_gene])\n                                    X_qe_train = np.concatenate( [X_qe_train, X_qe_current], axis = 1)\n                                    \n                                    X_qe_current = quantile_encoder.transform(X_test)\n                                    X_qe_test = np.concatenate( [X_qe_test, X_qe_current], axis = 1)\n                                    \n                                    X_qe_current = quantile_encoder.transform(X_submit_values)\n                                    X_qe_submit = np.concatenate( [X_qe_submit, X_qe_current], axis = 1)\n\n                            print(f'X_QE_TRAIN.SHAPE: {X_qe_train.shape}\\nX_QE_TEST.SHAPE: {X_qe_test.shape}\\n' + \\\n                                  f'X_TRAIN.SHAPE: {X_train.shape}\\nX_TEST.SHAPE: {X_test.shape}\\nY_TSVD.SHAPE: {Y_tsvd.shape}')\n                            print(30 * '-')\n                            \n                            model.fit(X_qe_train, Y_tsvd)\n                            \n                            Y_qe_test_pred = model.predict(X_qe_test)\n                            \n                            Y_test_pred = tsvd.inverse_transform(Y_qe_test_pred)\n                            \n                            Y_submit_pred_current = tsvd.inverse_transform(model.predict(X_qe_submit))\n                            \n                            Y_submit_pred = (Y_submit_pred * i_blend_submit + Y_submit_pred_current ) / (i_blend_submit + 1)\n                            i_blend_submit += 1\n\n                            Y_test = Y[ids_test]\n                            mrrmse = np.sqrt(np.square(Y_test - Y_test_pred).mean(axis=1)).mean()\n                            r2 = r2_score(Y_test, Y_test_pred)\n                            mae = mean_absolute_error(Y_test, Y_test_pred)\n                            \n                            print(f'MRRMSE: {mrrmse}\\nR2: {r2}\\nMAE: {mae}')\n                            print(30 * '-')\n                            \n                            mrrmse_scores.append(mrrmse)\n                            r2_scores.append(r2)\n                            mae_scores.append(mae)\n                            \n                            print(f'MRRMSE_SCORES: {mrrmse_scores}\\nR2_SCORES: {r2_scores}\\nMAE_SCORES: {mae_scores}')\n                            print(60 * '=')\n                            \n                            metrics.loc[i, 'n_components'] = n_components\n                            metrics.loc[i, 'r2_mean'] = np.mean(r2_scores)\n                            metrics.loc[i, 'mae_mean'] = np.mean(mae_scores)  \n                            metrics.loc[i, 'max_depth'] = max_depth\n                            metrics.loc[i, 'max_depth'] = max_depth     \n                            metrics.loc[i, 'ntrees'] = ntrees     \n                            metrics.loc[i, 'subsample'] = subsample   \n                            metrics.loc[i, 'colsample'] = colsample     \n                            metrics.loc[i, 'lr'] = lr\n                            \n                        save_submit(Y_submit_pred, i_total, VERSION)","metadata":{"execution":{"iopub.status.busy":"2023-11-18T16:09:39.937291Z","iopub.execute_input":"2023-11-18T16:09:39.937775Z","iopub.status.idle":"2023-11-18T16:57:01.081029Z","shell.execute_reply.started":"2023-11-18T16:09:39.937727Z","shell.execute_reply":"2023-11-18T16:57:01.079779Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metrics.to_csv(f'metrics_v{VERSION}.csv')","metadata":{"execution":{"iopub.status.busy":"2023-11-18T16:57:01.082365Z","iopub.execute_input":"2023-11-18T16:57:01.082685Z","iopub.status.idle":"2023-11-18T16:57:01.09009Z","shell.execute_reply.started":"2023-11-18T16:57:01.082658Z","shell.execute_reply":"2023-11-18T16:57:01.089036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.read_csv('/kaggle/working/submission_v1_m1.csv')","metadata":{"execution":{"iopub.status.busy":"2023-11-18T16:57:01.091525Z","iopub.execute_input":"2023-11-18T16:57:01.092259Z","iopub.status.idle":"2023-11-18T16:57:04.402238Z","shell.execute_reply.started":"2023-11-18T16:57:01.092222Z","shell.execute_reply":"2023-11-18T16:57:04.401179Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}