{"metadata":{"kernelspec":{"name":"ir","display_name":"R","language":"R"},"language_info":{"name":"R","codemirror_mode":"r","pygments_lexer":"r","mimetype":"text/x-r-source","file_extension":".r","version":"4.0.5"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"This version's solution uses Ridge regression with randomized 7-fold CV, WITHOUT ensemble with mean by drug and mean by cell_type as in [Streamlined Baseline Approach](https://www.kaggle.com/code/zmcxjt/streamlined-baseline-approach) notebook.  \n- features: PCA of molecular descriptors, followed by selection of 20 PC (from [this notebook](https://www.kaggle.com/code/antoninadolgorukova/op2-feature-engineering)) (cell  type is ignored)\n- targets: PCA, predict top 10 PC (explain ~85% of variance) then inverse transform","metadata":{}},{"cell_type":"code","source":"library(arrow)\nlibrary(data.table)\nlibrary(qs)\nlibrary(tictoc)\nlibrary(ggplot2)\nlibrary(glmnet)\nlibrary(parallel)\nlibrary(doParallel)","metadata":{"_uuid":"051d70d956493feee0c6d64651c6a088724dca2a","_execution_state":"idle","execution":{"iopub.status.busy":"2023-10-13T17:36:30.359510Z","iopub.execute_input":"2023-10-13T17:36:30.362489Z","iopub.status.idle":"2023-10-13T17:36:33.763349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load and prepare features and targets","metadata":{}},{"cell_type":"markdown","source":"**Load features**","metadata":{}},{"cell_type":"code","source":"train_features_source <- fread(\"/kaggle/input/op2-supplementary-calcs-for-ml/target_encoded_features/pca170s0.1_dct_target_encoded_features_train.csv\")\ntest_features_source <- fread(\"/kaggle/input/op2-supplementary-calcs-for-ml/target_encoded_features/pca170s0.1_dct_target_encoded_features_test.csv\")\n\n#train_features_source <- fread(\"/kaggle/input/op2-supplementary-calcs-for-ml/mol_descriptors_features.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-10-13T17:59:09.822038Z","iopub.execute_input":"2023-10-13T17:59:09.823666Z","iopub.status.idle":"2023-10-13T17:59:09.924739Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"adata_obs_meta <- fread(\"/kaggle/input/open-problems-single-cell-perturbations/adata_obs_meta.csv\")\nsum_by_drug_and_cell <- adata_obs_meta[, .(n_cells = .N), by = c(\"sm_name\", \"cell_type\")]\nsum_by_drug_and_cell <- sum_by_drug_and_cell[sm_name != \"Dimethyl Sulfoxide\"]\n\nhead(sum_by_drug_and_cell)\ncat(\"\\nShape: \", ncol(sum_by_drug_and_cell), \" columns x \",\n        nrow(sum_by_drug_and_cell), \" rows\", sep = \"\")","metadata":{"execution":{"iopub.status.busy":"2023-10-13T17:50:43.957662Z","iopub.execute_input":"2023-10-13T17:50:43.959678Z","iopub.status.idle":"2023-10-13T17:50:44.484777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Main train data**","metadata":{}},{"cell_type":"code","source":"id_map <- fread(\"/kaggle/input/open-problems-single-cell-perturbations/id_map.csv\")\nde_train <- read_parquet('/kaggle/input/open-problems-single-cell-perturbations/de_train.parquet')\nde_train <- setDT(de_train)\n\nhead(de_train)\ncat(\"\\nShape: \", ncol(de_train), \" columns x \",\n        nrow(de_train), \" rows\", sep = \"\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Train targets**","metadata":{}},{"cell_type":"code","source":"target_cols <- c(\"sm_name\", #\"cell_type\",\n                 names(de_train)[unlist(lapply(de_train, is.numeric))])\n\ntrain_targets <- de_train[, ..target_cols]\n\n# Average targets by drugs\n# train_targets <- train_targets[, lapply(.SD, mean),\n#                                  .SDcols = names(train_targets)[-1],\n#                                  by = \"sm_name\"]\n\ncat(\"Train targets:\\n\")\nhead(train_targets[1:5, 1:10])\ncat(\"\\nShape: \", ncol(train_targets), \" columns x \",\n        nrow(train_targets), \" rows\", sep = \"\")","metadata":{"execution":{"iopub.status.busy":"2023-10-13T17:41:01.788518Z","iopub.execute_input":"2023-10-13T17:41:01.790030Z","iopub.status.idle":"2023-10-13T17:41:02.269896Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Targets PCA**","metadata":{}},{"cell_type":"code","source":"target_cols <- c(names(de_train)[unlist(lapply(de_train, is.numeric))])\nmu = colMeans(train_targets[, ..target_cols])\ntrain_targets_pca = prcomp(train_targets[, ..target_cols])\n\nnComp = 10\ntrain_targets <- as.data.table(train_targets_pca$x[, 1:nComp])\n\nhead(train_targets)\ncat(\"\\nShape: \", ncol(train_targets), \" columns x \",\n        nrow(train_targets), \" rows\", sep = \"\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"options(repr.plot.width = 20, repr.plot.height = 10)\n\ncumulative_var <- cumsum(train_targets_pca$sdev^2 / sum(train_targets_pca$sdev^2))\n\nplot(cumulative_var,\n     xlab = \"Principal Component\",\n     ylab = \"Cumulative Proportion of Variance Explained\",\n     ylim = c(0, 1), type = \"b\", cex.axis = 1.5, cex.lab = 1.5, xaxt = \"n\")\nbreaks <- seq(0, ncol(train_targets_pca$x), by = 10)\naxis(1, at = breaks, labels = breaks)\n\n# abline(v = c(which.max(cumulative_var >= 0.85)), col = \"red\", lty = 2)\n# abline(h = 0.85, col = \"red\", lty = 2)\n# abline(v = c(which.max(cumulative_var >= 0.90)), col = \"red\", lty = 2)\n# abline(h = 0.90, col = \"red\", lty = 2)\nabline(v = c(which.max(cumulative_var >= 0.95)), col = \"red\", lty = 2)\nabline(h = 0.95, col = \"red\", lty = 2)","metadata":{"execution":{"iopub.status.busy":"2023-10-13T17:41:57.616433Z","iopub.execute_input":"2023-10-13T17:41:57.621868Z","iopub.status.idle":"2023-10-13T17:41:58.004529Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Train features - target encoded**","metadata":{}},{"cell_type":"code","source":"# select n features\nn_pc = 20\nselect_cols <- c(\"sm_name\", \"cell_type\",\n                 names(train_features_source)[grepl(\"_drug\", names(train_features_source))][1:n_pc],\n                names(train_features_source)[grepl(\"_cell_type\", names(train_features_source))][1:n_pc])\n\ntrain_features <- train_features_source[, ..select_cols]\ntrain_features <- sum_by_drug_and_cell[train_features, on = c(\"sm_name\", \"cell_type\")]\n                          \ncat(\"Train features:\\n\")\nhead(train_features)\ncat(\"\\nShape: \", ncol(train_features), \" columns x \",\n        nrow(train_features), \" rows\", sep = \"\")","metadata":{"execution":{"iopub.status.busy":"2023-10-13T18:06:48.194908Z","iopub.execute_input":"2023-10-13T18:06:48.197048Z","iopub.status.idle":"2023-10-13T18:06:48.286205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Test features - target encoded**","metadata":{}},{"cell_type":"code","source":"select_cols <- c(\"sm_name\", \"cell_type\",\n                 names(test_features_source)[grepl(\"_drug\", names(test_features_source))][1:n_pc],\n                names(test_features_source)[grepl(\"_cell_type\", names(test_features_source))][1:n_pc])\n\ntest_features <- test_features_source[, ..select_cols]\nmean_test <- sum_by_drug_and_cell[cell_type %in% test_features$cell_type,\n                                 .(n_cells = mean(n_cells)),\n                                 by = \"cell_type\"]\ntest_features <- mean_test[test_features, on = \"cell_type\"]\nsetcolorder(test_features, names(train_features))\n                               \ncat(\"Test features:\\n\")\nhead(test_features)\ncat(\"\\nShape: \", ncol(test_features), \" columns x \",\n        nrow(test_features), \" rows\", sep = \"\")","metadata":{"execution":{"iopub.status.busy":"2023-10-13T18:08:35.111955Z","iopub.execute_input":"2023-10-13T18:08:35.114711Z","iopub.status.idle":"2023-10-13T18:08:35.208873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Train + test features - molecular descriptors**","metadata":{}},{"cell_type":"code","source":"# # Add cell type encoding to train\n# ct_features <- fread(\"/kaggle/input/op2-supplementary-calcs-for-ml/dummy features/dummy_features_train.csv\")\n# ct_features <- ct_features[, 1:7]\n\n# train_features <- train_features_source[de_train[, sm_name], on = \"sm_name\"]\n# train_features[, id := 1:.N]\n# train_features <- train_features[ct_features, on = \"id\"]\n# train_features[, id := NULL]\n\n# # Add cell type encoding to test\n# ct_features <- fread(\"/kaggle/input/op2-supplementary-calcs-for-ml/dummy features/dummy_features_test.csv\")\n# ct_features <- ct_features[, 1:7]\n\n# test_features <- train_features_source[id_map[, sm_name], on = \"sm_name\"]\n# test_features[, id := 0:(.N-1)]\n# test_features <- test_features[ct_features, on = \"id\"]\n# test_features[, id := NULL]\n\n# All features\n# features <- rbind(train_features, test_features)\n\n# head(features)\n# cat(\"\\nShape: \", ncol(features), \" columns x \",\n#         nrow(features), \" rows\", sep = \"\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Features PCA**","metadata":{}},{"cell_type":"code","source":"# feature_cols <- names(features)[!names(features) %in% c(\"sm_name\", \"cell_type\")]\n# features_pca = prcomp(features[, ..feature_cols], scale. = TRUE)\n\n# nComp_features = 20\n\n# features <- data.table(sm_name = features[, sm_name],\n#                        cell_type = c(de_train[, cell_type], id_map[, cell_type]),\n#                        features_pca$x[, 1:nComp_features])\n# head(features)\n# cat(\"\\nShape: \", ncol(features), \" columns x \",\n#         nrow(features), \" rows\", sep = \"\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# cumulative_var <- cumsum(features_pca$sdev^2 / sum(features_pca$sdev^2))\n\n# plot(cumulative_var,\n#      xlab = \"Principal Component\",\n#      ylab = \"Cumulative Proportion of Variance Explained\",\n#      ylim = c(0, 1), type = \"b\", cex.axis = 1.5, cex.lab = 1.5, xaxt = \"n\")\n# breaks <- seq(0, ncol(features_pca$x), by = 5)\n# axis(1, at = breaks, labels = breaks)\n\n\n# abline(v = c(which.max(cumulative_var >= 0.85)), col = \"red\", lty = 2)\n# abline(h = 0.85, col = \"red\", lty = 2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ct_features_train <- fread(\"/kaggle/input/op2-supplementary-calcs-for-ml/target_encoded_features/pca170_dct_target_encoded_features_train.csv\")\n# ct_feature_cols <- names(ct_features_train)[grepl(\"_cell_type\", names(ct_features_train))]\n# ct_features_train <- ct_features_train[, ..ct_feature_cols]\n\n# ct_features_test <- fread(\"/kaggle/input/op2-supplementary-calcs-for-ml/target_encoded_features/pca170_dct_target_encoded_features_test.csv\")\n# ct_features_test <- ct_features_test[, ..ct_feature_cols]\n# n_ct_features = 20\n\n# train_features <- features[de_train[, .(sm_name, cell_type)], on = c(\"sm_name\", \"cell_type\")]\n\n# train_features <- cbind(features[de_train[, .(sm_name, cell_type)], on = c(\"sm_name\", \"cell_type\")],\n#                         ct_features_train[, 1:n_ct_features])\n# cat(\"Train features:\\n\")\n# head(train_features)\n# cat(\"\\nShape: \", ncol(train_features), \" columns x \",\n#         nrow(train_features), \" rows\", sep = \"\")\n\n# test_features <- features[id_map[, .(sm_name, cell_type)], on = c(\"sm_name\", \"cell_type\")]\n\n# test_features <- cbind(features[id_map[, .(sm_name, cell_type)], on = c(\"sm_name\", \"cell_type\")],\n#                         ct_features_test[, 1:n_ct_features])\n\n# cat(\"\\nTest features:\\n\")\n# head(test_features)\n# cat(\"\\nShape: \", ncol(test_features), \" columns x \",\n#         nrow(test_features), \" rows\", sep = \"\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Submission file**","metadata":{}},{"cell_type":"code","source":"submission <- fread(\"/kaggle/input/open-problems-single-cell-perturbations/sample_submission.csv\")\nsubmission[1:5, 1:5]","metadata":{"execution":{"iopub.status.busy":"2023-10-13T18:08:48.421473Z","iopub.execute_input":"2023-10-13T18:08:48.423528Z","iopub.status.idle":"2023-10-13T18:08:48.827262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Remove ID columns**","metadata":{}},{"cell_type":"code","source":"id_cols <- c(\"sm_name\", \"cell_type\")\ntrain_features <- train_features[, !..id_cols]\ntest_features <- test_features[, !..id_cols]\n\ndim(train_targets)\ndim(train_features)\ndim(test_features)","metadata":{"execution":{"iopub.status.busy":"2023-10-13T18:08:50.729154Z","iopub.execute_input":"2023-10-13T18:08:50.731229Z","iopub.status.idle":"2023-10-13T18:08:50.776837Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Ridge","metadata":{}},{"cell_type":"markdown","source":"**Function calculating R-squared (R^2) score**","metadata":{}},{"cell_type":"code","source":"r2 <- function(true, predicted) {\n    \n    # Calculate the residuals (differences between observed and predicted values)\n    residuals <- true - predicted\n\n    # the sum of squared residuals\n    ss_residuals <- sum(residuals^2)\n\n    # Calculate the total sum of squares\n    mean_true <- mean(true)\n    ss_total <- sum((true - mean_true)^2)\n\n    # Calculate R-squared\n    r2 <- 1 - (ss_residuals / ss_total)\n    \n    return(r2)\n}","metadata":{"execution":{"iopub.status.busy":"2023-10-13T17:56:29.983633Z","iopub.execute_input":"2023-10-13T17:56:29.985121Z","iopub.status.idle":"2023-10-13T17:56:29.997129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Function to inverse transform the predicted PC to target genes**","metadata":{}},{"cell_type":"code","source":"inv_transPCA <- function(pred_matrix, n_Comp = nComp, col_means = mu) {\n    \n    pred <- pred_matrix %*% t(train_targets_pca$rotation[,1:n_Comp])\n    pred = scale(pred, center = -col_means, scale = FALSE)\n    return(pred)\n}","metadata":{"execution":{"iopub.status.busy":"2023-10-13T17:56:32.795538Z","iopub.execute_input":"2023-10-13T17:56:32.797520Z","iopub.status.idle":"2023-10-13T17:56:32.814135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Cross validation**","metadata":{}},{"cell_type":"code","source":"n_folds = 7\nset.seed(1)\ncv <- data.table(id = 1:train_features[, .N])\ncv[, folds := sample(1:n_folds, .N, replace = TRUE)]\ncv[order(folds), .N, by = folds]","metadata":{"execution":{"iopub.status.busy":"2023-10-13T18:00:06.433052Z","iopub.execute_input":"2023-10-13T18:00:06.435172Z","iopub.status.idle":"2023-10-13T18:00:06.481794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cl <- makePSOCKcluster(detectCores())\nregisterDoParallel(cl)\n\npreds_cv <- melt(submission,\n                id.vars = \"id\",\n                variable.name = \"gene\",\n                value.name = \"pred\")\nY_oof <- NULL\nfor(fold in 1:n_folds) {\n    \n    tic()\n    cat(\"\\n\", \"fold:\", fold, \"\\n\")\n    \n    # train/test split for local validation\n    train_ids <- cv[folds != fold, id]\n    valid_ids <- cv[folds == fold, id]  \n        \n    X_train <- as.matrix(train_features[train_ids])\n    Y_train <- as.matrix(train_targets[train_ids])    \n    \n    X_valid <- as.matrix(train_features[valid_ids])\n    Y_valid <- as.matrix(train_targets[valid_ids])\n    \n    # Normalisation    \n    X_train = scale(X_train)\n    X_valid = scale(X_valid,\n                    center = attr(X_train, \"scaled:center\"),\n                    scale = attr(X_train, \"scaled:scale\"))\n    \n    # Cross-validated lambda tuning \n    cv_fit <- cv.glmnet(X_train, Y_train, family = \"mgaussian\", alpha = 1,\n                       parallel = TRUE\n                       )\n    \n    cat(\"Lambda min:\", cv_fit$lambda.min, \"\\n\")\n    cat(\"Lambda 1se:\", cv_fit$lambda.1se, \"\\n\")\n    cat(\"Minimum CV MSE:\", min(cv_fit$cvm), \"\\n\")\n    \n    # Predict train seen data\n    Y_pred <- predict(cv_fit, newx = as.matrix(X_train), s = \"lambda.min\")\n    Y_pred <- apply(Y_pred, 2 , c)\n    \n    cat(\"r2 train:\",\n        r2(inv_transPCA(Y_train),\n           inv_transPCA(Y_pred)), \"\\n\")\n    \n    # Predict valid unseen data\n    Y_pred <- predict(cv_fit, newx = as.matrix(X_valid), s = \"lambda.min\")\n    Y_pred <- apply(Y_pred, 2 , c)\n    \n    cat(\"r2 valid:\",\n        r2(inv_transPCA(Y_valid),\n           inv_transPCA(Y_pred)), \"\\n\")        \n    \n    # Save the predictions for validation set of each fold\n    Y_oof <- rbind(Y_oof, data.table(id = valid_ids,\n                                     inv_transPCA(Y_pred))\n                  )    \n    # Predict test targets and average between folds    \n    X_submit <- as.matrix(test_features)\n    X_submit = scale(X_submit,\n                     center = attr(X_train, \"scaled:center\"),\n                     scale = attr(X_train, \"scaled:scale\"))\n    preds <- predict(cv_fit, newx = X_submit, s = \"lambda.min\")\n    preds <- apply(preds, 2 , c)\n    preds <- as.data.table(inv_transPCA(preds))\n    preds[, id := 0:(nrow(preds)-1)]\n    preds <- melt(preds, id.vars = \"id\") \n    preds_cv[, pred := pred + preds[, value] / n_folds]\n    toc()\n}\nstopCluster(cl)","metadata":{"execution":{"iopub.status.busy":"2023-10-13T18:39:43.094523Z","iopub.execute_input":"2023-10-13T18:39:43.096518Z","iopub.status.idle":"2023-10-13T18:41:55.652982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Evaluation on out-of-folds (unseen) train data","metadata":{}},{"cell_type":"code","source":"target_cols <- c(names(de_train)[unlist(lapply(de_train, is.numeric))])\ntrue_targets <- as.matrix(de_train[, ..target_cols])\n\nY_oof <- as.matrix(Y_oof[order(id), !\"id\"])\n\nrmse <- sqrt(mean((true_targets - Y_oof)^2))\ncat(\"\\n\", \"RMSE: \", rmse, \"\\n\", sep = \"\")\n\nmrRMSE <- mean(sqrt(rowMeans((true_targets - Y_oof)^2)))\ncat(\"mrRMSE:\", mrRMSE, \"\\n\")\n\nMAE <- mean(abs((true_targets - Y_oof)))\ncat(\"MAE:\", MAE, \"\\n\")\n\nr_squared <- 1 - (sum((true_targets - Y_oof)^2) / \n                  sum((true_targets - mean(Y_oof))^2))\ncat(\"R-squared (R2):\", r_squared, \"\\n\")","metadata":{"execution":{"iopub.status.busy":"2023-10-13T18:42:07.408830Z","iopub.execute_input":"2023-10-13T18:42:07.410534Z","iopub.status.idle":"2023-10-13T18:42:09.166331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict for submit","metadata":{}},{"cell_type":"code","source":"# X_train <- as.matrix(train_features)\n# Y_train <- as.matrix(train_targets)    \n# X_submit <- as.matrix(test_features)\n\n# # Normalisation\n# X_train = scale(X_train)\n# X_submit = scale(X_submit,\n#                 center = attr(X_train, \"scaled:center\"),\n#                 scale = attr(X_train, \"scaled:scale\"))\n\n# # Fit\n# cv_fit <- cv.glmnet(X_train, Y_train, family = \"mgaussian\", alpha = 1)\n\n# # Predict\n# preds <- predict(cv_fit, newx = X_submit, s = \"lambda.min\")\n# preds <- apply(preds, 2 , c)\n# preds <- as.data.table(inv_transPCA(preds))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Convert to submission format**","metadata":{}},{"cell_type":"code","source":"#submit <- cbind(id = submission[, id], preds)\nsubmit <- dcast(preds_cv, \n                id ~ gene,\n                value.var = \"pred\")\nhead(submit)\ncat(\"\\nShape: \", ncol(submit), \" columns x \",\n        nrow(submit), \" rows\", sep = \"\")","metadata":{"execution":{"iopub.status.busy":"2023-10-13T18:42:25.136201Z","iopub.execute_input":"2023-10-13T18:42:25.137974Z","iopub.status.idle":"2023-10-13T18:42:32.768110Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Ensemble","metadata":{}},{"cell_type":"markdown","source":"**Mean by drug**","metadata":{}},{"cell_type":"code","source":"# targets_cols <- names(de_train)[unlist(lapply(de_train, is.numeric))]\n# mean_by_drug <- \n#     de_train[sm_name %chin% id_map$sm_name,\n#              lapply(.SD, mean),\n#              by = sm_name,\n#              .SDcols = targets_cols]\n# mean_by_drug <- id_map[mean_by_drug, on = \"sm_name\"][\n#     order(id), -c(\"cell_type\", \"sm_name\")\n# ]\n\n# head(mean_by_drug)\n# cat(\"\\nShape: \", ncol(mean_by_drug), \" columns x \",\n#         nrow(mean_by_drug), \" rows\", sep = \"\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Mean by cell type**","metadata":{}},{"cell_type":"code","source":"# mean_by_ct <- \n#     de_train[cell_type %chin% id_map$cell_type,\n#              lapply(.SD, mean),\n#              by = cell_type,\n#              .SDcols = targets_cols]\n# mean_by_ct <- id_map[mean_by_ct, on = \"cell_type\"][\n#     order(id), -c(\"cell_type\", \"sm_name\")\n# ]\n\n# head(mean_by_ct)\n# cat(\"\\nShape: \", ncol(mean_by_ct), \" columns x \",\n#         nrow(mean_by_ct), \" rows\", sep = \"\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Ensemble**","metadata":{}},{"cell_type":"code","source":"# submit <- as.matrix(preds_cv)*0.45 + as.matrix(mean_by_drug)*0.45 + as.matrix(mean_by_ct)*0.1\n# submit <- as.data.table(submit)\n# head(submit)\n# cat(\"\\nShape: \", ncol(submit), \" columns x \",\n#         nrow(submit), \" rows\", sep = \"\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fwrite(submit, \"submission.csv\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}