{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"batch_index = 0","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-19T10:08:39.240820Z","iopub.execute_input":"2023-03-19T10:08:39.241256Z","iopub.status.idle":"2023-03-19T10:08:39.279055Z","shell.execute_reply.started":"2023-03-19T10:08:39.241218Z","shell.execute_reply":"2023-03-19T10:08:39.277895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"seed = 42","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:39.281119Z","iopub.execute_input":"2023-03-19T10:08:39.282013Z","iopub.status.idle":"2023-03-19T10:08:39.288748Z","shell.execute_reply.started":"2023-03-19T10:08:39.281966Z","shell.execute_reply":"2023-03-19T10:08:39.286808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#https://www.kaggle.com/code/dansbecker/permutation-importance\n#https://scikit-learn.org/stable/auto_examples/inspection/plot_permutation_importance_multicollinear.html#handling-multicollinear-features\nimport numpy as np\nimport pandas as pd\nimport os\nimport os\nimport gc\nfrom tqdm import tqdm\nimport itertools\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom collections import defaultdict\nfrom IPython.display import FileLink        \nimport pickle as pkl\nimport json\nimport matplotlib.gridspec as gridspec\nimport random\n\nimport eli5\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.inspection import permutation_importance\nfrom eli5.sklearn import PermutationImportance\n\nfrom sklearn.linear_model import Ridge\nfrom sklearn.linear_model import Lasso\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.svm import SVC\nimport lightgbm as lgbm\nimport catboost as cb","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:39.293043Z","iopub.execute_input":"2023-03-19T10:08:39.294381Z","iopub.status.idle":"2023-03-19T10:08:53.845572Z","shell.execute_reply.started":"2023-03-19T10:08:39.294325Z","shell.execute_reply":"2023-03-19T10:08:53.844061Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Set seeds","metadata":{}},{"cell_type":"code","source":"np.random.seed(seed)\nrandom.seed(seed)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:53.848554Z","iopub.execute_input":"2023-03-19T10:08:53.849997Z","iopub.status.idle":"2023-03-19T10:08:53.856965Z","shell.execute_reply.started":"2023-03-19T10:08:53.849924Z","shell.execute_reply":"2023-03-19T10:08:53.855009Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Configs / Global variables","metadata":{}},{"cell_type":"code","source":"permutation_importance_n_repeats = 1\n\ncds = [\n    \"CD41\",\n    \"CD71\",\n    \"CD32\",\n    \"CD36\",\n    \"CD48\",\n    \"CD88\",\n    \"CD62L\",\n    \"CD45RA\",\n    \"CD49b\",\n    \"CD11a\"\n]\n\nmodel_types  = [\n    \"Ridge\",\n    \"Lasso\",\n    \"RandomForestRegressor\",\n    \"SVC\",\n    \"lgmb\",\n    \"catboost\"\n]\n\ndays = [\n    2,\n    3,\n    4,\n]\n\ndonors = [\n    32606,\n    13176,\n    31800,    \n]\n\nspace = [cds, model_types, days, donors]\nspace_name = [\"cd\", \"model\", \"train_day\", \"train_donor\"]\n\ncardinality_space = np.product([len(s) for s in space])\n\nprint(f\"Cardinality space: {cardinality_space}\")","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:53.858880Z","iopub.execute_input":"2023-03-19T10:08:53.859775Z","iopub.status.idle":"2023-03-19T10:08:53.876043Z","shell.execute_reply.started":"2023-03-19T10:08:53.859733Z","shell.execute_reply":"2023-03-19T10:08:53.874536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Utils","metadata":{}},{"cell_type":"code","source":"# My solution\n# def get_params(index):  \n#     a = len(model_types) * len(days) * len(donor)    \n#     b = len(days) * len(donor)\n#     c = len(donor)\n    \n#     cd_idx = index // (a)\n#     model_idx = (index - cd_idx*a) // b\n#     day_idx = (index - cd_idx*a - model_idx*b) // c\n#     donor_idx = index - cd_idx*a - model_idx*b - day_idx*c\n    \n#     return {\n#         \"cd\": cds[cd_idx],\n#         \"model\": model_types[model_idx],\n#         \"train_day\": days[day_idx],\n#         \"train_donor\": donors[donor_idx]\n#     }","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:53.877711Z","iopub.execute_input":"2023-03-19T10:08:53.878101Z","iopub.status.idle":"2023-03-19T10:08:53.887287Z","shell.execute_reply.started":"2023-03-19T10:08:53.878045Z","shell.execute_reply":"2023-03-19T10:08:53.885923Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ChatGpt solution\ndef get_params(i):    \n    shape = [len(s) for s in space]\n    coordinates = []\n    for j in range(len(shape) - 1, -1, -1):\n        coordinates.append(i % shape[j])\n        i //= shape[j]\n    coordinates = list(reversed(coordinates))\n    \n    return {\n        space_name[idx]: space[idx][coord] for idx, coord in enumerate(coordinates)\n    }","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:53.890446Z","iopub.execute_input":"2023-03-19T10:08:53.890839Z","iopub.status.idle":"2023-03-19T10:08:53.902383Z","shell.execute_reply.started":"2023-03-19T10:08:53.890805Z","shell.execute_reply":"2023-03-19T10:08:53.901165Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_param_as_string(params):\n    return f\"{params['cd']}_{params['model']}_{params['train_day']}_{params['train_donor']}\"","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:53.906500Z","iopub.execute_input":"2023-03-19T10:08:53.906840Z","iopub.status.idle":"2023-03-19T10:08:53.912120Z","shell.execute_reply.started":"2023-03-19T10:08:53.906809Z","shell.execute_reply":"2023-03-19T10:08:53.911141Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"assert len(set([get_param_as_string(get_params(i)) for i in range(cardinality_space)])) == cardinality_space","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:53.913535Z","iopub.execute_input":"2023-03-19T10:08:53.913871Z","iopub.status.idle":"2023-03-19T10:08:53.927368Z","shell.execute_reply.started":"2023-03-19T10:08:53.913842Z","shell.execute_reply":"2023-03-19T10:08:53.925904Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def correlation_score(y_true, y_pred):\n    \"\"\"Scores the predictions according to the competition rules. \n    \n    It is assumed that the predictions are not constant.\n    \n    Returns the average of each sample's Pearson correlation coefficient\"\"\"\n    \n    y2 = y_pred.copy()\n    y2 -= y2.mean(axis=0);    y2 /= y2.std(axis=0) \n    y1 = y_true.copy(); \n    y1 -= y1.mean(axis=0);    y1 /= y1.std(axis=0) \n        \n    c = (y1*y2).mean().mean()# Correlation for rescaled matrices is just matrix product and average \n        \n    return c","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:53.928866Z","iopub.execute_input":"2023-03-19T10:08:53.930570Z","iopub.status.idle":"2023-03-19T10:08:53.939039Z","shell.execute_reply.started":"2023-03-19T10:08:53.930532Z","shell.execute_reply":"2023-03-19T10:08:53.937824Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_model(model_type):\n    if model_type == \"RandomForestRegressor\":\n        return RandomForestRegressor(\n            n_estimators=10,\n            random_state=seed,\n            n_jobs=2,\n            verbose=0\n        )\n    elif model_type == \"LGBMRegressor\":\n        return lgbm.LGBMRegressor(\n            verbose = 0, \n            random_state=seed,\n            force_col_wise=True\n        )\n    elif model_type == \"Lasso\":\n        return Lasso(alpha=0.1)\n    else:\n        raise f\"Incorrect model_type: {model_type}\"","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:53.940802Z","iopub.execute_input":"2023-03-19T10:08:53.941151Z","iopub.status.idle":"2023-03-19T10:08:53.952913Z","shell.execute_reply.started":"2023-03-19T10:08:53.941116Z","shell.execute_reply":"2023-03-19T10:08:53.951449Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load data","metadata":{}},{"cell_type":"code","source":"train_cite_input_df = pd.read_hdf(\"/kaggle/input/open-problems-multimodal/train_cite_inputs.h5\")\ntrain_cite_target_df = pd.read_hdf(\"/kaggle/input/open-problems-multimodal/train_cite_targets.h5\")\nmetadata_df = pd.read_csv(\"/kaggle/input/open-problems-multimodal/metadata.csv\")\n\nmetadata_df.set_index(\"cell_id\", inplace=True)\ntrain_cite_target_df = train_cite_target_df.join(metadata_df)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:08:53.954804Z","iopub.execute_input":"2023-03-19T10:08:53.955232Z","iopub.status.idle":"2023-03-19T10:09:54.621118Z","shell.execute_reply.started":"2023-03-19T10:08:53.955195Z","shell.execute_reply":"2023-03-19T10:09:54.619707Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Dereminate params","metadata":{}},{"cell_type":"code","source":"# TODO: Change TO INDEX !!!!!!!!!!\n#params = get_params(21)\nparams = {\n    \"cd\": \"CD41\",\n    \"model\": \"Lasso\",\n    \"train_day\": 2,\n    \"train_donor\": 32606\n}\n\nprint(params)\n\ncd = params[\"cd\"]\nmodel = get_model(params[\"model\"])\ntrain_day = params[\"train_day\"]\ntrain_donor = params[\"train_donor\"]","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:09:58.895210Z","iopub.execute_input":"2023-03-19T10:09:58.895602Z","iopub.status.idle":"2023-03-19T10:09:58.903384Z","shell.execute_reply.started":"2023-03-19T10:09:58.895567Z","shell.execute_reply":"2023-03-19T10:09:58.902186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train model","metadata":{}},{"cell_type":"code","source":"train_index = train_cite_target_df[\n    (train_cite_target_df.day == train_day) & \n    (train_cite_target_df.donor == train_donor)\n].index.tolist()","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:10:10.949296Z","iopub.execute_input":"2023-03-19T10:10:10.950048Z","iopub.status.idle":"2023-03-19T10:10:10.966364Z","shell.execute_reply.started":"2023-03-19T10:10:10.949995Z","shell.execute_reply":"2023-03-19T10:10:10.964547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_x = train_cite_input_df.loc[train_index].values\ntrain_y = train_cite_target_df.loc[train_index][cd].values[:]\nprint(f\"train_x size: {train_x.shape}; train_y: {train_y.shape}\")","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:10:13.262529Z","iopub.execute_input":"2023-03-19T10:10:13.263056Z","iopub.status.idle":"2023-03-19T10:10:13.813478Z","shell.execute_reply.started":"2023-03-19T10:10:13.263012Z","shell.execute_reply":"2023-03-19T10:10:13.812220Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(train_x, train_y)","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:10:17.526553Z","iopub.execute_input":"2023-03-19T10:10:17.527058Z","iopub.status.idle":"2023-03-19T10:10:30.422033Z","shell.execute_reply.started":"2023-03-19T10:10:17.527015Z","shell.execute_reply":"2023-03-19T10:10:30.420168Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## CV","metadata":{}},{"cell_type":"code","source":"# for test_day in days:\n#     for test_donor in donors:\n# if (test_day == train_day) & (test_donor == train_donor):\n#     continue\n\ntest_day = 3\ntest_donor = 13176\n\ntest_index = train_cite_target_df[\n    (train_cite_target_df.day == test_day) & \n    (train_cite_target_df.donor == test_donor)\n].index.tolist()\n\ntest_x = train_cite_input_df.loc[test_index].values\ntest_y = train_cite_target_df.loc[test_index][cd].values[:]\n\nr = PermutationImportance(\n    model, \n    random_state=seed,\n    n_iter=permutation_importance_n_repeats\n).fit(test_x, test_y)\n\n# print(test_day, test_donor)\n# r = permutation_importance(\n#     model, \n#     test_x, !\n#     test_y, \n#     n_repeats=permutation_importance_n_repeats, \n#     random_state=seed\n# )\n\nprint(f\"Result: {r}\")\n#         break\n#     break","metadata":{"execution":{"iopub.status.busy":"2023-03-19T10:23:34.074193Z","iopub.execute_input":"2023-03-19T10:23:34.074628Z","iopub.status.idle":"2023-03-19T10:23:34.080448Z","shell.execute_reply.started":"2023-03-19T10:23:34.074592Z","shell.execute_reply":"2023-03-19T10:23:34.079284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Finish!\")","metadata":{},"execution_count":null,"outputs":[]}]}