{"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":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"raw","source":"import numpy as np \nimport pandas as pd \n\nimport os\nimport optuna\nimport gc\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-01-02T21:31:18.479973Z","iopub.execute_input":"2023-01-02T21:31:18.480288Z","iopub.status.idle":"2023-01-02T21:31:18.807526Z","shell.execute_reply.started":"2023-01-02T21:31:18.480214Z","shell.execute_reply":"2023-01-02T21:31:18.806660Z"}}},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/emsi-5iir-ds/train.csv\")\ntest = pd.read_csv(\"/kaggle/input/emsi-5iir-ds/test.csv\")\n#loading data ","metadata":{"execution":{"iopub.status.busy":"2023-01-02T21:31:32.592565Z","iopub.execute_input":"2023-01-02T21:31:32.592914Z","iopub.status.idle":"2023-01-02T21:31:45.775036Z","shell.execute_reply.started":"2023-01-02T21:31:32.592884Z","shell.execute_reply":"2023-01-02T21:31:45.774195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.shape\n#listing the dimensions of the dataset : le nombre de lignes et colonnes","metadata":{"execution":{"iopub.status.busy":"2023-01-02T21:33:15.162647Z","iopub.execute_input":"2023-01-02T21:33:15.163010Z","iopub.status.idle":"2023-01-02T21:33:15.170040Z","shell.execute_reply.started":"2023-01-02T21:33:15.162980Z","shell.execute_reply":"2023-01-02T21:33:15.169374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.shape\n#listing the dimensions of the dataset : le nombre de lignes et colonnes","metadata":{"execution":{"iopub.status.busy":"2023-01-02T21:33:23.151734Z","iopub.execute_input":"2023-01-02T21:33:23.152106Z","iopub.status.idle":"2023-01-02T21:33:23.157695Z","shell.execute_reply.started":"2023-01-02T21:33:23.152079Z","shell.execute_reply":"2023-01-02T21:33:23.156813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.describe()\n#visualisation des donnees du dataset d'entrainement ","metadata":{"execution":{"iopub.status.busy":"2023-01-02T21:35:49.389435Z","iopub.execute_input":"2023-01-02T21:35:49.389744Z","iopub.status.idle":"2023-01-02T21:35:50.149718Z","shell.execute_reply.started":"2023-01-02T21:35:49.389720Z","shell.execute_reply":"2023-01-02T21:35:50.148627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.describe()\n#visualisation des données du dataset du test ","metadata":{"execution":{"iopub.status.busy":"2023-01-02T21:37:22.641340Z","iopub.execute_input":"2023-01-02T21:37:22.641652Z","iopub.status.idle":"2023-01-02T21:37:23.215982Z","shell.execute_reply.started":"2023-01-02T21:37:22.641628Z","shell.execute_reply":"2023-01-02T21:37:23.215114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.info()\n#la methode info() fournit un resume sur les donnees contenu dans un dataframe pandas,tel que : le nom et le type de chaque colonne, le nombre de valeurs non manquantes pour chaque colonne et le nombre d'utilisation du dataframe en question ","metadata":{"execution":{"iopub.status.busy":"2023-01-02T21:44:26.274952Z","iopub.execute_input":"2023-01-02T21:44:26.275305Z","iopub.status.idle":"2023-01-02T21:44:26.346970Z","shell.execute_reply.started":"2023-01-02T21:44:26.275276Z","shell.execute_reply":"2023-01-02T21:44:26.345669Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.info()","metadata":{"execution":{"iopub.status.busy":"2023-01-02T21:51:31.893894Z","iopub.execute_input":"2023-01-02T21:51:31.894293Z","iopub.status.idle":"2023-01-02T21:51:32.002327Z","shell.execute_reply.started":"2023-01-02T21:51:31.894259Z","shell.execute_reply":"2023-01-02T21:51:32.001133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.isna().sum().any()","metadata":{"execution":{"iopub.status.busy":"2023-01-02T21:56:40.899632Z","iopub.execute_input":"2023-01-02T21:56:40.900897Z","iopub.status.idle":"2023-01-02T21:56:40.962275Z","shell.execute_reply.started":"2023-01-02T21:56:40.900850Z","shell.execute_reply":"2023-01-02T21:56:40.961337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.isna().sum().any()","metadata":{"execution":{"iopub.status.busy":"2023-01-02T21:56:55.393526Z","iopub.execute_input":"2023-01-02T21:56:55.393905Z","iopub.status.idle":"2023-01-02T21:56:55.446977Z","shell.execute_reply.started":"2023-01-02T21:56:55.393876Z","shell.execute_reply":"2023-01-02T21:56:55.445987Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features = [col for col in test.columns if col not in ['id', 'f_27']]\n\nfor df in [train, test]:\n    df['unique_characters'] = df['f_27'].apply(lambda s: len(set(s)))\n    for i in range(10):\n        df[f'ch{i}'] = df['f_27'].str[i].apply(lambda ch: ord(ch) - ord('A'))\n\ntest[features].head(2)\n\n#Ce code effectue les opérations suivantes :\n\n#Crée une liste appelée fonctionnalités qui se compose de tous les noms de colonne dans le test à l'exception de 'id' et 'f_27'.\n#Itère sur les trames de données d'entraînement et de test.\n#Pour chaque dataframe, il ajoute une nouvelle colonne appelée 'unique_characters' qui contient le nombre de caractères uniques dans chaque valeur de la colonne 'f_27'.\n#Pour chaque dataframe, il ajoute également 10 nouvelles colonnes appelées 'ch0', 'ch1', 'ch2', ..., 'ch9'. Ces colonnes contiennent les valeurs ordinales des caractères de la colonne 'f_27', les caractères étant indexés de gauche à droite (par exemple, 'ch0' contient la valeur ordinale du premier caractère, 'ch1' contient la valeur ordinale du second caractère , etc.). Les valeurs ordinales sont calculées en soustrayant la valeur ordinale de 'A' de la valeur ordinale du caractère.\n#Il sélectionne les colonnes spécifiées dans les fonctionnalités du test et affiche les 2 premières lignes.","metadata":{"execution":{"iopub.status.busy":"2023-01-02T22:00:47.413657Z","iopub.execute_input":"2023-01-02T22:00:47.414008Z","iopub.status.idle":"2023-01-02T22:01:02.277400Z","shell.execute_reply.started":"2023-01-02T22:00:47.413981Z","shell.execute_reply":"2023-01-02T22:01:02.276379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import roc_auc_score, accuracy_score\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.model_selection import train_test_split\n\n#roc_auc_score est une fonction du module sklearn.metrics qui peut être utilisée pour évaluer les performances d'un classifieur binaire. Il calcule l'aire sous la courbe caractéristique de fonctionnement du récepteur (ROC AUC) pour un problème de classification binaire. Le ROC AUC est une métrique qui résume le compromis entre le taux de vrais positifs et le taux de faux positifs d'un classifieur. Un classificateur avec un score ROC AUC plus élevé est généralement considéré comme étant meilleur pour prédire les étiquettes de classe positives qu'un classificateur avec un score ROC AUC inférieur.\n\n#precision_score est une autre fonction du module sklearn.metrics qui peut être utilisée pour évaluer les performances d'un classifieur. Il calcule la fraction des prédictions qui étaient correctes. Par exemple, si un classificateur fait 100 prédictions et que 75 d'entre elles sont correctes, le score de précision sera de 0,75.\n\n#StratifiedKFold est une classe du module sklearn.model_selection qui peut être utilisée pour diviser un jeu de données en \"k\" plis tout en préservant l'équilibre des classes dans chaque pli. Cela peut être utile pour s'assurer que chaque pli dans une procédure de validation croisée est représentatif de la distribution globale des classes dans l'ensemble de données.\n\n#train_test_split est une fonction du module sklearn.model_selection qui peut être utilisée pour diviser un ensemble de données en ensembles d'apprentissage et de test. Il prend en compte l'ensemble de données ainsi que plusieurs paramètres facultatifs (par exemple, test_size, random_state) et renvoie deux ensembles de données qui peuvent être utilisés pour former et tester un modèle d'apprentissage automatique.","metadata":{"execution":{"iopub.status.busy":"2023-01-02T22:04:47.927508Z","iopub.execute_input":"2023-01-02T22:04:47.927862Z","iopub.status.idle":"2023-01-02T22:04:48.269031Z","shell.execute_reply.started":"2023-01-02T22:04:47.927835Z","shell.execute_reply":"2023-01-02T22:04:48.268097Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y = train[\"target\"]\nX = train.drop(columns=[\"id\",\"f_27\", \"target\"])\n\ntest = test.drop(columns=[\"id\",\"f_27\"])\n\nX.shape, test.shape","metadata":{"execution":{"iopub.status.busy":"2023-01-02T22:05:55.490919Z","iopub.execute_input":"2023-01-02T22:05:55.491258Z","iopub.status.idle":"2023-01-02T22:05:55.872840Z","shell.execute_reply.started":"2023-01-02T22:05:55.491225Z","shell.execute_reply":"2023-01-02T22:05:55.871756Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, y_train, y_test= train_test_split(X, y, test_size=0.33, random_state=42)\n\n#X_train, X_test, y_train et y_test sont des variables qui se verront attribuer le résultat de la fonction train_test_split. Cette fonction est utilisée pour diviser un ensemble de données en ensembles d'apprentissage et de test.\n#La fonction train_test_split prend deux arguments obligatoires : X et y. X est une matrice de valeurs de caractéristiques, où chaque ligne représente un échantillon et chaque colonne représente une caractéristique. y est un vecteur d'étiquettes, où chaque élément représente l'étiquette de la ligne correspondante dans X.\n#La fonction train_test_split a également plusieurs paramètres facultatifs, notamment test_size et random_state. test_size spécifie la proportion de l'ensemble de données qui doit être allouée à l'ensemble de test. Dans ce cas, test_size=0.33 signifie qu'environ 33 % des échantillons seront placés dans l'ensemble de test et les 67 % restants seront placés dans l'ensemble d'apprentissage. random_state est une graine pour le générateur de nombres aléatoires qui est utilisé pour mélanger les échantillons avant qu'ils ne soient divisés. La définition de random_state sur une valeur fixe garantit que le même fractionnement sera généré à chaque exécution du code.\n#Une fois la fonction train_test_split exécutée, les ensembles d'apprentissage et de test résultants seront respectivement affectés à X_train, X_test, y_train et y_test. Ces variables peuvent ensuite être utilisées pour former et évaluer un modèle d'apprentissage automatique","metadata":{"execution":{"iopub.status.busy":"2023-01-02T22:08:56.440168Z","iopub.execute_input":"2023-01-02T22:08:56.440553Z","iopub.status.idle":"2023-01-02T22:08:56.801051Z","shell.execute_reply.started":"2023-01-02T22:08:56.440521Z","shell.execute_reply":"2023-01-02T22:08:56.799936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from lightgbm import LGBMClassifier\n\nimport time\n\noptuna.logging.set_verbosity(optuna.logging.WARNING)\n\ndef objectivesLGBM(trial):\n    model = LGBMClassifier()\n    model.fit(X,y)\n\n    return model.score(X,y)","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:01:22.793381Z","iopub.execute_input":"2023-01-02T23:01:22.793691Z","iopub.status.idle":"2023-01-02T23:01:23.489471Z","shell.execute_reply.started":"2023-01-02T23:01:22.793667Z","shell.execute_reply":"2023-01-02T23:01:23.488562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = LGBMClassifier()\nmodel.fit(X, y)\n\nprint(\"Training score :\", model.score(X, y))\n\npred_y_test = model.predict(X_test)\nprint(\"Roc auc score  :\", roc_auc_score(y_test, pred_y_test))","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:01:38.013287Z","iopub.execute_input":"2023-01-02T23:01:38.013608Z","iopub.status.idle":"2023-01-02T23:02:00.552485Z","shell.execute_reply.started":"2023-01-02T23:01:38.013582Z","shell.execute_reply":"2023-01-02T23:02:00.551336Z"},"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":"2023-01-02T23:02:15.998310Z","iopub.execute_input":"2023-01-02T23:02:15.998662Z","iopub.status.idle":"2023-01-02T23:02:16.678750Z","shell.execute_reply.started":"2023-01-02T23:02:15.998637Z","shell.execute_reply":"2023-01-02T23:02:16.677920Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_imp = feature_imp.sort_values(by = \"Value\", ascending=False)\nfeature_imp","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:02:28.399994Z","iopub.execute_input":"2023-01-02T23:02:28.400350Z","iopub.status.idle":"2023-01-02T23:02:28.412728Z","shell.execute_reply.started":"2023-01-02T23:02:28.400323Z","shell.execute_reply":"2023-01-02T23:02:28.411388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"selected_features = feature_imp[:6]['Feature'].tolist()\nselected_features","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:02:38.510701Z","iopub.execute_input":"2023-01-02T23:02:38.511064Z","iopub.status.idle":"2023-01-02T23:02:38.518305Z","shell.execute_reply.started":"2023-01-02T23:02:38.511036Z","shell.execute_reply":"2023-01-02T23:02:38.517444Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X.shape, test.shape","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:02:51.743073Z","iopub.execute_input":"2023-01-02T23:02:51.743599Z","iopub.status.idle":"2023-01-02T23:02:51.751162Z","shell.execute_reply.started":"2023-01-02T23:02:51.743562Z","shell.execute_reply":"2023-01-02T23:02:51.750037Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\ndef add_basics_features(data, features):\n    \n    for feature in features:\n        \"\"\"\n        new_feature_name = str(feature) + '_min'\n        data[new_feature_name] = data[feature].min()\n        \n        new_feature_name = str(feature) + '_max'\n        data[new_feature_name] = data[feature].max()\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\n","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:03:59.869333Z","iopub.execute_input":"2023-01-02T23:03:59.869637Z","iopub.status.idle":"2023-01-02T23:03:59.875863Z","shell.execute_reply.started":"2023-01-02T23:03:59.869612Z","shell.execute_reply":"2023-01-02T23:03:59.875018Z"},"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":"2023-01-02T23:04:05.141739Z","iopub.execute_input":"2023-01-02T23:04:05.142215Z","iopub.status.idle":"2023-01-02T23:04:05.247378Z","shell.execute_reply.started":"2023-01-02T23:04:05.142189Z","shell.execute_reply":"2023-01-02T23:04:05.246760Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"kf = StratifiedKFold(n_splits=14, shuffle=True, random_state = 0)\ny_predict = []\n\nfor fold, (train_index, val_index) in enumerate(kf.split(X, y)):\n        print('*'*14, f\" Fold {fold} \", '*'*14, '\\n')\n        \n        # Split Data\n        X_train = X.loc[train_index]\n        X_val = X.loc[val_index]\n\n        y_train = y.loc[train_index]\n        y_val = y.loc[val_index]\n        \n        # Create Model here\n        model = LGBMClassifier()\n        \n        # Fit Model\n        model.fit(X_train,y_train)\n\n        # Make X_val prediction\n        y_pred = model.predict_proba(X_val)[:,1]\n        \n        # Make Test prediction\n        y_predict.append(model.predict_proba(test)[:,1])\n        \n        # Evaluate Model\n        print(\"Training score :\", model.score(X_train, y_train))\n        print(\"Roc auc score  :\", roc_auc_score(y_val, y_pred), '\\n')\n        \n        # Free the memory\n        del X_train, y_train, model, X_val, y_val, y_pred\n        gc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:04:54.546649Z","iopub.execute_input":"2023-01-02T23:04:54.547249Z","iopub.status.idle":"2023-01-02T23:10:17.998553Z","shell.execute_reply.started":"2023-01-02T23:04:54.547197Z","shell.execute_reply":"2023-01-02T23:10:17.997413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = LGBMClassifier()\n\nmodel.fit(X, y)\n\ny_predict.append(model.predict_proba(test)[:,1])","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:11:11.649938Z","iopub.execute_input":"2023-01-02T23:11:11.650439Z","iopub.status.idle":"2023-01-02T23:11:33.126432Z","shell.execute_reply.started":"2023-01-02T23:11:11.650410Z","shell.execute_reply":"2023-01-02T23:11:33.125658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del model, X, y, test, X_test, y_test\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:12:44.523484Z","iopub.execute_input":"2023-01-02T23:12:44.524178Z","iopub.status.idle":"2023-01-02T23:12:44.675532Z","shell.execute_reply.started":"2023-01-02T23:12:44.524135Z","shell.execute_reply":"2023-01-02T23:12:44.674443Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.array(y_predict).mean(axis=0)","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:12:48.153795Z","iopub.execute_input":"2023-01-02T23:12:48.154894Z","iopub.status.idle":"2023-01-02T23:12:48.178745Z","shell.execute_reply.started":"2023-01-02T23:12:48.154843Z","shell.execute_reply":"2023-01-02T23:12:48.177622Z"},"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":"2023-01-02T23:13:03.675045Z","iopub.execute_input":"2023-01-02T23:13:03.675708Z","iopub.status.idle":"2023-01-02T23:13:03.769825Z","shell.execute_reply.started":"2023-01-02T23:13:03.675674Z","shell.execute_reply":"2023-01-02T23:13:03.768850Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission['target'] = np.array(y_predict).mean(axis=0)\nsubmission.to_csv('submission.csv', index=False)\nsubmission","metadata":{"execution":{"iopub.status.busy":"2023-01-02T23:13:13.143724Z","iopub.execute_input":"2023-01-02T23:13:13.144344Z","iopub.status.idle":"2023-01-02T23:13:14.348490Z","shell.execute_reply.started":"2023-01-02T23:13:13.144304Z","shell.execute_reply":"2023-01-02T23:13:14.347232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}