{"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":"none","dataSources":[{"sourceId":59094,"databundleVersionId":7010844,"sourceType":"competition"}],"dockerImageVersionId":30558,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport polars as pl\n\nimport tensorflow as tf\n\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import OrdinalEncoder\nfrom sklearn.preprocessing import OneHotEncoder\n\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\nfrom sklearn.multioutput import MultiOutputRegressor\nfrom sklearn.svm import SVR\nfrom sklearn.ensemble import RandomForestRegressor\n\nfrom sklearn.model_selection import GridSearchCV","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-11-23T20:25:52.688115Z","iopub.execute_input":"2023-11-23T20:25:52.688464Z","iopub.status.idle":"2023-11-23T20:25:52.695087Z","shell.execute_reply.started":"2023-11-23T20:25:52.688439Z","shell.execute_reply":"2023-11-23T20:25:52.694169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nde_train = pl.scan_parquet('/kaggle/input/open-problems-single-cell-perturbations/de_train.parquet')\nde_train_df = de_train.collect().to_pandas()\nadata_train = pl.scan_parquet('/kaggle/input/open-problems-single-cell-perturbations/adata_train.parquet')\n# adata_train_df = adata_train.collect().to_pandas()\nmultiome_train = pl.scan_parquet('/kaggle/input/open-problems-single-cell-perturbations/multiome_train.parquet')","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:52.696442Z","iopub.execute_input":"2023-11-23T20:25:52.696692Z","iopub.status.idle":"2023-11-23T20:25:53.860346Z","shell.execute_reply.started":"2023-11-23T20:25:52.696671Z","shell.execute_reply":"2023-11-23T20:25:53.859653Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(de_train_df.columns[:5])\nprint(adata_train.columns)\nprint(multiome_train.columns)","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:53.861143Z","iopub.execute_input":"2023-11-23T20:25:53.861798Z","iopub.status.idle":"2023-11-23T20:25:53.867238Z","shell.execute_reply.started":"2023-11-23T20:25:53.861776Z","shell.execute_reply":"2023-11-23T20:25:53.865749Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"adata_obs_meta = pl.scan_csv('/kaggle/input/open-problems-single-cell-perturbations/adata_obs_meta.csv')\nadata_obs_meta_df = adata_obs_meta.collect().to_pandas()\n\nid_map = pl.scan_csv('/kaggle/input/open-problems-single-cell-perturbations/id_map.csv')\nid_map_df = id_map.collect().to_pandas()\n\nmultiome_obs_meta = pl.scan_csv('/kaggle/input/open-problems-single-cell-perturbations/multiome_obs_meta.csv')\nmultiome_obs_meta_df = multiome_obs_meta.collect().to_pandas()\n\nmultiome_var_meta = pl.scan_csv('/kaggle/input/open-problems-single-cell-perturbations/multiome_var_meta.csv')\nmultiome_var_meta_df = multiome_var_meta.collect().to_pandas()","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:53.869607Z","iopub.execute_input":"2023-11-23T20:25:53.869894Z","iopub.status.idle":"2023-11-23T20:25:54.358475Z","shell.execute_reply.started":"2023-11-23T20:25:53.869871Z","shell.execute_reply":"2023-11-23T20:25:54.356986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(adata_obs_meta_df.columns)\nprint(id_map_df.columns)\nprint(multiome_obs_meta_df.columns)\nprint(multiome_var_meta_df.columns)","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.360355Z","iopub.execute_input":"2023-11-23T20:25:54.360737Z","iopub.status.idle":"2023-11-23T20:25:54.367358Z","shell.execute_reply.started":"2023-11-23T20:25:54.360704Z","shell.execute_reply":"2023-11-23T20:25:54.366200Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id_map_df.shape","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.368966Z","iopub.execute_input":"2023-11-23T20:25:54.369331Z","iopub.status.idle":"2023-11-23T20:25:54.382661Z","shell.execute_reply.started":"2023-11-23T20:25:54.369302Z","shell.execute_reply":"2023-11-23T20:25:54.381991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multiome_obs_meta_df.shape","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.383869Z","iopub.execute_input":"2023-11-23T20:25:54.384407Z","iopub.status.idle":"2023-11-23T20:25:54.396380Z","shell.execute_reply.started":"2023-11-23T20:25:54.384382Z","shell.execute_reply":"2023-11-23T20:25:54.395090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explore datasets: de_train","metadata":{"execution":{"iopub.status.busy":"2023-10-09T15:26:54.061906Z","iopub.execute_input":"2023-10-09T15:26:54.062427Z","iopub.status.idle":"2023-10-09T15:26:55.941709Z","shell.execute_reply.started":"2023-10-09T15:26:54.062389Z","shell.execute_reply":"2023-10-09T15:26:55.940772Z"}}},{"cell_type":"code","source":"de_train_df.shape","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.397840Z","iopub.execute_input":"2023-11-23T20:25:54.398096Z","iopub.status.idle":"2023-11-23T20:25:54.405630Z","shell.execute_reply.started":"2023-11-23T20:25:54.398073Z","shell.execute_reply":"2023-11-23T20:25:54.404588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"de_train_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.409131Z","iopub.execute_input":"2023-11-23T20:25:54.409392Z","iopub.status.idle":"2023-11-23T20:25:54.431802Z","shell.execute_reply.started":"2023-11-23T20:25:54.409371Z","shell.execute_reply":"2023-11-23T20:25:54.430744Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features = ['cell_type', 'sm_name', 'sm_lincs_id', 'SMILES', 'control']\nde_train_df_sub = de_train_df[features]","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.433070Z","iopub.execute_input":"2023-11-23T20:25:54.433421Z","iopub.status.idle":"2023-11-23T20:25:54.440014Z","shell.execute_reply.started":"2023-11-23T20:25:54.433396Z","shell.execute_reply":"2023-11-23T20:25:54.439329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"de_train_df_sub.info()","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.440833Z","iopub.execute_input":"2023-11-23T20:25:54.441583Z","iopub.status.idle":"2023-11-23T20:25:54.456094Z","shell.execute_reply.started":"2023-11-23T20:25:54.441556Z","shell.execute_reply":"2023-11-23T20:25:54.455137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"de_train_df_sub.apply(lambda x: len(x.unique()))","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.457393Z","iopub.execute_input":"2023-11-23T20:25:54.457634Z","iopub.status.idle":"2023-11-23T20:25:54.472085Z","shell.execute_reply.started":"2023-11-23T20:25:54.457613Z","shell.execute_reply":"2023-11-23T20:25:54.470902Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cell_types = de_train_df_sub.cell_type.value_counts()\nsm_namea = de_train_df_sub.sm_name.value_counts()\nsm_lincs_ida = de_train_df_sub.sm_lincs_id.value_counts()\nSMILESa = de_train_df_sub.SMILES.value_counts()\ncontrols = de_train_df_sub.control.value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.473165Z","iopub.execute_input":"2023-11-23T20:25:54.474240Z","iopub.status.idle":"2023-11-23T20:25:54.481399Z","shell.execute_reply.started":"2023-11-23T20:25:54.474186Z","shell.execute_reply":"2023-11-23T20:25:54.480784Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8,2))\nsns.barplot(x=cell_types.values, y=cell_types.index, color=\"b\")","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.482353Z","iopub.execute_input":"2023-11-23T20:25:54.483042Z","iopub.status.idle":"2023-11-23T20:25:54.684566Z","shell.execute_reply.started":"2023-11-23T20:25:54.483020Z","shell.execute_reply":"2023-11-23T20:25:54.683704Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explore datasets: adata_obs_meta","metadata":{}},{"cell_type":"code","source":"adata_obs_meta_df.shape","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.685938Z","iopub.execute_input":"2023-11-23T20:25:54.686200Z","iopub.status.idle":"2023-11-23T20:25:54.692397Z","shell.execute_reply.started":"2023-11-23T20:25:54.686177Z","shell.execute_reply":"2023-11-23T20:25:54.690924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"adata_obs_meta_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.693493Z","iopub.execute_input":"2023-11-23T20:25:54.693902Z","iopub.status.idle":"2023-11-23T20:25:54.719656Z","shell.execute_reply.started":"2023-11-23T20:25:54.693878Z","shell.execute_reply":"2023-11-23T20:25:54.718246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"adata_obs_meta_df.apply(lambda x: len(x.unique()))","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.721205Z","iopub.execute_input":"2023-11-23T20:25:54.721510Z","iopub.status.idle":"2023-11-23T20:25:54.913550Z","shell.execute_reply.started":"2023-11-23T20:25:54.721487Z","shell.execute_reply":"2023-11-23T20:25:54.912284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8,2))\nsns.barplot(x=adata_obs_meta_df.plate_name.value_counts().values, y=adata_obs_meta_df.plate_name.value_counts().index, color=\"b\")","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:54.914741Z","iopub.execute_input":"2023-11-23T20:25:54.915761Z","iopub.status.idle":"2023-11-23T20:25:55.096355Z","shell.execute_reply.started":"2023-11-23T20:25:54.915717Z","shell.execute_reply":"2023-11-23T20:25:55.095582Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8,2))\nsns.barplot(x=adata_obs_meta_df.donor_id.value_counts().values, y=adata_obs_meta_df.donor_id.value_counts().index, color=\"b\")","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:55.097356Z","iopub.execute_input":"2023-11-23T20:25:55.097585Z","iopub.status.idle":"2023-11-23T20:25:55.275092Z","shell.execute_reply.started":"2023-11-23T20:25:55.097564Z","shell.execute_reply":"2023-11-23T20:25:55.273957Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8,2))\nsns.barplot(x=adata_obs_meta_df.row.value_counts().values, y=adata_obs_meta_df.row.value_counts().index, color=\"b\")","metadata":{"execution":{"iopub.status.busy":"2023-11-23T20:25:55.276369Z","iopub.execute_input":"2023-11-23T20:25:55.276953Z","iopub.status.idle":"2023-11-23T20:25:55.488325Z","shell.execute_reply.started":"2023-11-23T20:25:55.276925Z","shell.execute_reply":"2023-11-23T20:25:55.487270Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8,2))\nsns.barplot(y=adata_obs_meta_df.col.value_counts().values, x=adata_obs_meta_df.col.value_counts().index, color=\"b\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explore datasets: multiome_obs_meta","metadata":{}},{"cell_type":"code","source":"multiome_obs_meta_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multiome_obs_meta_df.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multiome_obs_meta_df.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multiome_obs_meta_df.apply(lambda x: len(x.unique()))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8,2))\nsns.barplot(x=multiome_obs_meta_df.cell_type.value_counts().values, y=multiome_obs_meta_df.cell_type.value_counts().index, color=\"b\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8,2))\nsns.barplot(x=multiome_obs_meta_df.donor_id.value_counts().values, y=multiome_obs_meta_df.donor_id.value_counts().index, color=\"b\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explore datasets: multiome_var_meta","metadata":{}},{"cell_type":"code","source":"multiome_var_meta_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multiome_var_meta_df.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multiome_var_meta_df.apply(lambda x: len(x.unique()))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explore datasets: id_map","metadata":{}},{"cell_type":"code","source":"id_map_df.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id_map_df.info()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"id_map_df.apply(lambda x: len(x.unique()))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(8,2))\nsns.barplot(x=id_map_df.cell_type.value_counts().values, y=id_map_df.cell_type.value_counts().index, color=\"b\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15,2))\nsns.barplot(y=id_map_df.sm_name.value_counts().values[10:50], x=id_map_df.sm_name.value_counts().index[10:50], color=\"b\")\na=plt.xticks(rotation=60)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Compare datasets","metadata":{}},{"cell_type":"code","source":"Xfeatures = ['cell_type', 'sm_name']\nyfeatures = ['cell_type', 'sm_name', 'sm_lincs_id', 'SMILES', 'control']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_merged = id_map_df.merge(pd.DataFrame(adata_obs_meta_df[yfeatures].groupby('sm_name').sm_lincs_id, columns=['sm_name', 'sm_lincs_id']), on='sm_name')\ndf_merged['sm_lincs_id'] = df_merged.sm_lincs_id.apply(lambda x: x.unique()[0])\n# df_merged = df_merged.sort_values('id').reset_index(drop=True)\ndf_merged.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_merged = df_merged.merge(pd.DataFrame(adata_obs_meta_df[yfeatures].groupby('sm_name').SMILES, columns=['sm_name', 'SMILES']), on='sm_name')\ndf_merged['SMILES'] = df_merged.SMILES.apply(lambda x: x.unique()[0])\n# df_merged = df_merged.sort_values('id').reset_index(drop=True)\ndf_merged.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_merged = df_merged.merge(pd.DataFrame(adata_obs_meta_df[yfeatures].groupby('sm_name').control, columns=['sm_name', 'control']), on='sm_name')\ndf_merged['control'] = df_merged.control.apply(lambda x: x.unique()[0]).astype(int)\ndf_merged = df_merged.sort_values('id').reset_index(drop=True)\ndf_merged.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_merged.SMILES.nunique()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create new datasets","metadata":{}},{"cell_type":"code","source":"Xfeatures = ['cell_type', 'sm_name', 'sm_lincs_id']#, 'SMILES', 'control']\nyfeatures = ['cell_type', 'sm_name', 'sm_lincs_id', 'SMILES', 'control']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output_cols = de_train_df.drop(columns=yfeatures).columns","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = de_train_df[Xfeatures].copy()\n# X['control'] = X.control.astype(int)\ny = de_train_df[output_cols]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_preprocessed = X[['cell_type', 'sm_name', 'sm_lincs_id']]\ntest_preprocessed = df_merged[['cell_type', 'sm_name', 'sm_lincs_id']]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Preprocessing for numerical data\n# numerical_transformer = SimpleImputer(strategy='median')\n\n# Preprocessing for categorical data\ncategorical_transformer = Pipeline(steps=[\n    ('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))\n#     ('onehot', OrdinalEncoder(handle_unknown='error'))\n])\n\n# Bundle preprocessing for numerical and categorical data\npreprocessor = ColumnTransformer(\n    transformers=[\n        ('cat', categorical_transformer, ['cell_type', 'sm_name', 'sm_lincs_id']),\n#         ('num', numerical_transformer, w_cols)\n    ])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"categorical_transformer.fit(X_preprocessed)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"my_pipeline = Pipeline(steps=[('preprocessor', preprocessor)])\nmy_pipeline.fit(X_preprocessed)\nencoded = my_pipeline.transform(X_preprocessed)\n# df_merged_new['smiles_len'] = df_merged_new.SMILES.str.len()\ntest_encoded = pd.DataFrame(my_pipeline.transform(test_preprocessed))#, columns=Xfeatures+w_cols)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_encoded.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_encoded = pd.DataFrame(encoded)#, columns=Xfeatures+w_cols)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_encoded.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create loss functions","metadata":{}},{"cell_type":"code","source":"def mean_rowwise_rmse_loss(y_true, y_pred):\n    \"\"\"\n    Custom loss function to calculate the Mean Rowwise Root Mean Squared Error (RMSE) loss.\n\n    Parameters:\n    - y_true: The true target values.\n    - y_pred: The predicted values.\n\n    Returns:\n    - Mean Rowwise RMSE loss as a scalar tensor.\n    \"\"\"\n    # Calculate RMSE for each row\n    rmse_per_row = tf.sqrt(tf.reduce_mean(tf.square(y_true - y_pred), axis=1))\n    # Calculate the mean of RMSE values across all rows\n    mean_rmse = tf.reduce_mean(rmse_per_row)\n    \n    return mean_rmse","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def custom_mean_rowwise_rmse(y_true, y_pred):\n    \"\"\"\n    Custom metric to calculate the Mean Rowwise Root Mean Squared Error (RMSE).\n\n    Parameters:\n    - y_true: The true target values.\n    - y_pred: The predicted values.\n\n    Returns:\n    - Mean Rowwise RMSE as a scalar tensor.\n    \"\"\"\n    # Calculate RMSE for each row\n    rmse_per_row = tf.sqrt(tf.reduce_mean(tf.square(y_true - y_pred), axis=1))\n    # Calculate the mean of RMSE values across all rows\n    mean_rmse = tf.reduce_mean(rmse_per_row)\n    \n    return mean_rmse","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"callbacks_list = [tf.keras.callbacks.EarlyStopping(\n                  monitor='val_loss',\n                  restore_best_weights=True,\n                  patience=10)] ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def mean_rowwise_rmse_loss_tree(y_true, y_pred):\n    \"\"\"\n    Custom loss function to calculate the Mean Rowwise Root Mean Squared Error (RMSE) loss.\n\n    Parameters:\n    - y_true: The true target values.\n    - y_pred: The predicted values.\n\n    Returns:\n    - Mean Rowwise RMSE loss as a scalar tensor.\n    \"\"\"\n    # Calculate RMSE for each row\n    rmse_per_row = np.sqrt(np.mean(np.square(y_true - y_pred), axis=1))\n    # Calculate the mean of RMSE values across all rows\n    mean_rmse = np.mean(rmse_per_row)\n    \n    return mean_rmse","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import make_scorer\nfrom sklearn.multioutput import MultiOutputRegressor\nfrom sklearn.svm import LinearSVR\nmy_scorer = make_scorer(mean_rowwise_rmse_loss_tree, greater_is_better=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Hyperparameters tuning","metadata":{}},{"cell_type":"code","source":"train_encoded.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_valid, y_train, y_valid = train_test_split(train_encoded, y, test_size=0.05, random_state=42)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lsvr_params = {\n    'epsilon': 0.1,\n    'C': 0.1,\n    'fit_intercept': False,\n    'verbose': 0,\n    'max_iter': 2000,\n}\n\n# hpt_lsvr = LinearSVR(**lsvr_params)\n# hpt_model = MultiOutputRegressor(hpt_lsvr)\n# hpt_model.fit(X_train, y_train)\n# print(lsvr_params)\n# print(mean_rowwise_rmse_loss_tree(hpt_model.predict(X_valid), y_valid))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# {'epsilon': 0.1, 'C': 0.1, 'fit_intercept': False, 'verbose': 0, 'max_iter': 2000}\n# 1.0605216486294557","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# hpt_lsvr = LinearSVR()\n# hpt_model = MultiOutputRegressor(hpt_lsvr)\n\n# params = {\n#     'estimator__epsilon': [0.1, 0.01],\n#     'estimator__C': [0.1, 0.01],\n#     'estimator__fit_intercept': [False],\n#     'estimator__verbose': [0],\n#     'estimator__max_iter': [3000],\n# }\n\n# gridscv = GridSearchCV(estimator=hpt_model, param_grid=params, scoring=my_scorer, cv=3, verbose=2)\n# gridscv.fit(X_train, y_train)\n# print(gridscv.best_estimator_)\n# print(gridscv.best_params_)\n# print(gridscv.best_score_)\n# # print(mean_rowwise_rmse_loss_tree(hpt_model.predict(X_valid), y_valid))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Pre-model","metadata":{}},{"cell_type":"code","source":"X_train, X_valid, y_train, y_valid = train_test_split(train_encoded, y, test_size=0.05, random_state=42)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.multioutput import MultiOutputRegressor\nfrom sklearn.svm import LinearSVR\n\n# lsvr = LinearSVR(max_iter= 2000, epsilon= 0.1)\nlsvr = LinearSVR(**lsvr_params)\n# lsvr = LGBMRegressor()\nmodel_pre = MultiOutputRegressor(lsvr)\nmodel_pre.fit(train_encoded, y)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_output = pd.DataFrame(model_pre.predict(train_encoded))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_output.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_input = pd.concat([train_encoded, pre_output], axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_input.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def create_model():\n    \n#     input_layer = tf.keras.Input(shape=(pre_output.shape[1], ))\n    input_layer = tf.keras.Input(shape=(pre_input.shape[1], ))\n    \n    x = tf.keras.layers.BatchNormalization()(input_layer)  \n\n    x = tf.keras.layers.Dense(256, activation='relu')(x)\n    x = tf.keras.layers.Dense(128,activation='relu')(x)    \n    x = tf.keras.layers.Dense(256, activation='relu')(x)   \n    x = tf.keras.layers.Dropout(0.1)(x)\n    \n    output_layer = tf.keras.layers.Dense(pre_output.shape[1])(x)  \n    \n    model = tf.keras.Model(inputs=input_layer, outputs=output_layer)\n    \n    model.compile(optimizer=tf.keras.optimizers.Adam(),\n                  loss=mean_rowwise_rmse_loss,\n                  metrics=['accuracy'])\n    \n    return model\n\n\nmodel = create_model()\nmodel.fit(pre_input, y,\n          epochs=100,\n          callbacks=callbacks_list,\n          validation_split=0.2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Epoch 21/100\n16/16 [==============================] - 2s 119ms/step - loss: 0.8804 - mae: 0.6138 - val_loss: 0.9525 - val_mae: 0.6306","metadata":{}},{"cell_type":"markdown","source":"# Autoencoder","metadata":{}},{"cell_type":"markdown","source":"# NLP model","metadata":{}},{"cell_type":"code","source":"# def create_nlp_model(smiles_df, cell_sm):\n    \n# #     smiles_df = tf.data.Dataset.from_tensor_slices((smiles_df)).batch(64).cache().prefetch(buffer_size=tf.data.AUTOTUNE)\n    \n#     smiles_input = tf.keras.Input(shape=(1, ), dtype=tf.string)\n#     smiles_vectorize_layer = tf.keras.layers.TextVectorization()\n#     smiles_vectorize_layer.adapt(smiles_df)\n#     x = smiles_vectorize_layer(smiles_input)\n#     x = tf.keras.layers.Embedding(200, 64)(x)\n#     output_smiles = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64))(x)\n# #     x = tf.keras.layers.Conv1D(64, kernel_size=5, padding=\"same\", activation=\"tanh\")(x)\n# #     output_smiles = tf.keras.layers.GlobalMaxPool1D()(x)\n    \n#     cell_sm_input = tf.keras.Input(shape=(cell_sm.shape[1], ))\n#     x = tf.keras.layers.BatchNormalization()(cell_sm_input)\n#     x = tf.keras.layers.Dense(64, activation=\"tanh\")(x)\n# #     x = tf.keras.layers.Dropout(0.2)(x)\n#     output_cell_sm = tf.keras.layers.Dense(32, activation=\"tanh\")(x)\n    \n#     x = tf.keras.layers.concatenate([output_smiles, output_cell_sm])\n    \n#     x = tf.keras.layers.Dense(128, activation=\"tanh\")(x)\n# #     x = tf.keras.layers.Dropout(0.2)(x)\n    \n#     output_layer = tf.keras.layers.Dense(y.shape[1], activation=\"tanh\")(x)\n    \n#     model = tf.keras.Model(\n#         inputs=[smiles_input, cell_sm_input],\n#         outputs=output_layer\n#     )\n    \n#     model.compile(loss=tf.keras.losses.MeanSquaredError(), \n#                   optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),\n#                   metrics=['mae'])\n    \n#     return model\n    \n# model = create_nlp_model(X[['SMILES']], train_encoded)\n\n# model.fit([X.SMILES, train_encoded], y, \n#           epochs=100,\n#           callbacks=callbacks_list,\n#           validation_split=0.05)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create model","metadata":{}},{"cell_type":"code","source":"# # X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.01, random_state=42)\n# X_train, X_valid, y_train, y_valid = train_test_split(train_encoded, y, test_size=0.01, random_state=42)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# EMBEDDING_DIM = 100\n# MAX_LENGTH = 100\n# def embedding_text(df, batch_size=64, AUTOTUNE=tf.data.AUTOTUNE, embedding_dim=EMBEDDING_DIM, sequence_length=MAX_LENGTH):\n#     dff = df.sum(axis=1)\n#     ds = tf.data.Dataset.from_tensor_slices((dff))\n#     ds = ds.batch(batch_size).cache().prefetch(buffer_size=AUTOTUNE)\n    \n# #     embedding_dim = EMBEDDING_DIM\n#     vocab_size = df.shape[0]\n# #     sequence_length = MAX_LENGTH\n\n#     vectorize_layer = tf.keras.layers.TextVectorization(\n#         max_tokens=vocab_size,\n#         output_sequence_length=sequence_length)\n\n#     vectorize_layer.adapt(ds)\n\n#     model = tf.keras.models.Sequential()\n#     model.add(vectorize_layer)\n#     model.add(tf.keras.layers.Embedding(vocab_size, embedding_dim, name=\"embedding\"))\n    \n#     weights = model.get_layer('embedding').get_weights()[0]\n#     w_cols = [f'w{i}' for i in range(embedding_dim)]\n#     new_df = pd.DataFrame()\n#     new_df[w_cols] = weights\n#     return new_df","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# new_X_train = embedding_text(X_train, embedding_dim=64)\n# new_X_valid = embedding_text(X_valid, embedding_dim=64)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def create_model():\n    \n#     ds_celltype = tf.data.Dataset.from_tensor_slices(X_train.cell_type).batch(64).cache().prefetch(buffer_size=tf.data.AUTOTUNE)\n#     ds_smname = tf.data.Dataset.from_tensor_slices(X_train.sm_name).batch(64).cache().prefetch(buffer_size=tf.data.AUTOTUNE)\n#     ds_smlincsid = tf.data.Dataset.from_tensor_slices(X_train.sm_lincs_id).batch(64).cache().prefetch(buffer_size=tf.data.AUTOTUNE)\n# #     ds_smiles = tf.data.Dataset.from_tensor_slices(X_train.SMILES).batch(64).cache().prefetch(buffer_size=tf.data.AUTOTUNE)\n    \n#     input_cell_type = tf.keras.Input(shape=(1, ), dtype=tf.string)\n#     input_sm_name = tf.keras.Input(shape=(1, ), dtype=tf.string)\n#     input_sm_lincs_id = tf.keras.Input(shape=(1, ), dtype=tf.string)\n# #     input_smiles = tf.keras.Input(shape=(1, ), dtype=tf.string)\n    \n#     vectorize_cell_type = tf.keras.layers.TextVectorization()\n#     vectorize_sm_name = tf.keras.layers.TextVectorization()\n#     vectorize_sm_lincs_id = tf.keras.layers.TextVectorization()\n# #     vectorize_smiles = tf.keras.layers.TextVectorization()\n\n#     vectorize_cell_type.adapt(X_train.cell_type)\n#     vectorize_sm_name.adapt(X_train.sm_name)\n#     vectorize_sm_lincs_id.adapt(X_train.sm_lincs_id)\n# #     vectorize_smiles.adapt(X_train.SMILES)\n\n#     x_cell_type = vectorize_cell_type(input_cell_type)\n#     x_sm_name = vectorize_sm_name(input_sm_name)\n#     x_sm_lincs_id = vectorize_sm_lincs_id(input_sm_lincs_id)\n# #     x_smiles = vectorize_smiles(input_smiles)\n    \n#     x_cell_type = tf.keras.layers.Embedding(1000, 16)(x_cell_type)\n#     x_sm_name = tf.keras.layers.Embedding(1000, 16)(x_sm_name)\n#     x_sm_lincs_id = tf.keras.layers.Embedding(1000, 16)(x_sm_lincs_id)\n# #     x_smiles = tf.keras.layers.Embedding(1000, 16)(x_smiles)\n    \n#     x_cell_type = tf.keras.layers.LSTM(32)(x_cell_type)\n#     x_sm_name = tf.keras.layers.LSTM(32)(x_sm_name)\n#     x_sm_lincs_id = tf.keras.layers.LSTM(32)(x_sm_lincs_id)\n# #     x_smiles = tf.keras.layers.LSTM(32)(x_smiles)\n    \n#     x = tf.keras.layers.concatenate([x_cell_type, x_sm_name, x_sm_lincs_id])\n    \n#     x = tf.keras.layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.00001))(x)\n#     x = tf.keras.layers.Dropout(0.2)(x)\n#     x = tf.keras.layers.Dense(32, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.000001))(x)\n#     x = tf.keras.layers.Dropout(0.2)(x)\n    \n#     output_layer = tf.keras.layers.Dense(y_train.shape[1])(x)\n    \n#     model = tf.keras.Model(\n#         inputs=[input_cell_type, input_sm_name, input_sm_lincs_id],\n#         outputs=output_layer\n#     )\n    \n#     model.compile(loss=mean_rowwise_rmse_loss, \n#                   optimizer=tf.keras.optimizers.Adam(),\n#                   metrics=[custom_mean_rowwise_rmse])\n    \n#     return model\n\n# model = create_model()\n\n# model.fit([X_train.cell_type, X_train.sm_name, X_train.sm_lincs_id], y_train,\n#       epochs=100,\n#       callbacks=callbacks_list,\n# #       steps_per_epoch=8,\n#       validation_data=([X_valid.cell_type, X_valid.sm_name, X_valid.sm_lincs_id], y_valid)\n#          )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def create_model():\n#     input_cell_type = tf.keras.Input(shape=(1, ))\n#     input_sm_name = tf.keras.Input(shape=(1, ))\n#     input_sm_lincs_id = tf.keras.Input(shape=(1, ))\n#     input_smiles = tf.keras.Input(shape=(1, ))\n#     input_control = tf.keras.Input(shape=(1, ))\n    \n#     x_cell_type = tf.keras.layers.Embedding(1000, 16)(input_cell_type)\n#     x_sm_name = tf.keras.layers.Embedding(1000, 16)(input_sm_name)\n#     x_sm_lincs_id = tf.keras.layers.Embedding(1000, 16)(input_sm_lincs_id)\n#     x_smiles = tf.keras.layers.Embedding(1000, 16)(input_smiles)\n#     x_control = tf.keras.layers.Embedding(1000, 16)(input_control)\n    \n#     x_cell_type = tf.keras.layers.LSTM(32)(x_cell_type)\n#     x_sm_name = tf.keras.layers.LSTM(32)(x_sm_name)\n#     x_sm_lincs_id = tf.keras.layers.LSTM(32)(x_sm_lincs_id)\n#     x_smiles = tf.keras.layers.LSTM(32)(x_smiles)\n#     x_control = tf.keras.layers.LSTM(32)(x_control)\n    \n#     x = tf.keras.layers.concatenate([x_cell_type, x_sm_name, x_sm_lincs_id, x_smiles, x_control])\n    \n#     x = tf.keras.layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.00001))(x)\n#     x = tf.keras.layers.Dropout(0.2)(x)\n#     x = tf.keras.layers.Dense(32, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.000001))(x)\n#     x = tf.keras.layers.Dropout(0.2)(x)\n    \n#     output_layer = tf.keras.layers.Dense(y_train.shape[1])(x)\n    \n#     model = tf.keras.Model(\n#         inputs=[input_cell_type, input_sm_name, input_sm_lincs_id, input_smiles, input_control],\n#         outputs=output_layer\n#     )\n    \n#     model.compile(loss=mean_rowwise_rmse_loss, \n#                   optimizer=tf.keras.optimizers.Adam(),\n#                   metrics=[custom_mean_rowwise_rmse])\n    \n#     return model\n\n# model = create_model()\n\n# model.fit([X_train.cell_type, X_train.sm_name, X_train.sm_lincs_id, X_train.SMILES, X_train.control], y_train,\n#       epochs=100,\n#       callbacks=callbacks_list,\n# #       steps_per_epoch=8,\n#       validation_data=([X_valid.cell_type, X_valid.sm_name, X_valid.sm_lincs_id, X_valid.SMILES, X_valid.control], y_valid)\n#          )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from sklearn.multioutput import MultiOutputRegressor\n# from sklearn.svm import LinearSVR\n\n# lsvr = LinearSVR(max_iter= 2000, epsilon= 0.1)\n# model = MultiOutputRegressor(lsvr)\n# model.fit(train_encoded, y)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"sample_submission = pd.read_csv('/kaggle/input/open-problems-single-cell-perturbations/sample_submission.csv')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(sample_submission.columns[1:])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pre_output_submission = pd.DataFrame(model_pre.predict(test_encoded))\npre_input_submission = pd.concat([test_encoded, pre_output_submission], axis=1)\nsample_submission[sample_submission.columns[1:]] = model.predict(pre_input_submission)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sample_submission[sample_submission.columns[1:]] = model.predict(embedding_text(df_merged[Xfeatures], embedding_dim=64))\n# sample_submission[sample_submission.columns[1:]] = model.predict([test_encoded[col] for col in test_encoded.columns])\n# sample_submission[sample_submission.columns[1:]] = model.predict([df_merged[['SMILES']], test_encoded])\n# sample_submission[sample_submission.columns[1:]] = df_preds[y.columns]\n# sample_submission[sample_submission.columns[1:]] = model.predict([df_merged.cell_type, df_merged.sm_name, df_merged.sm_lincs_id])\n# submission = pd.concat([sample_submission[['id']], df], axis=1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_submission.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}