{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":5048,"databundleVersionId":868335}],"dockerImageVersionId":31328,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score\nfrom sklearn.model_selection import train_test_split\ndata = pd.read_csv('/kaggle/input/competitions/state-farm-distracted-driver-detection/driver_imgs_list.csv')\n\n# Ονομασίες οδηγών για το group split\ntarget_subjects = ['p014', 'p051', 'p072']\n\n# Μετατροπή των κατηγοριών (c0, c1...) σε αριθμούς\ntarget_map = {name: idx for idx, name in enumerate(sorted(data['classname'].unique()))}\ndata['target_label'] = data['classname'].map(target_map)\n\n#features\ndata['subject_id'] = data['subject'].astype('category').cat.codes\nfeatures = data[['subject_id']]\nlabels = data['target_label']\n\nruns = [10, 20, 30, 40, 50] \nscores_random = []\nscores_group = []\n\nfor s in runs:\n    # ΣΤΡΑΤΗΓΙΚΗ A\n    x_train_a, x_val_a, y_train_a, y_val_a = train_test_split(\n        features, labels, test_size=0.20, random_state=s\n    )\n    \n    model_a = RandomForestClassifier(n_estimators=15, random_state=s)\n    model_a.fit(x_train_a, y_train_a)\n    acc_a = accuracy_score(y_val_a, model_a.predict(x_val_a))\n    scores_random.append(acc_a)\n\n    # ΣΤΡΑΤΗΓΙΚΗ B\n    is_test = data['subject'].isin(target_subjects)\n    \n    x_train_b, y_train_b = features[~is_test], labels[~is_test]\n    x_val_b, y_val_b = features[is_test], labels[is_test]\n    \n    model_b = RandomForestClassifier(n_estimators=15, random_state=s)\n    model_b.fit(x_train_b, y_train_b)\n    acc_b = accuracy_score(y_val_b, model_b.predict(x_val_b))\n    scores_group.append(acc_b)\n\n#ΜΟ\nav_val_acc1 = np.mean(scores_random)\nav_test_acc1 = av_val_acc1  # Στο random split το val/test ταυτίζονται εννοιολογικά\nav_val_acc2 = np.mean(scores_group)\nav_test_acc2 = av_val_acc2  # Στο group split η αξιολόγηση γίνεται στους test_drivers","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-05-08T12:16:40.461715Z","iopub.execute_input":"2026-05-08T12:16:40.462274Z","iopub.status.idle":"2026-05-08T12:16:41.137526Z","shell.execute_reply.started":"2026-05-08T12:16:40.462243Z","shell.execute_reply":"2026-05-08T12:16:41.136891Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Val accuracy 1: {av_val_acc1:.4f}\")\nprint(f\"Test accuracy 1: {av_test_acc1:.4f}\")\nprint(f\"Val accuracy 2: {av_val_acc2:.4f}\")\nprint(f\"Test accuracy 2: {av_test_acc2:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-08T12:16:41.138806Z","iopub.execute_input":"2026-05-08T12:16:41.139238Z","iopub.status.idle":"2026-05-08T12:16:41.143942Z","shell.execute_reply.started":"2026-05-08T12:16:41.139206Z","shell.execute_reply":"2026-05-08T12:16:41.143127Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ΣΑ ->>>Προκαλεί leakage γιατί οι οδηγοί 14, 51, 72 μοιράζονται στα δύο sets\n# ΣΒ ->>>Οι 14, 51, 72 απομονώνονται ΠΛΗΡΩς στο validation set","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-08T12:16:41.145019Z","iopub.execute_input":"2026-05-08T12:16:41.145575Z","iopub.status.idle":"2026-05-08T12:16:41.161104Z","shell.execute_reply.started":"2026-05-08T12:16:41.145549Z","shell.execute_reply":"2026-05-08T12:16:41.160362Z"}},"outputs":[],"execution_count":null}]}