{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":31012,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier, RandomForestRegressor, AdaBoostClassifier, AdaBoostRegressor, GradientBoostingClassifier, GradientBoostingRegressor, HistGradientBoostingClassifier, HistGradientBoostingRegressor \nfrom sklearn.svm import SVC, SVR\nfrom sklearn.metrics import accuracy_score, roc_auc_score, mean_absolute_percentage_error, mean_squared_error, f1_score\n\n#import sklearn\n#sklearn.set_config(transform_output=\"pandas\")\n\nimport tensorflow as tf\nimport tensorflow.keras.backend as K\nimport tensorflow.keras.layers as L\nimport tensorflow.keras.models as M\nimport tensorflow.keras.callbacks as C\n\nimport lightgbm\nfrom lightgbm.sklearn import LGBMRegressor, LGBMClassifier\nfrom catboost import CatBoostRegressor, CatBoostClassifier, Pool\nimport xgboost as xgb\n\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-04-17T13:22:23.396337Z","iopub.execute_input":"2025-04-17T13:22:23.397309Z","iopub.status.idle":"2025-04-17T13:22:23.413588Z","shell.execute_reply.started":"2025-04-17T13:22:23.397256Z","shell.execute_reply":"2025-04-17T13:22:23.412662Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 1. On charge le jeu de données\ndf_train = pd.read_csv(\"/kaggle/input/digit-recognizer/train.csv\")\nsub = pd.read_csv(\"/kaggle/input/digit-recognizer/sample_submission.csv\")\ndf_test = pd.read_csv(\"/kaggle/input/digit-recognizer/test.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-17T13:28:51.700886Z","iopub.execute_input":"2025-04-17T13:28:51.701836Z","iopub.status.idle":"2025-04-17T13:28:54.458654Z","shell.execute_reply.started":"2025-04-17T13:28:51.701805Z","shell.execute_reply":"2025-04-17T13:28:54.457838Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-17T13:28:57.994945Z","iopub.execute_input":"2025-04-17T13:28:57.996028Z","iopub.status.idle":"2025-04-17T13:28:58.028616Z","shell.execute_reply.started":"2025-04-17T13:28:57.995998Z","shell.execute_reply":"2025-04-17T13:28:58.027645Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"LABEL = \"label\"\nFEATURES = [c for c in df_train.columns if c != LABEL]\nX_sub_test = df_test[FEATURES]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-17T13:29:00.662828Z","iopub.execute_input":"2025-04-17T13:29:00.663144Z","iopub.status.idle":"2025-04-17T13:29:00.668423Z","shell.execute_reply.started":"2025-04-17T13:29:00.663122Z","shell.execute_reply":"2025-04-17T13:29:00.667373Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = df_train[FEATURES]\ny = df_train[LABEL]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-17T13:29:03.241816Z","iopub.execute_input":"2025-04-17T13:29:03.242097Z","iopub.status.idle":"2025-04-17T13:29:03.361258Z","shell.execute_reply.started":"2025-04-17T13:29:03.242078Z","shell.execute_reply":"2025-04-17T13:29:03.360375Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Faire train_test_split\n\n# Faire train_test_split\n\n# On sépare le jeu de données en deux sous-ensembles : entraînement et test\n#  – 80 % des observations serviront à l’entraînement (X_train, y_train)\n#  – 20 % des observations serviront à l’évaluation (X_test, y_test)\nX_train, X_test, y_train, y_test = train_test_split(\n    X,                      # toutes les features (pixels)\n    y,                      # labels (chiffres 0–9)\n    test_size=0.2,          # 20 % du jeu de données pour le test\n    random_state=42,        # graine aléatoire fixe pour reproductibilité\n    stratify=y              # on conserve la même répartition de chaque classe\n)\n\n# Vérifions rapidement les dimensions des jeux constitués\nprint(\"X_train :\", X_train.shape)\nprint(\"X_test  :\", X_test.shape)\nprint(\"y_train :\", y_train.shape)\nprint(\"y_test  :\", y_test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-17T13:29:05.705456Z","iopub.execute_input":"2025-04-17T13:29:05.705843Z","iopub.status.idle":"2025-04-17T13:29:05.951882Z","shell.execute_reply.started":"2025-04-17T13:29:05.705816Z","shell.execute_reply":"2025-04-17T13:29:05.950981Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# TEster plusieurs modèles\n\n# On définit plusieurs modèles à tester (avec la même seed pour être sûrs de nos splits)\nmodeles = {\n    #\"Random Forest\":              RandomForestClassifier(random_state=42),\n    #\"AdaBoost\":                   AdaBoostClassifier(random_state=42),\n    #\"Gradient Boosting\":          GradientBoostingClassifier(random_state=42),\n    #\"HistGradientBoosting\":       HistGradientBoostingClassifier(random_state=42),\n    \"SVM\":                        SVC(probability=True, random_state=42, max_iter=1000),\n    #\"LightGBM\":                   LGBMClassifier(random_state=42),\n}\n\n# Là, on va enregistrer les scores pour chaque modèle\nresultats = {}\n\nfor nom, modele in modeles.items():\n    # Entraînement sur les données d'entraînement\n    modele.fit(X_train, y_train)\n    \n    # Prédiction des labels et des probabilités sur le set de test\n    preds = modele.predict(X_test)\n    probs = modele.predict_proba(X_test)\n    \n    # 1. Accuracy\n    #    Donne un aperçu global du taux de bonnes classifications.\n    #    Très intuitive, mais peut être trompeuse si les classes sont déséquilibrées.\n    acc = accuracy_score(y_test, preds)\n    \n    # 2. F1 score (moyenne pondérée)\n    #    Combine précision et rappel pour chaque classe :\n    #      • précision = TP / (TP + FP) – fiabilité des prédictions positives\n    #      • rappel    = TP / (TP + FN) – capacité à retrouver tous les positifs\n    #    Le F1 pondéré s'assure qu'aucune classe minoritaire ne soit totalement ignorée.\n    f1 = f1_score(y_test, preds, average=\"weighted\")\n    \n    # 3. ROC AUC (one‑vs‑rest)\n    #    Mesure l’aptitude du modèle à classer correctement les exemples\n    #    quel que soit le seuil de décision. Utile pour comparer des modèles\n    #    sur leur qualité de score probabiliste.\n    roc = roc_auc_score(y_test, probs, multi_class=\"ovr\")\n    \n    # Stockage des scores\n    resultats[nom] = {\n        \"accuracy\": acc,\n        \"f1_score\": f1,\n        \"roc_auc\": roc\n    }\n    \n    # Affichage résumé\n    print(f\"{nom} → Accuracy : {acc:.4f} | F1 score : {f1:.4f} | ROC AUC : {roc:.4f}\")\n\n    # Submission pour la competition\n    sub[\"Label\"] = modele.predict(X_sub_test)\n    sub.to_csv(\"submission.csv\", index=False)\n\n# 6. Classement des modèles par accuracy\nres_df = pd.DataFrame(resultats).T.sort_values(\"accuracy\", ascending=False)\nprint(\"\\n=== Classement des modèles par accuracy ===\")\nprint(res_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-17T13:29:10.164600Z","iopub.execute_input":"2025-04-17T13:29:10.164900Z","iopub.status.idle":"2025-04-17T14:13:42.609854Z","shell.execute_reply.started":"2025-04-17T13:29:10.164880Z","shell.execute_reply":"2025-04-17T14:13:42.608192Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-04-17T14:13:42.610632Z","iopub.status.idle":"2025-04-17T14:13:42.610949Z","shell.execute_reply.started":"2025-04-17T14:13:42.610809Z","shell.execute_reply":"2025-04-17T14:13:42.610823Z"}},"outputs":[],"execution_count":null}]}