{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"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\n\n# Use the kagglehub client library to attach Kaggle resources like competitions, datasets, and models to your session\n# Learn more about kagglehub: https://github.com/Kaggle/kagglehub/blob/main/README.md\n\nimport kagglehub\n# kagglehub.dataset_download('<owner>/<dataset-slug>')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-06-23T18:10:40.910481Z","iopub.execute_input":"2026-06-23T18:10:40.911323Z","iopub.status.idle":"2026-06-23T18:10:42.680737Z","shell.execute_reply.started":"2026-06-23T18:10:40.911290Z","shell.execute_reply":"2026-06-23T18:10:42.680127Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nDATA = \"/kaggle/input/competitions/open-problems-multimodal/\"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nDATA = \"/kaggle/input/competitions/open-problems-multimodal/\"\n\nsample = pd.read_csv(DATA + \"sample_submission.csv\")\n\nprint(sample.shape)\nprint(sample.head())\n\nsample.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-24T19:11:06.302519Z","iopub.execute_input":"2026-06-24T19:11:06.302850Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nDATA = \"/kaggle/input/competitions/open-problems-multimodal/\"\n\nfor f in [\n    \"train_multi_targets.h5\",\n    \"train_cite_inputs.h5\",\n    \"train_cite_targets.h5\",\n    \"test_multi_inputs.h5\",\n    \"test_cite_inputs.h5\"\n]:\n    x = pd.read_hdf(DATA + f, start=0, stop=10)\n    print(f, x.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-23T18:11:56.739323Z","iopub.execute_input":"2026-06-23T18:11:56.740105Z","iopub.status.idle":"2026-06-23T18:11:57.291233Z","shell.execute_reply.started":"2026-06-23T18:11:56.740070Z","shell.execute_reply":"2026-06-23T18:11:57.290544Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.linear_model import Ridge\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.decomposition import TruncatedSVD\nfrom sklearn.pipeline import make_pipeline\n\nDATA = \"/kaggle/input/competitions/open-problems-multimodal/\"\n\nN_TRAIN = 5000\nN_TEST = 1000\n\ndef load(file, n):\n    return pd.read_hdf(DATA + file, start=0, stop=n)\n\ndef model(n_components):\n    return make_pipeline(\n        StandardScaler(with_mean=False),\n        TruncatedSVD(n_components=n_components, random_state=42),\n        Ridge(alpha=10)\n    )\n\nprint(\"Loading Multiome sample...\")\nx_multi = load(\"train_multi_inputs.h5\", N_TRAIN)\ny_multi = load(\"train_multi_targets.h5\", N_TRAIN)\nx_multi_test = load(\"test_multi_inputs.h5\", N_TEST)\n\nprint(\"Training Multiome...\")\nmulti_model = model(50)\nmulti_model.fit(x_multi, y_multi)\n\nprint(\"Predicting Multiome...\")\nmulti_pred = multi_model.predict(x_multi_test)\nmulti_pred = np.clip(multi_pred, 0, None)\n\nprint(\"Multiome prediction shape:\", multi_pred.shape)\n\n\nprint(\"Loading CITEseq sample...\")\nx_cite = load(\"train_cite_inputs.h5\", N_TRAIN)\ny_cite = load(\"train_cite_targets.h5\", N_TRAIN)\nx_cite_test = load(\"test_cite_inputs.h5\", N_TEST)\n\nprint(\"Training CITEseq...\")\ncite_model = model(50)\ncite_model.fit(x_cite, y_cite)\n\nprint(\"Predicting CITEseq...\")\ncite_pred = cite_model.predict(x_cite_test)\ncite_pred = np.clip(cite_pred, 0, None)\n\nprint(\"CITEseq prediction shape:\", cite_pred.shape)\n\neval_ids = pd.read_csv(DATA + \"evaluation_ids.csv\")\n\neval_small = eval_ids[\n    eval_ids[\"cell_id\"].isin(\n        list(x_multi_test.index) + list(x_cite_test.index)\n    )\n].copy()\n\neval_small[\"target\"] = 0.0\n\nmulti_cols = list(y_multi.columns)\ncite_cols = list(y_cite.columns)\n\nfor i in range(len(eval_small)):\n    cell = eval_small.iloc[i][\"cell_id\"]\n    gene = eval_small.iloc[i][\"gene_id\"]\n\n    if gene in cite_cols:\n        eval_small.iloc[i, eval_small.columns.get_loc(\"target\")] = cite_pred[\n            list(x_cite_test.index).index(cell),\n            cite_cols.index(gene)\n        ]\n\n    elif gene in multi_cols:\n        eval_small.iloc[i, eval_small.columns.get_loc(\"target\")] = multi_pred[\n            list(x_multi_test.index).index(cell),\n            multi_cols.index(gene)\n        ]\n\nsubmission = eval_small[[\"row_id\", \"target\"]]\nsubmission.to_csv(\"partial_submission.csv\", index=False)\n\nprint(submission.shape)\nprint(submission.head())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-23T18:27:23.753752Z","iopub.execute_input":"2026-06-23T18:27:23.754523Z","iopub.status.idle":"2026-06-23T18:41:28.267838Z","shell.execute_reply.started":"2026-06-23T18:27:23.754489Z","shell.execute_reply":"2026-06-23T18:41:28.266740Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")\n\nimport numpy as np\nimport pandas as pd\n\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.decomposition import TruncatedSVD\nfrom sklearn.linear_model import Ridge\nfrom sklearn.pipeline import make_pipeline\n\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, BatchNormalization\nfrom tensorflow.keras.callbacks import EarlyStopping\n\n\nDATA = \"/kaggle/input/competitions/open-problems-multimodal/\"\n\nN_TRAIN = 8000\nN_TEST = 1500\n\n\ndef load_h5(file, n_rows):\n    return pd.read_hdf(DATA + file, start=0, stop=n_rows)\n\n\ndef ridge_svd_model(n_components=50):\n    return make_pipeline(\n        StandardScaler(with_mean=False),\n        TruncatedSVD(n_components=n_components, random_state=42),\n        Ridge(alpha=10.0)\n    )\n\n\ndef cite_nn_model(input_dim, output_dim):\n    model = Sequential()\n\n    model.add(Dense(512, activation=\"relu\", input_shape=(input_dim,)))\n    model.add(BatchNormalization())\n    model.add(Dropout(0.25))\n\n    model.add(Dense(256, activation=\"relu\"))\n    model.add(BatchNormalization())\n    model.add(Dropout(0.20))\n\n    model.add(Dense(output_dim, activation=\"linear\"))\n\n    model.compile(\n        optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n        loss=\"mse\"\n    )\n\n    return model\n\n\nprint(\"Loading Multiome sample...\")\n\nx_multi = load_h5(\"train_multi_inputs.h5\", N_TRAIN)\ny_multi = load_h5(\"train_multi_targets.h5\", N_TRAIN)\nx_multi_test = load_h5(\"test_multi_inputs.h5\", N_TEST)\n\nprint(\"Training Multiome Ridge + SVD...\")\n\nmulti_model = ridge_svd_model(50)\nmulti_model.fit(x_multi, y_multi)\n\nprint(\"Predicting Multiome...\")\n\nmulti_pred = multi_model.predict(x_multi_test)\nmulti_pred = np.clip(multi_pred, 0, None)\n\nprint(\"Multiome prediction shape:\", multi_pred.shape)\n\n\nprint(\"Loading CITEseq sample...\")\n\nx_cite = load_h5(\"train_cite_inputs.h5\", N_TRAIN)\ny_cite = load_h5(\"train_cite_targets.h5\", N_TRAIN)\nx_cite_test = load_h5(\"test_cite_inputs.h5\", N_TEST)\n\nprint(\"Reducing CITEseq input with SVD...\")\n\nscaler = StandardScaler(with_mean=False)\n\nx_cite_scaled = scaler.fit_transform(x_cite)\nx_cite_test_scaled = scaler.transform(x_cite_test)\n\nsvd = TruncatedSVD(n_components=256, random_state=42)\n\nx_cite_svd = svd.fit_transform(x_cite_scaled)\nx_cite_test_svd = svd.transform(x_cite_test_scaled)\n\nprint(\"Training CITEseq Neural Network...\")\n\nnn = cite_nn_model(\n    input_dim=x_cite_svd.shape[1],\n    output_dim=y_cite.shape[1]\n)\n\nearly_stop = EarlyStopping(\n    monitor=\"val_loss\",\n    patience=5,\n    restore_best_weights=True\n)\n\nnn.fit(\n    x_cite_svd,\n    y_cite,\n    validation_split=0.1,\n    epochs=50,\n    batch_size=128,\n    callbacks=[early_stop],\n    verbose=1\n)\n\nprint(\"Predicting CITEseq...\")\n\ncite_pred = nn.predict(x_cite_test_svd)\ncite_pred = np.clip(cite_pred, 0, None)\n\nprint(\"CITEseq prediction shape:\", cite_pred.shape)\n\nprint(\"Done\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-06-23T19:05:25.411118Z","iopub.execute_input":"2026-06-23T19:05:25.412007Z","execution_failed":"2026-06-23T19:06:09.333Z"}},"outputs":[],"execution_count":null}]}