{"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":"markdown","source":"This provides the most simple submission possible, we use the mask on the test images as prediction.","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import roc_auc_score, accuracy_score, f1_score, log_loss\nimport pickle\nfrom torch.utils.data import DataLoader\nfrom torch.cuda.amp import autocast, GradScaler\nimport warnings\nimport sys\nimport pandas as pd\nimport os\nimport gc\nimport sys\nimport math\nimport time\nimport random\nimport shutil\nfrom pathlib import Path\nfrom contextlib import contextmanager\nfrom collections import defaultdict, Counter\nimport cv2\n\nimport scipy as sp\nimport numpy as np\nimport pandas as pd\n\nimport matplotlib.pyplot as plt\nfrom tqdm.auto import tqdm\nfrom functools import partial\n\nimport argparse\nimport importlib\nimport torch\nimport torch.nn as nn\nfrom torch.optim import Adam, SGD, AdamW\n\nimport datetime","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:01.510670Z","iopub.execute_input":"2023-05-30T08:27:01.511364Z","iopub.status.idle":"2023-05-30T08:27:05.385320Z","shell.execute_reply.started":"2023-05-30T08:27:01.511299Z","shell.execute_reply":"2023-05-30T08:27:05.384114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sys.path.append('/kaggle/input/pretrainedmodels/pretrainedmodels-0.7.4')\nsys.path.append('/kaggle/input/efficientnet-pytorch/EfficientNet-PyTorch-master')\nsys.path.append('/kaggle/input/timm-pytorch-image-models/pytorch-image-models-master')\nsys.path.append('/kaggle/input/segmentation-models-pytorch/segmentation_models.pytorch-master')","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:05.387508Z","iopub.execute_input":"2023-05-30T08:27:05.387989Z","iopub.status.idle":"2023-05-30T08:27:05.395000Z","shell.execute_reply.started":"2023-05-30T08:27:05.387958Z","shell.execute_reply":"2023-05-30T08:27:05.393628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import segmentation_models_pytorch as smp\nfrom segmentation_models_pytorch.decoders.unet.decoder import UnetDecoder","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:05.396992Z","iopub.execute_input":"2023-05-30T08:27:05.397812Z","iopub.status.idle":"2023-05-30T08:27:08.750384Z","shell.execute_reply.started":"2023-05-30T08:27:05.397765Z","shell.execute_reply":"2023-05-30T08:27:08.749050Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import ssl\nssl._create_default_https_context = ssl._create_unverified_context","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:08.757587Z","iopub.execute_input":"2023-05-30T08:27:08.760520Z","iopub.status.idle":"2023-05-30T08:27:08.768464Z","shell.execute_reply.started":"2023-05-30T08:27:08.760474Z","shell.execute_reply":"2023-05-30T08:27:08.766747Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nfrom torch.utils.data import DataLoader, Dataset\nimport cv2\nimport torch\nimport os\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom albumentations import ImageOnlyTransform","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:08.774867Z","iopub.execute_input":"2023-05-30T08:27:08.778156Z","iopub.status.idle":"2023-05-30T08:27:09.768581Z","shell.execute_reply.started":"2023-05-30T08:27:08.778108Z","shell.execute_reply":"2023-05-30T08:27:09.767467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CFG:\n    # ============== comp exp name =============\n    comp_name = 'vesuvius'\n    \n    exp_name = 'vesuvius_2d_slide_exp002'\n\n    # ============== pred target =============\n    target_size = 1\n\n    # ============== model cfg =============\n    model_name = 'Unet'\n    # backbone = 'efficientnet-b0'\n    backbone = 'se_resnext50_32x4d'\n\n    in_chans = 6 # 65\n    # ============== training cfg =============\n    size = 224\n    tile_size = 224\n    stride = tile_size // 2\n\n    train_batch_size = 16 # 32\n    valid_batch_size = train_batch_size * 2\n    test_batch_size = train_batch_size\n    use_amp = True\n\n    scheduler = 'GradualWarmupSchedulerV2'\n    # scheduler = 'CosineAnnealingLR'\n    epochs = 5 # 30\n\n    # adamW warmupあり\n    warmup_factor = 10\n    lr = 1e-4 / warmup_factor\n    warmup_epoch = 2\n\n    # ============== fold =============\n    valid_id = 1\n\n    # objective_cv = 'binary'  # 'binary', 'multiclass', 'regression'\n    metric_direction = 'maximize'  # maximize, 'minimize'\n    # metrics = 'dice_coef'\n\n    # ============== fixed =============\n    pretrained = True\n    inf_weight = 'best'  # 'best'\n\n    min_lr = 1e-6\n    weight_decay = 1e-6\n    max_grad_norm = 1000\n\n    print_freq = 50\n    num_workers = 4\n\n    seed = 42\n\n    # ============== set dataset path =============\n    print('set dataset path')\n\n    outputs_path = f'/kaggle/working/outputs/{comp_name}/{exp_name}/'\n\n    submission_dir = outputs_path + 'submissions/'\n    submission_path = submission_dir + f'submission_{exp_name}.csv'\n\n    model_dir = outputs_path + \\\n        f'{comp_name}-models/'\n\n    figures_dir = outputs_path + 'figures/'\n\n    log_dir = outputs_path + 'logs/'\n    log_path = log_dir + f'{exp_name}.txt'\n\n    # ============== augmentation =============\n    train_aug_list = [\n        # A.RandomResizedCrop(\n        #     size, size, scale=(0.85, 1.0)),\n        A.Resize(size, size),\n        A.HorizontalFlip(p=0.5),\n        A.VerticalFlip(p=0.5),\n        A.RandomBrightnessContrast(p=0.75),\n        A.ShiftScaleRotate(p=0.75),\n        A.OneOf([\n                A.GaussNoise(var_limit=[10, 50]),\n                A.GaussianBlur(),\n                A.MotionBlur(),\n                ], p=0.4),\n        A.GridDistortion(num_steps=5, distort_limit=0.3, p=0.5),\n        A.CoarseDropout(max_holes=1, max_width=int(size * 0.3), max_height=int(size * 0.3), \n                        mask_fill_value=0, p=0.5),\n        # A.Cutout(max_h_size=int(size * 0.6),\n        #          max_w_size=int(size * 0.6), num_holes=1, p=1.0),\n        A.Normalize(\n            mean= [0] * in_chans,\n            std= [1] * in_chans\n        ),\n        ToTensorV2(transpose_mask=True),\n    ]\n\n    valid_aug_list = [\n        A.Resize(size, size),\n        A.Normalize(\n            mean= [0] * in_chans,\n            std= [1] * in_chans\n        ),\n        ToTensorV2(transpose_mask=True),\n    ]\n    \n    test_aug_list = [\n        A.Resize(size, size),\n        A.Normalize(\n            mean= [0] * in_chans,\n            std= [1] * in_chans\n        ),\n        ToTensorV2(),\n    ]\n","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.770461Z","iopub.execute_input":"2023-05-30T08:27:09.770845Z","iopub.status.idle":"2023-05-30T08:27:09.794546Z","shell.execute_reply.started":"2023-05-30T08:27:09.770803Z","shell.execute_reply":"2023-05-30T08:27:09.792752Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class AverageMeter(object):\n    \"\"\"Computes and stores the average and current value\"\"\"\n\n    def __init__(self):\n        self.reset()\n\n    def reset(self):\n        self.val = 0\n        self.avg = 0\n        self.sum = 0\n        self.count = 0\n\n    def update(self, val, n=1):\n        self.val = val\n        self.sum += val * n\n        self.count += n\n        self.avg = self.sum / self.count","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.796772Z","iopub.execute_input":"2023-05-30T08:27:09.797267Z","iopub.status.idle":"2023-05-30T08:27:09.806173Z","shell.execute_reply.started":"2023-05-30T08:27:09.797219Z","shell.execute_reply":"2023-05-30T08:27:09.804798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def init_logger(log_file):\n    from logging import getLogger, INFO, FileHandler, Formatter, StreamHandler\n    logger = getLogger(__name__)\n    logger.setLevel(INFO)\n    handler1 = StreamHandler()\n    handler1.setFormatter(Formatter(\"%(message)s\"))\n    handler2 = FileHandler(filename=log_file)\n    handler2.setFormatter(Formatter(\"%(message)s\"))\n    logger.addHandler(handler1)\n    logger.addHandler(handler2)\n    return logger\n\ndef set_seed(seed=None, cudnn_deterministic=True):\n    if seed is None:\n        seed = 42\n\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = cudnn_deterministic\n    torch.backends.cudnn.benchmark = False","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.808480Z","iopub.execute_input":"2023-05-30T08:27:09.809555Z","iopub.status.idle":"2023-05-30T08:27:09.820555Z","shell.execute_reply.started":"2023-05-30T08:27:09.809502Z","shell.execute_reply":"2023-05-30T08:27:09.819421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_dirs(cfg):\n    for dir in [cfg.model_dir, cfg.figures_dir, cfg.submission_dir, cfg.log_dir]:\n        os.makedirs(dir, exist_ok=True)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.822473Z","iopub.execute_input":"2023-05-30T08:27:09.822897Z","iopub.status.idle":"2023-05-30T08:27:09.835296Z","shell.execute_reply.started":"2023-05-30T08:27:09.822857Z","shell.execute_reply":"2023-05-30T08:27:09.834100Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def cfg_init(cfg, mode='train'):\n    set_seed(cfg.seed)\n    # set_env_name()\n    # set_dataset_path(cfg)\n\n    if mode == 'train':\n        make_dirs(cfg)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.841187Z","iopub.execute_input":"2023-05-30T08:27:09.841551Z","iopub.status.idle":"2023-05-30T08:27:09.848121Z","shell.execute_reply.started":"2023-05-30T08:27:09.841518Z","shell.execute_reply":"2023-05-30T08:27:09.846999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cfg_init(CFG)\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\nLogger = init_logger(log_file=CFG.log_path)\n\nLogger.info('\\n\\n-------- exp_info -----------------')\n# Logger.info(datetime.datetime.now().strftime('%Y年%m月%d日 %H:%M:%S'))","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.850225Z","iopub.execute_input":"2023-05-30T08:27:09.850757Z","iopub.status.idle":"2023-05-30T08:27:09.930563Z","shell.execute_reply.started":"2023-05-30T08:27:09.850714Z","shell.execute_reply":"2023-05-30T08:27:09.929502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_transforms(data, cfg):\n    if data == 'train':\n        aug = A.Compose(cfg.train_aug_list)\n    elif data == 'valid':\n        aug = A.Compose(cfg.valid_aug_list)\n    elif data == 'test':\n        aug = A.Compose(cfg.test_aug_list)\n\n    # print(aug)\n    return aug","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.934041Z","iopub.execute_input":"2023-05-30T08:27:09.934383Z","iopub.status.idle":"2023-05-30T08:27:09.942843Z","shell.execute_reply.started":"2023-05-30T08:27:09.934350Z","shell.execute_reply":"2023-05-30T08:27:09.941534Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomModel(nn.Module):\n    def __init__(self, cfg, weight=None):\n        super().__init__()\n        self.cfg = cfg\n\n        self.encoder = smp.Unet(\n            encoder_name=cfg.backbone, \n            encoder_weights=weight,\n            in_channels=cfg.in_chans,\n            classes=cfg.target_size,\n            activation=None,\n        )\n\n    def forward(self, image):\n        output = self.encoder(image)\n        # output = output.squeeze(-1)\n        return output\n\n\ndef build_model(cfg, weight=\"imagenet\"):\n    print('model_name', cfg.model_name)\n    print('backbone', cfg.backbone)\n\n    model = CustomModel(cfg, weight)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.945086Z","iopub.execute_input":"2023-05-30T08:27:09.945856Z","iopub.status.idle":"2023-05-30T08:27:09.956115Z","shell.execute_reply.started":"2023-05-30T08:27:09.945801Z","shell.execute_reply":"2023-05-30T08:27:09.955257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle(img):\n    '''\n    img: numpy array, 1 - mask, 0 - background\n    Returns run length as string formated\n    '''\n    pixels = img.flatten()\n    # pixels = (pixels >= thr).astype(int)\n    \n    pixels = np.concatenate([[0], pixels, [0]])\n    runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n    runs[1::2] -= runs[::2]\n    return ' '.join(str(x) for x in runs)\n\n\ndef concat_tile(im_list_2d):\n    return cv2.vconcat([cv2.hconcat(im_list_h) for im_list_h in im_list_2d])","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.958036Z","iopub.execute_input":"2023-05-30T08:27:09.958919Z","iopub.status.idle":"2023-05-30T08:27:09.971305Z","shell.execute_reply.started":"2023-05-30T08:27:09.958874Z","shell.execute_reply":"2023-05-30T08:27:09.970087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def read_test_image(test_data_dir):\n\n    images = []\n\n    # idxs = range(65)\n    mid = 65 // 2\n    start = mid - CFG.in_chans // 2\n    end = mid + CFG.in_chans // 2\n    idxs = range(start, end)\n\n    for i in tqdm(idxs):\n        \n        image = cv2.imread(str(test_data_dir / f\"surface_volume/{i:02}.tif\"), 0)\n\n        pad0 = (CFG.tile_size - image.shape[0] % CFG.tile_size)\n        pad1 = (CFG.tile_size - image.shape[1] % CFG.tile_size)\n\n        image = np.pad(image, [(0, pad0), (0, pad1)], constant_values=0)\n\n        images.append(image)\n    images = np.stack(images, axis=2)\n    \n    return images","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.973396Z","iopub.execute_input":"2023-05-30T08:27:09.973932Z","iopub.status.idle":"2023-05-30T08:27:09.984687Z","shell.execute_reply.started":"2023-05-30T08:27:09.973885Z","shell.execute_reply":"2023-05-30T08:27:09.983071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\ndef get_test_dataset(f):\n    test_images = []\n    test_xyxys = []\n\n    image = read_test_image(Path(f))\n\n    x1_list = list(range(0, image.shape[1]-CFG.tile_size+1, CFG.stride))\n    y1_list = list(range(0, image.shape[0]-CFG.tile_size+1, CFG.stride))\n\n    for y1 in y1_list:\n        for x1 in x1_list:\n            y2 = y1 + CFG.tile_size\n            x2 = x1 + CFG.tile_size\n\n            test_images.append(image[y1:y2, x1:x2])\n            test_xyxys.append([x1, y1, x2, y2])\n\n    return test_images, test_xyxys","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:09.986812Z","iopub.execute_input":"2023-05-30T08:27:09.987594Z","iopub.status.idle":"2023-05-30T08:27:09.998176Z","shell.execute_reply.started":"2023-05-30T08:27:09.987530Z","shell.execute_reply":"2023-05-30T08:27:09.997315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Custom_test_Dataset(Dataset):\n    def __init__(self, images, cfg, labels=None, transform=None):\n        self.images = images\n        self.cfg = cfg\n        self.labels = labels\n        self.transform = transform\n\n    def __len__(self):\n        # return len(self.df)\n        return len(self.images)\n\n    def __getitem__(self, idx):\n        image = self.images[idx]\n        data = self.transform(image=image)\n        image = data['image']\n\n        return image","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:10.000132Z","iopub.execute_input":"2023-05-30T08:27:10.000851Z","iopub.status.idle":"2023-05-30T08:27:10.013023Z","shell.execute_reply.started":"2023-05-30T08:27:10.000801Z","shell.execute_reply":"2023-05-30T08:27:10.011906Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def test_fn_2(test_loader, model, device, test_mask, test_xyxys):\n\n    model.eval()\n    test_preds = []\n\n    test_mask_gt = (test_mask / 255).astype(int)\n    \n    ori_h = test_mask_gt.shape[0]\n    ori_w = test_mask_gt.shape[1]\n    \n    pad0 = (CFG.tile_size - test_mask_gt.shape[0] % CFG.tile_size)\n    pad1 = (CFG.tile_size - test_mask_gt.shape[1] % CFG.tile_size)\n    test_mask_gt = np.pad(test_mask_gt, [(0, pad0), (0, pad1)], constant_values=0)\n    mask_pred = np.zeros(test_mask_gt.shape)\n    mask_count = np.zeros(test_mask_gt.shape)\n    \n    for step, (images) in tqdm(enumerate(test_loader), total=len(test_loader)):\n        images = images.to(device)\n        batch_size = images.size(0)\n\n        with torch.no_grad():\n            y_preds = model(images)\n            y_preds = torch.sigmoid(y_preds).to('cpu').numpy()\n\n        start_idx = step*CFG.test_batch_size\n        end_idx = start_idx + batch_size\n        for i, (x1, y1, x2, y2) in enumerate(test_xyxys[start_idx:end_idx]):\n            mask_pred[y1:y2, x1:x2] += y_preds[i].squeeze(0)\n            mask_count[y1:y2, x1:x2] += np.ones((CFG.tile_size, CFG.tile_size))\n    \n    mask_pred /= mask_count\n    mask_pred = mask_pred[:ori_h, :ori_w]\n    test_mask_gt = test_mask_gt[:ori_h, :ori_w]\n    \n    mask_pred = (mask_pred >= 0.4).astype(int)\n    mask_pred *= test_mask_gt\n\n    return mask_pred","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:10.031079Z","iopub.execute_input":"2023-05-30T08:27:10.031397Z","iopub.status.idle":"2023-05-30T08:27:10.047287Z","shell.execute_reply.started":"2023-05-30T08:27:10.031358Z","shell.execute_reply":"2023-05-30T08:27:10.046509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomModel(nn.Module):\n    def __init__(self, cfg, weight=None):\n        super().__init__()\n        self.cfg = cfg\n\n        self.encoder = smp.Unet(\n            encoder_name=cfg.backbone, \n            encoder_weights=weight,\n            in_channels=cfg.in_chans,\n            classes=cfg.target_size,\n            activation=None,\n        )\n\n    def forward(self, image):\n        output = self.encoder(image)\n        # output = output.squeeze(-1)\n        return output\n\n\ndef build_model(cfg, weight=\"imagenet\"):\n    print('model_name', cfg.model_name)\n    print('backbone', cfg.backbone)\n\n    model = CustomModel(cfg, weight)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:10.049995Z","iopub.execute_input":"2023-05-30T08:27:10.050396Z","iopub.status.idle":"2023-05-30T08:27:10.062729Z","shell.execute_reply.started":"2023-05-30T08:27:10.050357Z","shell.execute_reply":"2023-05-30T08:27:10.061471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = torch.load(\"/kaggle/input/unet-test/Unet_best.pth\")\ncheck_point = torch.load(\n    \"/kaggle/input/vesuvius-models-public/vesuvius_2d_slide_exp002/vesuvius-models/Unet_fold1_best.pth\", map_location=torch.device('cpu'))\n\nmodel.load_state_dict(check_point['model'])\nmodel.to('cuda')\nprint('model_done')","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:27:10.065961Z","iopub.execute_input":"2023-05-30T08:27:10.069689Z","iopub.status.idle":"2023-05-30T08:27:23.978418Z","shell.execute_reply.started":"2023-05-30T08:27:10.069640Z","shell.execute_reply":"2023-05-30T08:27:23.976148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DATA_DIR = Path(\"/kaggle/input/vesuvius-challenge-ink-detection\")\ntest_root_dir = DATA_DIR / \"test/*\"\npred_list = []\nresults = []\n\nstart_time = time.time()\n\nfor f in glob.glob(str(test_root_dir)):\n\n    test_images, test_xyxys = get_test_dataset(f)\n    test_mask = cv2.imread(str(Path(f) / \"mask.png\"), 0)\n\n    test_dataset = Custom_test_Dataset(\n        test_images, CFG, transform=get_transforms(data='test', cfg=CFG))\n\n    test_loader = DataLoader(test_dataset,\n                              batch_size=CFG.test_batch_size,\n                              shuffle=True,\n                              num_workers=CFG.num_workers, pin_memory=True, drop_last=True,\n                              )\n    # eval\n    test_preds = test_fn_2(test_loader, model, device, test_mask, test_xyxys)\n    plt.imshow(test_preds)\n    plt.show()\n    \n    inklabels_rle = rle(test_preds)\n    \n    results.append((str(f).split(\"/\")[-1], inklabels_rle))\n\n    #starts_ix, lengths = rle(test_preds, thr=0.5)\n    #inklabels_rle = \" \".join(map(str, sum(zip(starts_ix, lengths), ())))\n    #pred_list.append({\"Id\": str(f).split(\"/\")[-1], \"Predicted\": inklabels_rle})","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:28:55.817681Z","iopub.execute_input":"2023-05-30T08:28:55.818362Z","iopub.status.idle":"2023-05-30T08:29:31.426316Z","shell.execute_reply.started":"2023-05-30T08:28:55.818320Z","shell.execute_reply":"2023-05-30T08:29:31.424628Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub = pd.DataFrame(results, columns=['Id', 'Predicted'])\n","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:29:36.448501Z","iopub.execute_input":"2023-05-30T08:29:36.449650Z","iopub.status.idle":"2023-05-30T08:29:36.461067Z","shell.execute_reply.started":"2023-05-30T08:29:36.449606Z","shell.execute_reply":"2023-05-30T08:29:36.459880Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.DataFrame(sub).to_csv(\"/kaggle/working/submission.csv\", index=False)\npd.DataFrame(sub)","metadata":{"execution":{"iopub.status.busy":"2023-05-30T08:30:02.495189Z","iopub.execute_input":"2023-05-30T08:30:02.495975Z","iopub.status.idle":"2023-05-30T08:30:02.515229Z","shell.execute_reply.started":"2023-05-30T08:30:02.495935Z","shell.execute_reply":"2023-05-30T08:30:02.513550Z"},"trusted":true},"execution_count":null,"outputs":[]}]}