{"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":"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\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\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","execution":{"iopub.status.busy":"2022-12-29T14:02:02.945426Z","iopub.execute_input":"2022-12-29T14:02:02.946803Z","iopub.status.idle":"2022-12-29T14:02:02.980469Z","shell.execute_reply.started":"2022-12-29T14:02:02.946682Z","shell.execute_reply":"2022-12-29T14:02:02.979391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**CHARGEMENT DE DONNEE**","metadata":{}},{"cell_type":"code","source":"import os\nimport pandas as pd\n\nbase_dir = \"/kaggle/input/emsi-5iir-ds\"\ntrain_file = \"train.csv\"\ntest_file = \"test.csv\"\n\ntrain_path = os.path.join(base_dir, train_file)\ntest_path = os.path.join(base_dir, test_file)\n\ntrain = pd.read_csv(train_path)\ntest = pd.read_csv(test_path)\n","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:04:35.940243Z","iopub.execute_input":"2022-12-29T14:04:35.940762Z","iopub.status.idle":"2022-12-29T14:04:54.344025Z","shell.execute_reply.started":"2022-12-29T14:04:35.940717Z","shell.execute_reply":"2022-12-29T14:04:54.342599Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**taille de donnee**","metadata":{}},{"cell_type":"code","source":"num_train_rows = len(train)\nnum_test_rows = len(test)\n\nprint(f\"Le nombre de lignes dans le jeu de données d'entraînement est {num_train_rows}.\")\nprint(f\"Le nombre de lignes dans le jeu de données de test est {num_test_rows}.\")","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:08:41.238728Z","iopub.execute_input":"2022-12-29T14:08:41.239267Z","iopub.status.idle":"2022-12-29T14:08:41.252230Z","shell.execute_reply.started":"2022-12-29T14:08:41.239229Z","shell.execute_reply":"2022-12-29T14:08:41.250855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"**VISULALISER LES DONNEES**","metadata":{}},{"cell_type":"code","source":"train.describe()","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:13:46.982731Z","iopub.execute_input":"2022-12-29T14:13:46.983651Z","iopub.status.idle":"2022-12-29T14:13:48.331793Z","shell.execute_reply.started":"2022-12-29T14:13:46.983609Z","shell.execute_reply":"2022-12-29T14:13:48.330409Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.describe()","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:14:16.028197Z","iopub.execute_input":"2022-12-29T14:14:16.028720Z","iopub.status.idle":"2022-12-29T14:14:17.166109Z","shell.execute_reply.started":"2022-12-29T14:14:16.028684Z","shell.execute_reply":"2022-12-29T14:14:17.165238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**INFO**","metadata":{}},{"cell_type":"code","source":"train.info()","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:16:02.438563Z","iopub.execute_input":"2022-12-29T14:16:02.439330Z","iopub.status.idle":"2022-12-29T14:16:02.586521Z","shell.execute_reply.started":"2022-12-29T14:16:02.439260Z","shell.execute_reply":"2022-12-29T14:16:02.584864Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**TYPE DE DONNEE**   dtypes: float64(16), int64(16), object(1)","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"test.info()","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:16:12.521682Z","iopub.execute_input":"2022-12-29T14:16:12.522151Z","iopub.status.idle":"2022-12-29T14:16:12.626383Z","shell.execute_reply.started":"2022-12-29T14:16:12.522114Z","shell.execute_reply":"2022-12-29T14:16:12.625003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**TYPE DE DONNEE** dtypes: float64(16), int64(15), object(1)","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"**VERIFICATION SI IL YA DES VALEURS MANQUANTES**","metadata":{}},{"cell_type":"code","source":"\nhas_missing_values_train = train.isnull().values.any()\nprint(f\"Le jeu de données d'entraînement a-t-il des valeurs manquantes? {has_missing_values_train}\")\n\n\nhas_missing_values_test = test.isnull().values.any()\nprint(f\"Le jeu de données de test a-t-il des valeurs manquantes? {has_missing_values_test}\")","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:22:42.745542Z","iopub.execute_input":"2022-12-29T14:22:42.746559Z","iopub.status.idle":"2022-12-29T14:22:42.943302Z","shell.execute_reply.started":"2022-12-29T14:22:42.746513Z","shell.execute_reply":"2022-12-29T14:22:42.941870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**transformation des features**","metadata":{}},{"cell_type":"code","source":"# Traiter les features des jeux de données d'entraînement et de test\nfor df in [train, test]:\n    # Ajouter les colonnes 'ch0' à 'ch9'\n    for i in range(10):\n        df[f'ch{i}'] = df.f_27.apply(lambda s: ord(s[i]) - ord('A'))\n    # Ajouter la colonne 'unique_characters'\n    df[\"unique_characters\"] = df.f_27.apply(lambda s: len(set(s)))\n\n# Sélectionner les colonnes du jeu de données de test, à l'exception de 'id' et 'f_27'\nfeatures = test.columns.difference(['id', 'f_27'])\n\n# Afficher les deux premières lignes du sous-ensemble de colonnes sélectionnées\nprint(test[features].head(2))\n","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:28:41.647100Z","iopub.execute_input":"2022-12-29T14:28:41.647606Z","iopub.status.idle":"2022-12-29T14:28:51.567042Z","shell.execute_reply.started":"2022-12-29T14:28:41.647570Z","shell.execute_reply":"2022-12-29T14:28:51.565905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**préparations des données d'entraînement et de test pour l'entraînement d'un modèle de machine learning.**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n\n# Sélectionner les colonnes 'target' et 'f_27' du jeu de données d'entraînement\ny = train['target']\n\n\n# Afficher les dimensions des jeux de données d'entraînement et de test\nprint(f\"Dimensions du jeu de données d'entraînement: {X.shape}\")\nprint(f\"Dimensions du jeu de données de test: {test.shape}\")\n","metadata":{"execution":{"iopub.status.busy":"2022-12-29T17:09:47.650234Z","iopub.execute_input":"2022-12-29T17:09:47.650830Z","iopub.status.idle":"2022-12-29T17:09:47.666566Z","shell.execute_reply.started":"2022-12-29T17:09:47.650756Z","shell.execute_reply":"2022-12-29T17:09:47.665187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**découper le jeu de données d'entraînement en sous-ensembles de validation et d'entraînement**","metadata":{}},{"cell_type":"code","source":"# Importer la classe StratifiedKFold de scikit-learn\nfrom sklearn.model_selection import StratifiedKFold\n\n# Définir un objet StratifiedKFold avec 5 plis et un mélange aléatoire des observations\nskf = StratifiedKFold(n_splits=2, shuffle=True, random_state=42)\n\n# Découper le jeu de données d'entraînement en 5 sous-ensembles de validation et d'entraînement\nfor train_index, val_index in skf.split(X, y):\n    # Sélectionner les observations d'entraînement et de validation\n    X_train, X_val = X.iloc[train_index], X.iloc[val_index]\n    y_train, y_val = y.iloc[train_index], y.iloc[val_index]\n","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:49:12.811745Z","iopub.execute_input":"2022-12-29T14:49:12.812301Z","iopub.status.idle":"2022-12-29T14:49:13.562489Z","shell.execute_reply.started":"2022-12-29T14:49:12.812259Z","shell.execute_reply":"2022-12-29T14:49:13.561317Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**évaluer la performance du modèle**","metadata":{}},{"cell_type":"code","source":"# Importer la classe LGBMClassifier de lightgbm\nfrom lightgbm import LGBMClassifier\n\n# Importer la fonction roc_auc_score de scikit-learn\nfrom sklearn.metrics import roc_auc_score\n\n# Importer la classe train_test_split de scikit-learn\nfrom sklearn.model_selection import train_test_split\n\n# Séparer le jeu de données d'entraînement en un jeu de données d'entraînement et un jeu de données de validation\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)\n\n# Instancier un modèle LGBMClassifier\nmodel = LGBMClassifier()\n\n# Entraîner le modèle sur le jeu de données d'entraînement\nmodel.fit(X_train, y_train)\n\n# Évaluer la performance du modèle sur le jeu de données d'entraînement\ntrain_score = model.score(X_train, y_train)\nprint(\"Score d'entraînement :\", train_score)\n\n# Évaluer la performance du modèle sur le jeu de données de validation\npred_y_test = model.predict(X_test)\nval_score = roc_auc_score(y_test, pred_y_test)\nprint(\"Score de validation :\", val_score)\n","metadata":{"execution":{"iopub.status.busy":"2022-12-29T14:59:48.119019Z","iopub.execute_input":"2022-12-29T14:59:48.120300Z","iopub.status.idle":"2022-12-29T14:59:58.779279Z","shell.execute_reply.started":"2022-12-29T14:59:48.120249Z","shell.execute_reply":"2022-12-29T14:59:58.778069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\n# sorted(zip(clf.feature_importances_, X.columns), reverse=True)\nfeature_imp = pd.DataFrame(sorted(zip(model.feature_importances_,X.columns)), columns=['Value','Feature'])\n\nplt.figure(figsize=(20, 10))\nsns.barplot(x=\"Value\", y=\"Feature\", data=feature_imp.sort_values(by=\"Value\", ascending=False))\nplt.title('LightGBM Features (avg over folds)')\nplt.tight_layout()\nplt.show()\nplt.savefig('lgbm_importances-01.png')","metadata":{"execution":{"iopub.status.busy":"2022-12-29T15:34:45.993661Z","iopub.execute_input":"2022-12-29T15:34:45.994166Z","iopub.status.idle":"2022-12-29T15:34:46.608966Z","shell.execute_reply.started":"2022-12-29T15:34:45.994116Z","shell.execute_reply":"2022-12-29T15:34:46.607668Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Trier les valeurs d'importance des features par ordre décroissant\nfeature_imp = feature_imp.sort_values(by=\"Value\", ascending=False)\nfeature_imp\n# Afficher le contenu de la variable feature_imp à l'écran\nprint(feature_imp)","metadata":{"execution":{"iopub.status.busy":"2022-12-29T15:56:04.251821Z","iopub.execute_input":"2022-12-29T15:56:04.252687Z","iopub.status.idle":"2022-12-29T15:56:04.262893Z","shell.execute_reply.started":"2022-12-29T15:56:04.252646Z","shell.execute_reply":"2022-12-29T15:56:04.261606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Sélectionner les 6 premières lignes du DataFrame feature_imp et extraire la colonne \"Feature\"\ntop_6_features = feature_imp.iloc[:6]['Feature']\n\n# Convertir le résultat en liste et stocker la liste dans la variable \"selected_features\"\nselected_features = top_6_features.tolist()\n\n# Afficher le contenu de la variable \"selected_features\" à l'écran\nprint(selected_features)","metadata":{"execution":{"iopub.status.busy":"2022-12-29T15:56:10.962570Z","iopub.execute_input":"2022-12-29T15:56:10.963007Z","iopub.status.idle":"2022-12-29T15:56:10.970828Z","shell.execute_reply.started":"2022-12-29T15:56:10.962974Z","shell.execute_reply":"2022-12-29T15:56:10.969404Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X.shape, test.shape","metadata":{"execution":{"iopub.status.busy":"2022-12-29T15:56:14.735481Z","iopub.execute_input":"2022-12-29T15:56:14.735889Z","iopub.status.idle":"2022-12-29T15:56:14.745013Z","shell.execute_reply.started":"2022-12-29T15:56:14.735857Z","shell.execute_reply":"2022-12-29T15:56:14.743560Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**ajouter des features**","metadata":{}},{"cell_type":"code","source":"def add_basics_features(data, features):\n    \n    for feature in features:\n    \n        \n        new_feature_name = str(feature) + '_mean'\n        data[new_feature_name] = data[feature].mean()\n        \n        new_feature_name = str(feature) + '_std'\n        data[new_feature_name] = data[feature].std()\n        \n        new_feature_name = str(feature) + '_max_min'\n        data[new_feature_name] = data[feature].max() - data[feature].min()\n    \n    return data","metadata":{"execution":{"iopub.status.busy":"2022-12-29T16:14:16.217913Z","iopub.execute_input":"2022-12-29T16:14:16.218345Z","iopub.status.idle":"2022-12-29T16:14:16.225699Z","shell.execute_reply.started":"2022-12-29T16:14:16.218302Z","shell.execute_reply":"2022-12-29T16:14:16.224293Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Ajouter la colonne 'target' au DataFrame 'X' à partir de la série 'y'\nX['target'] = y\n\n# Ajouter la colonne 'target' au DataFrame 'test'\ntest['target'] = 0\n","metadata":{"execution":{"iopub.status.busy":"2022-12-29T16:36:16.373427Z","iopub.execute_input":"2022-12-29T16:36:16.374286Z","iopub.status.idle":"2022-12-29T16:36:16.388830Z","shell.execute_reply.started":"2022-12-29T16:36:16.374247Z","shell.execute_reply":"2022-12-29T16:36:16.386873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = add_basics_features(X, selected_features)\ntest = add_basics_features(test, selected_features)\n\nX.shape, test.shape","metadata":{"execution":{"iopub.status.busy":"2022-12-29T16:36:19.823111Z","iopub.execute_input":"2022-12-29T16:36:19.823546Z","iopub.status.idle":"2022-12-29T16:36:20.129961Z","shell.execute_reply.started":"2022-12-29T16:36:19.823508Z","shell.execute_reply":"2022-12-29T16:36:20.128662Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**La validation croiséeou \"cross-validation\" **","metadata":{}},{"cell_type":"code","source":"# Vérifier le nombre de features du jeu de données de test\nn_features_test = test.shape[1]\n\n# Vérifier le nombre de features utilisé pour entraîner le modèle\nn_features_model = model.n_features_\n\n# Vérifier si les deux valeurs sont égales\nif n_features_test == n_features_model:\n    print(\"Le nombre de features du jeu de données de test correspond au nombre de features utilisé pour entraîner le modèle.\")\nelse:\n    print(\"Le nombre de features du jeu de données de test ne correspond pas au nombre de features utilisé pour entraîner le modèle.\")\n    print( n_features_model)\n    print (n_features_test)","metadata":{"execution":{"iopub.status.busy":"2022-12-29T16:37:05.705201Z","iopub.execute_input":"2022-12-29T16:37:05.705659Z","iopub.status.idle":"2022-12-29T16:37:05.713694Z","shell.execute_reply.started":"2022-12-29T16:37:05.705621Z","shell.execute_reply":"2022-12-29T16:37:05.712386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Initialiser l'objet de validation croisée\nkf = StratifiedKFold(n_splits=60, shuffle=True, random_state=0)\n\n# Initialiser une liste pour stocker les prédictions du modèle sur le jeu de données de test\ny_predict = []\n\n# Pour chaque pli de la validation croisée\nfor fold, (train_index, val_index) in enumerate(kf.split(X, y)):\n    print(f\"Pli {fold} :\")\n    \n    # Séparer les données en conjoint d'entraînement et de validation\n    X_train, X_val = X.loc[train_index], X.loc[val_index]\n    y_train, y_val = y.loc[train_index], y.loc[val_index]\n    \n    # Créer le modèle\n    model = LGBMClassifier()\n    \n    # Entraîner le modèle sur le conjoint d'entraînement\n    model.fit(X_train, y_train)\n    \n    # Faire des prédictions sur le conjoint de validation\n    y_pred = model.predict_proba(X_val)[:, 1]\n    \n    # Faire des prédictions sur le jeu de données de test\n    y_predict.append(model.predict_proba(test)[:, 1])\n    \n    # Évaluer le modèle sur le conjoint de validation\n    print(f\"Score d'entraînement : {model.score(X_train, y_train)}\")\n    print(f\"Score ROC-AUC : {roc_auc_score(y_val, y_pred)}\")\n    \n    # Libérer la mémoire\n    del X_train, y_train, model, X_val, y_val, y_pred\n    gc.collect()","metadata":{"execution":{"iopub.status.busy":"2022-12-29T16:40:51.109232Z","iopub.execute_input":"2022-12-29T16:40:51.109734Z","iopub.status.idle":"2022-12-29T16:41:05.770099Z","shell.execute_reply.started":"2022-12-29T16:40:51.109692Z","shell.execute_reply":"2022-12-29T16:41:05.767745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.read_csv(\"/kaggle/input/emsi-5iir-ds/sample_submission.csv\")\nsubmission.shape","metadata":{"execution":{"iopub.status.busy":"2022-12-29T17:10:16.524288Z","iopub.execute_input":"2022-12-29T17:10:16.524909Z","iopub.status.idle":"2022-12-29T17:10:16.807828Z","shell.execute_reply.started":"2022-12-29T17:10:16.524856Z","shell.execute_reply":"2022-12-29T17:10:16.806300Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n\n# Define y_predict\ny_predict = [1, 2, 3, 4]\n\n# Create a new dataframe and assign it to submission\nsubmission = pd.DataFrame()\n\n# Check if y_predict is empty or contains only nan values\nif len(y_predict) == 0 or np.isnan(y_predict).all():\n    submission['target'] = 0\nelse:\n    submission['target'] = np.array(y_predict).mean(axis=0)\n\nsubmission.to_csv('submission.csv', index=False)\nsubmission","metadata":{"execution":{"iopub.status.busy":"2022-12-29T18:10:58.341865Z","iopub.execute_input":"2022-12-29T18:10:58.342329Z","iopub.status.idle":"2022-12-29T18:10:58.382854Z","shell.execute_reply.started":"2022-12-29T18:10:58.342294Z","shell.execute_reply":"2022-12-29T18:10:58.381726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}}]}