{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.10","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":20270,"databundleVersionId":1222630,"sourceType":"competition"},{"sourceId":25383,"databundleVersionId":2684322,"sourceType":"competition"}],"dockerImageVersionId":30123,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn import model_selection\nimport os\nfrom pathlib import Path\n\nRANDOM_STATE = 42\nnp.random.seed(RANDOM_STATE)\n\nprint(\"Libraries imported successfully!\")","metadata":{"_uuid":"a763c6a3-98bb-4bdf-8367-245dd564ac8c","_cell_guid":"1003d9b7-555b-405d-bcba-6d9558accdbe","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-10-09T19:43:59.604812Z","iopub.execute_input":"2025-10-09T19:43:59.605192Z","iopub.status.idle":"2025-10-09T19:43:59.611972Z","shell.execute_reply.started":"2025-10-09T19:43:59.605162Z","shell.execute_reply":"2025-10-09T19:43:59.611016Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"DATA_PATH = \"/kaggle/input/siim-isic-melanoma-classification/train.csv\"\nNUM_FOLDS_5 = 5\nNUM_FOLDS_10 = 10\nTARGET_COL = \"target\"\nRANDOM_STATE = 42\n\nprint(\"Configuration set up!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T19:43:59.621347Z","iopub.execute_input":"2025-10-09T19:43:59.621655Z","iopub.status.idle":"2025-10-09T19:43:59.628510Z","shell.execute_reply.started":"2025-10-09T19:43:59.621623Z","shell.execute_reply":"2025-10-09T19:43:59.627518Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def create_stratified_folds(data, target_col='target', num_splits=5, random_state=RANDOM_STATE):\n    \"\"\"\n    Create stratified k-fold splits for regression/classification problems.\n    \n    Parameters:\n    -----------\n    data : pandas.DataFrame\n        Input dataframe containing features and target\n    target_col : str\n        Name of the target column\n    num_splits : int\n        Number of folds to create\n    random_state : int\n        Random state for reproducibility\n        \n    Returns:\n    --------\n    pandas.DataFrame\n        Dataframe with added 'kfold' column\n    \"\"\"\n    \n    data = data.copy()\n    data[\"kfold\"] = -1\n    \n    num_bins = int(np.floor(1 + np.log2(len(data))))\n    print(f'Number of bins created: {num_bins}')\n    \n    data.loc[:, \"bins\"] = pd.cut(\n        data[target_col], \n        bins=num_bins, \n        labels=False,\n        duplicates='drop'\n    )\n    \n    kf = model_selection.StratifiedKFold(\n        n_splits=num_splits, \n        shuffle=True, \n        random_state=random_state\n    )\n    \n    for fold, (train_idx, val_idx) in enumerate(kf.split(X=data, y=data.bins.values)):\n        data.loc[val_idx, 'kfold'] = fold\n    \n    data = data.drop(\"bins\", axis=1)\n    \n    return data","metadata":{"_uuid":"31e022a7-d174-4bbc-9d10-55bd7e0a3f72","_cell_guid":"f5d95980-a91d-49fe-a0fe-b81d2cdd66bd","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-10-09T19:43:59.630398Z","iopub.execute_input":"2025-10-09T19:43:59.630638Z","iopub.status.idle":"2025-10-09T19:43:59.644414Z","shell.execute_reply.started":"2025-10-09T19:43:59.630610Z","shell.execute_reply":"2025-10-09T19:43:59.643496Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Loading dataset...\")\ndf = pd.read_csv(DATA_PATH)\n\nprint(f\"Dataset shape: {df.shape}\")\nprint(f\"Target distribution:\\n{df[TARGET_COL].value_counts()}\")\nprint(f\"Target value counts:\\n{df[TARGET_COL].value_counts(normalize=True)}\")\n\nprint(\"\\nDataset info:\")\nprint(df.info())\nprint(\"\\nFirst few rows:\")\ndf.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T19:43:59.645824Z","iopub.execute_input":"2025-10-09T19:43:59.646207Z","iopub.status.idle":"2025-10-09T19:43:59.758301Z","shell.execute_reply.started":"2025-10-09T19:43:59.646173Z","shell.execute_reply":"2025-10-09T19:43:59.757291Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Creating 5-fold splits...\")\ndf_5_folds = create_stratified_folds(df, target_col=TARGET_COL, num_splits=NUM_FOLDS_5)\n\nprint(\"5-fold splits created successfully!\")\nprint(f\"Fold distribution:\\n{df_5_folds['kfold'].value_counts().sort_index()}\")\n\nprint(\"\\nTarget distribution per fold (5-folds):\")\nfor fold in range(NUM_FOLDS_5):\n    fold_data = df_5_folds[df_5_folds['kfold'] == fold]\n    print(f\"Fold {fold}: {len(fold_data)} samples, \"\n          f\"Target mean: {fold_data[TARGET_COL].mean():.4f}, \"\n          f\"Positive samples: {fold_data[TARGET_COL].sum()}\")\n\ndf_5_folds.head()","metadata":{"_uuid":"1dd2ce8b-7c7e-4322-8bf0-38da23ca9bb3","_cell_guid":"e88ecea2-3dbf-4a21-9d63-37bd1aad2439","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-10-09T19:43:59.760819Z","iopub.execute_input":"2025-10-09T19:43:59.761194Z","iopub.status.idle":"2025-10-09T19:43:59.819084Z","shell.execute_reply.started":"2025-10-09T19:43:59.761150Z","shell.execute_reply":"2025-10-09T19:43:59.818027Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Creating 10-fold splits...\")\ndf_10_folds = create_stratified_folds(df, target_col=TARGET_COL, num_splits=NUM_FOLDS_10)","metadata":{"_uuid":"5c48ae44-0290-4725-81f5-b5c4052946ec","_cell_guid":"87cc506e-5e77-43d1-9ec3-e384e0f3ca77","trusted":true,"collapsed":false,"execution":{"iopub.status.busy":"2025-10-09T19:43:59.820334Z","iopub.execute_input":"2025-10-09T19:43:59.820581Z","iopub.status.idle":"2025-10-09T19:43:59.853386Z","shell.execute_reply.started":"2025-10-09T19:43:59.820552Z","shell.execute_reply":"2025-10-09T19:43:59.852218Z"},"jupyter":{"outputs_hidden":false}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"10-fold splits created successfully!\")\nprint(f\"Fold distribution:\\n{df_10_folds['kfold'].value_counts().sort_index()}\")","metadata":{"_uuid":"ceb4d9e3-20d7-4f67-9360-4707b4181bb6","_cell_guid":"dfd29e6a-2dec-41e7-9d17-7f6805939d2a","trusted":true,"collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2025-10-09T19:43:59.854632Z","iopub.execute_input":"2025-10-09T19:43:59.854915Z","iopub.status.idle":"2025-10-09T19:43:59.863290Z","shell.execute_reply.started":"2025-10-09T19:43:59.854856Z","shell.execute_reply":"2025-10-09T19:43:59.862346Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\nTarget distribution per fold (10-folds):\")\nfor fold in range(NUM_FOLDS_10):\n    fold_data = df_10_folds[df_10_folds['kfold'] == fold]\n    print(f\"Fold {fold}: {len(fold_data)} samples, \"\n          f\"Target mean: {fold_data[TARGET_COL].mean():.4f}, \"\n          f\"Positive samples: {fold_data[TARGET_COL].sum()}\")\n\ndf_10_folds.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T19:43:59.864525Z","iopub.execute_input":"2025-10-09T19:43:59.864737Z","iopub.status.idle":"2025-10-09T19:43:59.912962Z","shell.execute_reply.started":"2025-10-09T19:43:59.864714Z","shell.execute_reply":"2025-10-09T19:43:59.911944Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"output_5_folds = \"train_5folds.csv\"\noutput_10_folds = \"train_10folds.csv\"\n\ndf_5_folds.to_csv(output_5_folds, index=False)\ndf_10_folds.to_csv(output_10_folds, index=False)\n\nprint(\"Files saved successfully!\")\nprint(f\"5-fold data saved as: {output_5_folds}\")\nprint(f\"10-fold data saved as: {output_10_folds}\")\n\n# Verify file creation\nprint(f\"\\nFile sizes:\")\nprint(f\"5-folds file: {os.path.getsize(output_5_folds)} bytes\")\nprint(f\"10-folds file: {os.path.getsize(output_10_folds)} bytes\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T19:43:59.914256Z","iopub.execute_input":"2025-10-09T19:43:59.914480Z","iopub.status.idle":"2025-10-09T19:44:00.171979Z","shell.execute_reply.started":"2025-10-09T19:43:59.914454Z","shell.execute_reply":"2025-10-09T19:44:00.170997Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"=== SUMMARY STATISTICS ===\")\nprint(f\"Original dataset size: {len(df)}\")\nprint(f\"Original target mean: {df[TARGET_COL].mean():.4f}\")\nprint(f\"Original positive samples: {df[TARGET_COL].sum()}\")\n\nprint(f\"\\n5-Fold Configuration:\")\nprint(f\"Average samples per fold: {len(df_5_folds) / NUM_FOLDS_5:.1f}\")\nprint(f\"Fold sizes: {df_5_folds['kfold'].value_counts().sort_index().tolist()}\")\n\nprint(f\"\\n10-Fold Configuration:\")\nprint(f\"Average samples per fold: {len(df_10_folds) / NUM_FOLDS_10:.1f}\")\nprint(f\"Fold sizes: {df_10_folds['kfold'].value_counts().sort_index().tolist()}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T19:44:00.174558Z","iopub.execute_input":"2025-10-09T19:44:00.175119Z","iopub.status.idle":"2025-10-09T19:44:00.189204Z","shell.execute_reply.started":"2025-10-09T19:44:00.175067Z","shell.execute_reply":"2025-10-09T19:44:00.187595Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"target_mean_5folds = [df_5_folds[df_5_folds['kfold'] == fold][TARGET_COL].mean() for fold in range(NUM_FOLDS_5)]\ntarget_mean_10folds = [df_10_folds[df_10_folds['kfold'] == fold][TARGET_COL].mean() for fold in range(NUM_FOLDS_10)]\n\nprint(f\"\\nTarget mean across 5-folds: {target_mean_5folds}\")\nprint(f\"Target mean std (5-folds): {np.std(target_mean_5folds):.6f}\")\n\nprint(f\"\\nTarget mean across 10-folds: {[f'{x:.4f}' for x in target_mean_10folds]}\")\nprint(f\"Target mean std (10-folds): {np.std(target_mean_10folds):.6f}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T19:44:00.190495Z","iopub.execute_input":"2025-10-09T19:44:00.190704Z","iopub.status.idle":"2025-10-09T19:44:00.231185Z","shell.execute_reply.started":"2025-10-09T19:44:00.190679Z","shell.execute_reply":"2025-10-09T19:44:00.230300Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"=== VERIFICATION ===\")\nprint(f\"5-folds - Samples without fold assignment: {(df_5_folds['kfold'] == -1).sum()}\")\nprint(f\"10-folds - Samples without fold assignment: {(df_10_folds['kfold'] == -1).sum()}\")\n\nprint(f\"5-folds - Unique fold values: {sorted(df_5_folds['kfold'].unique())}\")\nprint(f\"10-folds - Unique fold values: {sorted(df_10_folds['kfold'].unique())}\")\n\nprint(f\"\\nOriginal samples preserved in 5-folds: {len(df_5_folds) == len(df)}\")\nprint(f\"Original samples preserved in 10-folds: {len(df_10_folds) == len(df)}\")\n\nprint(\"\\nFold creation completed successfully!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T19:44:00.232349Z","iopub.execute_input":"2025-10-09T19:44:00.232554Z","iopub.status.idle":"2025-10-09T19:44:00.242963Z","shell.execute_reply.started":"2025-10-09T19:44:00.232530Z","shell.execute_reply":"2025-10-09T19:44:00.241917Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"5-Fold Dataset Sample:\")\ndisplay(df_5_folds.head(10))\n\nprint(\"\\n10-Fold Dataset Sample:\")\ndisplay(df_10_folds.head(10))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T19:44:00.244101Z","iopub.execute_input":"2025-10-09T19:44:00.244317Z","iopub.status.idle":"2025-10-09T19:44:00.282846Z","shell.execute_reply.started":"2025-10-09T19:44:00.244291Z","shell.execute_reply":"2025-10-09T19:44:00.282015Z"}},"outputs":[],"execution_count":null}]}