{"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":"import os, gc, pickle\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport numpy as np\nfrom colorama import Fore, Back, Style\nfrom matplotlib.ticker import MaxNLocator\n\nfrom sklearn.base import BaseEstimator, TransformerMixin\nfrom sklearn.model_selection import KFold\nfrom sklearn.preprocessing import StandardScaler, scale\nfrom sklearn.decomposition import PCA\nfrom sklearn.dummy import DummyRegressor\nfrom sklearn.pipeline import make_pipeline, Pipeline\nfrom sklearn.linear_model import Ridge\nfrom sklearn.compose import TransformedTargetRegressor\nfrom sklearn.metrics import mean_squared_error\nfrom xgboost import XGBRegressor\nfrom sklearn.multioutput import MultiOutputRegressor\nfrom tqdm import tqdm\n\nDATA_DIR = \"/kaggle/input/open-problems-multimodal/\"\nFP_CELL_METADATA = os.path.join(DATA_DIR,\"metadata.csv\")\n\nFP_CITE_TRAIN_INPUTS = os.path.join(DATA_DIR,\"train_cite_inputs.h5\")\nFP_CITE_TRAIN_TARGETS = os.path.join(DATA_DIR,\"train_cite_targets.h5\")\nFP_CITE_TEST_INPUTS = os.path.join(DATA_DIR,\"test_cite_inputs.h5\")\n\nFP_MULTIOME_TRAIN_INPUTS = os.path.join(DATA_DIR,\"train_multi_inputs.h5\")\nFP_MULTIOME_TRAIN_TARGETS = os.path.join(DATA_DIR,\"train_multi_targets.h5\")\nFP_MULTIOME_TEST_INPUTS = os.path.join(DATA_DIR,\"test_multi_inputs.h5\")\n\nFP_SUBMISSION = os.path.join(DATA_DIR,\"sample_submission.csv\")\nFP_EVALUATION_IDS = os.path.join(DATA_DIR,\"evaluation_ids.csv\")\n\ndf_cell = pd.read_csv(FP_CELL_METADATA)\ndf_cell_cite = df_cell[df_cell.technology==\"citeseq\"]\ndf_cell_multi = df_cell[df_cell.technology==\"multiome\"]\ndf_cell_cite.shape, df_cell_multi.shape\n\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"This work is based on great notebook from @AmbrosM\nhttps://www.kaggle.com/code/ambrosm/msci-citeseq-quickstart","metadata":{}},{"cell_type":"code","source":"\n# 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#     if type(y_true) == pd.DataFrame: y_true = y_true.values\n#     if type(y_pred) == pd.DataFrame: y_pred = y_pred.values\n#     corrsum = 0\n#     for i in range(len(y_true)):\n#         corrsum += np.corrcoef(y_true[i], y_pred[i])[1, 0]\n#     return corrsum / len(y_true)\n\n\n\n# # Preprocessing\n\n# class PreprocessCiteseq(BaseEstimator, TransformerMixin):\n#     columns_to_use = 12000\n    \n#     @staticmethod\n#     def take_column_subset(X):\n#         return X[:,-PreprocessCiteseq.columns_to_use:]\n    \n#     def transform(self, X):\n#         print(X.shape)\n#         X = X[:,~self.all_zero_columns]\n#         print(X.shape)\n#         X = PreprocessCiteseq.take_column_subset(X) # use only a part of the columns\n#         print(X.shape)\n#         gc.collect()\n\n#         X = self.pca.transform(X)\n#         print(X.shape)\n#         return X\n\n#     def fit_transform(self, X):\n#         gc.collect()\n#         print(X.shape)\n#         self.all_zero_columns = (X == 0).all(axis=0)\n#         X = X[:,~self.all_zero_columns]\n#         print(X.shape)\n#         X = PreprocessCiteseq.take_column_subset(X) # use only a part of the columns\n#         print(X.shape)\n#         gc.collect()\n\n#         self.pca = PCA(n_components=240, copy=False, random_state=1)\n#         X = self.pca.fit_transform(X)\n#         # plt.plot(self.pca.explained_variance_ratio_.cumsum())\n#         # plt.title(\"Cumulative explained variance ratio\")\n#         # plt.gca().xaxis.set_major_locator(MaxNLocator(integer=True))\n#         # plt.xlabel('PCA component')\n#         # plt.ylabel('Cumulative explained variance ratio')\n#         # plt.show()\n#         print(X.shape)\n#         return X\n\n# preprocessor = PreprocessCiteseq()\n\n# cite_train_x = None\n# cite_train_x = preprocessor.fit_transform(pd.read_hdf(FP_CITE_TRAIN_INPUTS).values)\n\n# cite_train_y = pd.read_hdf(FP_CITE_TRAIN_TARGETS).values\n# print('y',cite_train_y.shape)\n# print('x', cite_train_x.shape)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# kf = KFold(n_splits=5, shuffle=True, random_state=1)\n# score_list = []\n# for fold, (idx_tr, idx_va) in tqdm(enumerate(kf.split(cite_train_x))):\n#     print('Fold', fold)\n#     model = None\n#     gc.collect()\n#     X_tr = cite_train_x[idx_tr] # creates a copy, https://numpy.org/doc/stable/user/basics.copies.html\n#     y_tr = cite_train_y[idx_tr]\n\n   \n#     estimator = XGBRegressor(\n#     objective = 'reg:squarederror'\n#     )\n\n# # Define the model\n#     model = MultiOutputRegressor(estimator = estimator, n_jobs = -1).fit(X_tr, y_tr)\n#     del X_tr, y_tr\n#     gc.collect()\n\n#     # We validate the model\n#     X_va = cite_train_x[idx_va]\n#     y_va = cite_train_y[idx_va]\n#     y_va_pred = model.predict(X_va)\n#     mse = mean_squared_error(y_va, y_va_pred)\n#     corrscore = correlation_score(y_va, y_va_pred)\n#     del X_va, y_va\n\n#     print(f\"Fold {fold}: mse = {mse:.5f}, corr =  {corrscore:.3f}\")\n#     score_list.append((mse, corrscore))\n\n# # Show overall score\n# result_df = pd.DataFrame(score_list, columns=['mse', 'corrscore'])\n# print(f\"{Fore.GREEN}{Style.BRIGHT}Average  mse = {result_df.mse.mean():.5f}; corr = {result_df.corrscore.mean():.3f}{Style.RESET_ALL}\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# model = None # free the RAM occupied by the old model\n# estimator = XGBRegressor(\n#     objective = 'reg:squarederror'\n#     )\n\n# # Define the model\n# model = MultiOutputRegressor(estimator = estimator, n_jobs = -1)\n# model.fit(cite_train_x, cite_train_y)\n# del cite_train_x, cite_train_y\n# gc.collect()\n\n# cite_test_x = preprocessor.transform(pd.read_hdf(FP_CITE_TEST_INPUTS).values)\n# test_pred = model.predict(cite_test_x)\n# del cite_test_x\n# test_pred.shape\n\n#with open('citeseq_pred.pickle', 'wb') as f: pickle.dump(test_pred, f)\n\n    \nwith open('../input/mscisqe/citeseq_pred.pickle', 'rb') as f: test_pred = pickle.load(f)\nwith open(\"../input/mscisqe/partial_submission_multi.pickle\", 'rb') as f: submission = pickle.load(f)    \n    \nsubmission.iloc[:len(test_pred.ravel())] = test_pred.ravel()\nassert not submission.isna().any()\n\nsubmission = submission.round(6) # reduce the size of the csv\nsubmission.to_csv('submission.csv')\nsubmission\n","metadata":{},"execution_count":null,"outputs":[]}]}