{"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,"isSourceIdPinned":false}],"dockerImageVersionId":31329,"isInternetEnabled":true,"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.preprocessing import LabelEncoder\n\n#Φόρτωση δεδομένων και προετοιμασία\ndf = pd.read_csv('/kaggle/input/competitions/state-farm-distracted-driver-detection/driver_imgs_list.csv')\n\n#Ορισμός των τριών οδηγών που προκαλούν το leakage εδώ\ntest_drivers = ['p014', 'p051', 'p072']\n\n#Μετατροπή των labels σε αριθμητικές τιμές\nle_class = LabelEncoder()\ndf['target'] = le_class.fit_transform(df['classname'])","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-05-07T20:33:12.559233Z","iopub.execute_input":"2026-05-07T20:33:12.559583Z","iopub.status.idle":"2026-05-07T20:33:12.586760Z","shell.execute_reply.started":"2026-05-07T20:33:12.559558Z","shell.execute_reply":"2026-05-07T20:33:12.586201Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-07T20:33:12.588150Z","iopub.execute_input":"2026-05-07T20:33:12.588497Z","iopub.status.idle":"2026-05-07T20:33:12.596754Z","shell.execute_reply.started":"2026-05-07T20:33:12.588473Z","shell.execute_reply":"2026-05-07T20:33:12.596234Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#τύπου CNN που κάνει overfitting στους οδηγούς\ndf['driver_feature'] = LabelEncoder().fit_transform(df['subject'])\nX = df[['driver_feature']] \ny = df['target']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-07T20:33:12.597558Z","iopub.execute_input":"2026-05-07T20:33:12.597844Z","iopub.status.idle":"2026-05-07T20:33:12.612851Z","shell.execute_reply.started":"2026-05-07T20:33:12.597815Z","shell.execute_reply":"2026-05-07T20:33:12.612219Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Validation Splitt Strategies\nseeds = [1, 42, 123, 555, 2024]\nval_acc1, test_acc1 = [], []\nval_acc2, test_acc2 = [], []","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-07T20:33:12.614421Z","iopub.execute_input":"2026-05-07T20:33:12.614670Z","iopub.status.idle":"2026-05-07T20:33:12.625065Z","shell.execute_reply.started":"2026-05-07T20:33:12.614650Z","shell.execute_reply":"2026-05-07T20:33:12.624528Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for seed in seeds:\n    #Strategy 1: Random Split\n    # Οι οδηγοί p014, p051, p072 υπάρχουν ΚΑΙ στα δύο sets\n    from sklearn.model_selection import train_test_split\n    X_train1, X_val1, y_train1, y_val1 = train_test_split(X, y, test_size=0.2, random_state=seed)\n    \n    clf1 = RandomForestClassifier(n_estimators=10, random_state=seed)\n    clf1.fit(X_train1, y_train1)\n    acc1 = accuracy_score(y_val1, clf1.predict(X_val1))\n    val_acc1.append(acc1)\n    test_acc1.append(acc1)\n    #Τπερβολικά Υψηλή ακρίβεια, ψευδές στην πραγματικότητα, αφού το μοντέλο έχει απλά εκαιδευτεί σε αυτά τα δεδομένα ακριβώς","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-07T20:33:12.625948Z","iopub.execute_input":"2026-05-07T20:33:12.626234Z","iopub.status.idle":"2026-05-07T20:33:12.874607Z","shell.execute_reply.started":"2026-05-07T20:33:12.626203Z","shell.execute_reply":"2026-05-07T20:33:12.874021Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"    #Strategy 2: Group Split by Drivr\n    # Απομονώνουμε πλήρως τους οδηγούς 14, 51, 72 στο test/val set\n    train_mask = ~df['subject'].isin(test_drivers)\n    test_mask = df['subject'].isin(test_drivers)\n    \n    X_train2, y_train2 = X[train_mask], y[train_mask]\n    X_val2, y_val2 = X[test_mask], y[test_mask]\n    \n    clf2 = RandomForestClassifier(n_estimators=10, random_state=seed)\n    clf2.fit(X_train2, y_train2)\n    acc2 = accuracy_score(y_val2, clf2.predict(X_val2))\n    val_acc2.append(acc2)\n    test_acc2.append(acc2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-07T20:33:12.875449Z","iopub.execute_input":"2026-05-07T20:33:12.875731Z","iopub.status.idle":"2026-05-07T20:33:12.928827Z","shell.execute_reply.started":"2026-05-07T20:33:12.875694Z","shell.execute_reply":"2026-05-07T20:33:12.928332Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Υπολογισμός Μέσων Όρων\nav_val_acc1 = np.mean(val_acc1)\nav_test_acc1 = np.mean(test_acc1)\nav_val_acc2 = np.mean(val_acc2)\nav_test_acc2 = np.mean(test_acc2)\n\n#ΕΛΑΧΙΣΤΟ ΑΠΑΙΤΟΥΜΕΝΟ OUTPUT\nprint(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-07T20:33:12.929721Z","iopub.execute_input":"2026-05-07T20:33:12.930419Z","iopub.status.idle":"2026-05-07T20:33:12.935133Z","shell.execute_reply.started":"2026-05-07T20:33:12.930391Z","shell.execute_reply":"2026-05-07T20:33:12.934442Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#strtg 2: πιο χαμηλή αλλά και πιο ρεαλιστική ακρίβεια του πως θα λειτουργούσε το μοντέλο μας στην πραγματικότητα","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-07T20:33:12.936595Z","iopub.execute_input":"2026-05-07T20:33:12.936858Z","iopub.status.idle":"2026-05-07T20:33:12.949743Z","shell.execute_reply.started":"2026-05-07T20:33:12.936838Z","shell.execute_reply":"2026-05-07T20:33:12.949044Z"}},"outputs":[],"execution_count":null}]}