{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-18T11:20:22.117701Z","iopub.execute_input":"2023-09-18T11:20:22.118430Z","iopub.status.idle":"2023-09-18T11:20:22.561304Z","shell.execute_reply.started":"2023-09-18T11:20:22.118387Z","shell.execute_reply":"2023-09-18T11:20:22.560355Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:20:22.566265Z","iopub.execute_input":"2023-09-18T11:20:22.567367Z","iopub.status.idle":"2023-09-18T11:20:23.053787Z","shell.execute_reply.started":"2023-09-18T11:20:22.567311Z","shell.execute_reply":"2023-09-18T11:20:23.052716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df2=pd.read_parquet(\"/kaggle/input/open-problems-single-cell-perturbations/de_train.parquet\")","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:20:23.058845Z","iopub.execute_input":"2023-09-18T11:20:23.061561Z","iopub.status.idle":"2023-09-18T11:20:26.683824Z","shell.execute_reply.started":"2023-09-18T11:20:23.061525Z","shell.execute_reply":"2023-09-18T11:20:26.682772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df2","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:20:26.688774Z","iopub.execute_input":"2023-09-18T11:20:26.691177Z","iopub.status.idle":"2023-09-18T11:20:26.750812Z","shell.execute_reply.started":"2023-09-18T11:20:26.691139Z","shell.execute_reply":"2023-09-18T11:20:26.749789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_id_map = pd.read_csv('/kaggle/input/open-problems-single-cell-perturbations/id_map.csv')\nprint(df_id_map.head())\nprint(df_id_map.shape)\ndf_sample = pd.read_csv('/kaggle/input/open-problems-single-cell-perturbations/sample_submission.csv')\nprint(df_sample.head())\nprint(df_sample.shape)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:20:26.757404Z","iopub.execute_input":"2023-09-18T11:20:26.759769Z","iopub.status.idle":"2023-09-18T11:20:32.641293Z","shell.execute_reply.started":"2023-09-18T11:20:26.759735Z","shell.execute_reply":"2023-09-18T11:20:32.640227Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dimensional Reduction","metadata":{}},{"cell_type":"code","source":"from sklearn.decomposition import PCA\n\npca = PCA(n_components = 35)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:20:32.642711Z","iopub.execute_input":"2023-09-18T11:20:32.643732Z","iopub.status.idle":"2023-09-18T11:20:32.649184Z","shell.execute_reply.started":"2023-09-18T11:20:32.643695Z","shell.execute_reply":"2023-09-18T11:20:32.647854Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pca","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:20:32.650543Z","iopub.execute_input":"2023-09-18T11:20:32.651562Z","iopub.status.idle":"2023-09-18T11:20:32.666929Z","shell.execute_reply.started":"2023-09-18T11:20:32.651516Z","shell.execute_reply":"2023-09-18T11:20:32.665772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.decomposition import TruncatedSVD\n\ntvcd = TruncatedSVD(n_components = 35,n_iter=7,random_state=42)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:20:32.668619Z","iopub.execute_input":"2023-09-18T11:20:32.669012Z","iopub.status.idle":"2023-09-18T11:20:32.675721Z","shell.execute_reply.started":"2023-09-18T11:20:32.668977Z","shell.execute_reply":"2023-09-18T11:20:32.674300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Y = df2.iloc[:,5:].values\nYr = tvcd.fit_transform(Y)\npd.DataFrame(Yr).corr(method = 'spearman').round(2)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:21:15.216957Z","iopub.execute_input":"2023-09-18T11:21:15.217319Z","iopub.status.idle":"2023-09-18T11:21:16.956397Z","shell.execute_reply.started":"2023-09-18T11:21:15.217286Z","shell.execute_reply":"2023-09-18T11:21:16.955300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"n_components_for_compound_encoding = 3\nquantile = 0.54\ndf_tmp = pd.DataFrame(Yr[:, :n_components_for_compound_encoding  ], index = df2.index  )\ndf_tmp['column for aggregation'] = df2['sm_name']\ndf_compound_encoded = df_tmp.groupby('column for aggregation').quantile( quantile )\nprint('df_compound_encoded.shape', df_compound_encoded.shape )\ndisplay( df_compound_encoded )\n\nX = pd.DataFrame(index = df2['sm_name']) # \nX['IX'] = np.arange(len(df2))\nX = X.join( df_compound_encoded , how = 'left').sort_values('IX')\nX = X.iloc[:,1:]\nX = X.values \nX.shape","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:22:04.697055Z","iopub.execute_input":"2023-09-18T11:22:04.697456Z","iopub.status.idle":"2023-09-18T11:22:04.727532Z","shell.execute_reply.started":"2023-09-18T11:22:04.697424Z","shell.execute_reply":"2023-09-18T11:22:04.726394Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Odinal , One-Hot Encoders ","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import OrdinalEncoder\nenc = OrdinalEncoder()\n\nX = enc.fit_transform(df2[ ['cell_type', 'sm_name']])\n# enc.transform([['Female', 3], ['Male', 1]])\nX.shape\n\nfrom sklearn.preprocessing import OneHotEncoder\n\n# enc = OneHotEncoder(handle_unknown='ignore')\n# X = enc.fit_transform(df_de_train[ ['cell_type', 'sm_name']])\n# # enc.transform([['Female', 3], ['Male', 1]])\n# X.shape\n\n\nX.shape","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:22:29.447659Z","iopub.execute_input":"2023-09-18T11:22:29.448020Z","iopub.status.idle":"2023-09-18T11:22:29.460092Z","shell.execute_reply.started":"2023-09-18T11:22:29.447990Z","shell.execute_reply":"2023-09-18T11:22:29.458995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Target encoded - used in modelling","metadata":{}},{"cell_type":"code","source":"_components_for_compound_encoding = 20\nquantile = 0.54\ndf_tmp = pd.DataFrame(Yr[:, :n_components_for_compound_encoding  ], index = df2.index  )\ndf_tmp['column for aggregation'] = df2['sm_name']\ndf_compound_encoded = df_tmp.groupby('column for aggregation').mean() # quantile( quantile )\nprint('df_compound_encoded.shape', df_compound_encoded.shape )\n# display( df_compound_encoded )\n\nX = pd.DataFrame(index = df2['sm_name']) # \nX['IX'] = np.arange(len(df2))\nX = X.join( df_compound_encoded , how = 'left').sort_values('IX')\nX = X.iloc[:,1:]\nX = X.values \nprint( X.shape )\n\nX_submit = pd.DataFrame(index = df_id_map['sm_name']) # \nX_submit['IX'] = np.arange(len(X_submit))\nX_submit = X_submit.join( df_compound_encoded , how = 'left').sort_values('IX')\nX_submit = X_submit.iloc[:,1:]\nX_submit = X_submit.values \nprint( X_submit.shape )\n\n\n\n\n# enc = OneHotEncoder(handle_unknown='ignore')\n# X_tmp = enc.fit_transform(df_de_train[ ['cell_type']]).toarray()\n# print(X_tmp.shape)\n# X = np.concatenate([X,X_tmp],axis = 1)\n# X.shape","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:22:51.480880Z","iopub.execute_input":"2023-09-18T11:22:51.481232Z","iopub.status.idle":"2023-09-18T11:22:51.503760Z","shell.execute_reply.started":"2023-09-18T11:22:51.481202Z","shell.execute_reply":"2023-09-18T11:22:51.502525Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.linear_model import Ridge\nfrom sklearn.model_selection import KFold\n\nfrom sklearn.metrics import r2_score\n\nn_splits = 3\nkf = KFold(n_splits=n_splits, random_state = 42, shuffle = True )\nIX = pd.DataFrame(); IX['IX'] = range(len(df2))\n\nalpha_regularization_for_linear_models = 100000\nmodel = Ridge(alpha=alpha_regularization_for_linear_models)\n\n\nimport catboost\nfrom catboost import CatBoostRegressor, Pool\nfrom sklearn.multioutput import MultiOutputRegressor\ncategorical_features = ['cell_type','sm_name']\nmodel = MultiOutputRegressor( CatBoostRegressor(cat_features=categorical_features, verbose = 0,  # Categorical features ) ) \n                        iterations=300,  # Number of boosting iterations\n                          depth=5,        # Depth of the trees\n                          learning_rate=0.015,  # Learning rate\n                          loss_function='RMSE'))  # Specify your loss function (e.g., RMSE for regression)\n#                           verbose=0) ) # Set verbose to 0 to suppress output\n\n\nY = df2.iloc[:,5:].values\n\nY_reduced_submit = np.zeros( (len(df_id_map) , Yr.shape[1] )   ); cnt_blend_submit = 0\nY_submit = np.zeros( (len(df_id_map) , 18211 )   ); cnt_blend_submit = 0\nY_oof = np.zeros( (len(df2) , 18211 )   ); cnt_blend_submit = 0\n\ndf_train = df2[['cell_type','sm_name']]\n\nX_submit = df_id_map[ ['cell_type','sm_name'] ]\n\nprint(X.shape)\nfor i, (train_index, test_index) in enumerate(kf.split(IX)):\n    print(f\"Fold {i}:\", len(test_index) )\n#     print(f\"  Train: index={train_index}\")\n#     print(f\"  Test:  index={test_index}\")\n    \n    Yr_train = tvcd.fit_transform(Y[train_index,:])\n    Yr_test = tvcd.transform(Y[test_index,:])\n#     X_train = X[train_index,:]\n#     X_test = X[test_index,:]\n    X_train = df2[categorical_features].iloc[train_index,:]\n    X_test = df2[categorical_features].iloc[test_index,:]\n    \n    model.fit(X_train, Yr_train)\n    Yr_pred = model.predict(X_test) # , Yr_train)\n    r2 = r2_score(Yr_test,  Yr_pred )\n    print('r2 test:', r2)\n    r2_test = r2\n    Y_oof[test_index,: ] = tvcd.inverse_transform(Yr_pred)\n    \n    Yr_pred = model.predict(X_train) # , Yr_train)\n    r2 = r2_score(Yr_train,  Yr_pred )\n    print('r2 train', r2)\n#     if r2_test > 0.01: # That does not seem to help - compare: version 2, 3 both gives 0.617 \n    Y_reduced_submit =  (Y_reduced_submit * cnt_blend_submit + model.predict(X_submit) ) / ( cnt_blend_submit + 1)\n    Y_submit =  (Y_submit * cnt_blend_submit + tvcd.inverse_transform(model.predict(X_submit) ) ) / ( cnt_blend_submit + 1)\n    cnt_blend_submit += 1\n    \n    \nfrom sklearn.metrics import mean_squared_error\ns = mean_squared_error(Y,Y_oof, squared = False)\nprint(s)","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:24:05.320962Z","iopub.execute_input":"2023-09-18T11:24:05.321371Z","iopub.status.idle":"2023-09-18T11:24:30.655679Z","shell.execute_reply.started":"2023-09-18T11:24:05.321314Z","shell.execute_reply":"2023-09-18T11:24:30.654516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"df_submit = pd.DataFrame(Y_submit, columns = df2.columns[5:])\ndf_submit.index.name = 'id'\nprint( df_submit.shape )\ndisplay(df_submit)\ndf_submit.to_csv('submission.csv')","metadata":{"execution":{"iopub.status.busy":"2023-09-18T11:25:01.252706Z","iopub.execute_input":"2023-09-18T11:25:01.253081Z","iopub.status.idle":"2023-09-18T11:25:12.400015Z","shell.execute_reply.started":"2023-09-18T11:25:01.253045Z","shell.execute_reply":"2023-09-18T11:25:12.398980Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}