{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"}],"dockerImageVersionId":30786,"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\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":"2024-11-06T22:04:53.614786Z","iopub.execute_input":"2024-11-06T22:04:53.616172Z","iopub.status.idle":"2024-11-06T22:04:54.721987Z","shell.execute_reply.started":"2024-11-06T22:04:53.616122Z","shell.execute_reply":"2024-11-06T22:04:54.720841Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nimport pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler, OneHotEncoder\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.metrics import accuracy_score, classification_report, confusion_matrix\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, BatchNormalization\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.callbacks import EarlyStopping\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.regularizers import l1, l2\nfrom sklearn.utils.class_weight import compute_class_weight\n\n\n\n\n\n# Charger les données\ndata = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\n\ntest =pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\n","metadata":{"execution":{"iopub.status.busy":"2024-11-06T22:04:54.723892Z","iopub.execute_input":"2024-11-06T22:04:54.724291Z","iopub.status.idle":"2024-11-06T22:04:54.790109Z","shell.execute_reply.started":"2024-11-06T22:04:54.724251Z","shell.execute_reply":"2024-11-06T22:04:54.788847Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Suppression des lignes contenant des valeurs manquantes dans la colonne 'sii'\ndata = data.dropna(subset=['sii'])\n\n# Calcul du seuil de valeurs manquantes (5 % des lignes)\nseuil = len(data) * 0.05\n\n# Sélection des colonnes avec un taux de valeurs manquantes inférieur ou égal à 5 %\ncolonnes_avec_peu_de_na = [col for col in data.columns if data[col].isna().sum() <= seuil]\n\n# Suppression des lignes contenant des valeurs manquantes dans ces colonnes\ndata = data.dropna(subset=colonnes_avec_peu_de_na)\n\n# Calcul du seuil minimal de valeurs non manquantes (40 %)\nseuil = len(data) * 0.40\n\n# Suppression des colonnes ayant plus de 60 % de valeurs manquantes\ndata = data.dropna(axis=1, thresh=seuil)\n\n# Remplacer les valeurs infinies par NaN dans le jeu de données\ndata.replace([np.inf, -np.inf], np.nan, inplace=True)\n\n# Liste des colonnes catégorielles et numériques\ncolonnes_categoriales = [\n    \"CGAS-Season\", \"Physical-Season\", \"Fitness_Endurance-Season\", \"BIA-Season\",\n    \"PAQ_C-Season\", \"SDS-Season\", \"FGC-FGC_PU_Zone\", \"FGC-FGC_SRL_Zone\",\n    \"FGC-FGC_SRR_Zone\", \"FGC-FGC_TL_Zone\", \"BIA-BIA_Activity_Level_num\",\n    \"BIA-BIA_Frame_num\", \"FGC-FGC_CU_Zone\"\n]\n\ncolonnes_numeriques = [\n    \"CGAS-CGAS_Score\", \"Physical-Diastolic_BP\", \"Physical-HeartRate\", \"Physical-Systolic_BP\",\n    \"FGC-FGC_CU\", \"FGC-FGC_PU\", \"FGC-FGC_TL\", \"SDS-SDS_Total_Raw\", \"SDS-SDS_Total_T\",\n    \"Physical-BMI\", \"Physical-Height\", \"Physical-Weight\", \"FGC-FGC_SRL\", \"FGC-FGC_SRR\",\n    \"BIA-BIA_BMC\", \"BIA-BIA_BMI\", \"BIA-BIA_BMR\", \"BIA-BIA_DEE\", \"BIA-BIA_ECW\", \"BIA-BIA_FFM\",\n    \"BIA-BIA_FFMI\", \"BIA-BIA_FMI\", \"BIA-BIA_Fat\", \"BIA-BIA_ICW\", \"BIA-BIA_LDM\", \"BIA-BIA_LST\",\n    \"BIA-BIA_SMM\", \"BIA-BIA_TBW\", \"PAQ_C-PAQ_C_Total\"\n]\n\n# Imputer les colonnes catégorielles avec le mode\nfor colonne in colonnes_categoriales:\n    mode = data[colonne].mode()[0]\n    data[colonne] = data[colonne].fillna(mode)\n\n\n# Imputation par régression multiple avec IterativeImputer\nfrom sklearn.experimental import enable_iterative_imputer\nfrom sklearn.impute import IterativeImputer\nfrom sklearn.model_selection import KFold\nfrom sklearn.metrics import mean_squared_error\nimport numpy as np\n\nimputer = IterativeImputer(max_iter=10, random_state=42)\n\n# Utilisation de la validation croisée pour évaluer l'imputation\nkf = KFold(n_splits=5, shuffle=True, random_state=42)\nerrors = []\n\nfor train_index, test_index in kf.split(data[colonnes_numeriques]):\n    train_data, test_data = data.iloc[train_index], data.iloc[test_index]\n    train_data_imputed = imputer.fit_transform(train_data[colonnes_numeriques])\n    test_data_imputed = imputer.transform(test_data[colonnes_numeriques])\n    mask = ~np.isnan(test_data[colonnes_numeriques].values)\n    error = mean_squared_error(test_data[colonnes_numeriques].values[mask], test_data_imputed[mask])\n    errors.append(error)\n\navg_error = np.mean(errors)\nprint(f'Mean Squared Error = {avg_error}')\n\n# Imputation finale sur l'ensemble des données\ndata[colonnes_numeriques] = imputer.fit_transform(data[colonnes_numeriques])\n\n# Conversion de certaines colonnes en type entier\ncolonnes_a_convertir = [\n    \"sii\", 'CGAS-CGAS_Score', 'Physical-Diastolic_BP', 'Physical-HeartRate',\n    'Physical-Systolic_BP', 'FGC-FGC_CU', 'FGC-FGC_PU', 'FGC-FGC_TL',\n    'PCIAT-PCIAT_Total', 'SDS-SDS_Total_Raw', 'SDS-SDS_Total_T'\n]\ndata[colonnes_a_convertir] = data[colonnes_a_convertir].astype(int)\n\n# Conversion de certaines colonnes en type catégoriel\ncolonnes_a_transformer = [\n    \"Basic_Demos-Enroll_Season\", \"Basic_Demos-Sex\", \"CGAS-Season\", \"Physical-Season\",\n    \"Fitness_Endurance-Season\", \"FGC-Season\", \"FGC-FGC_CU_Zone\", \"FGC-FGC_GSD_Zone\",\n    \"FGC-FGC_PU_Zone\", \"FGC-FGC_SRL_Zone\", \"FGC-FGC_SRR_Zone\", \"FGC-FGC_TL_Zone\",\n    \"BIA-Season\", \"BIA-BIA_Activity_Level_num\", \"BIA-BIA_Frame_num\", \"PAQ_A-Season\",\n    \"PAQ_C-Season\", \"PCIAT-Season\", \"PCIAT-PCIAT_01\", \"PCIAT-PCIAT_02\", \"PCIAT-PCIAT_03\",\n    \"PCIAT-PCIAT_04\", \"PCIAT-PCIAT_05\", \"PCIAT-PCIAT_06\", \"PCIAT-PCIAT_07\", \"PCIAT-PCIAT_08\",\n    \"PCIAT-PCIAT_09\", \"PCIAT-PCIAT_10\", \"PCIAT-PCIAT_11\", \"PCIAT-PCIAT_12\", \"PCIAT-PCIAT_13\",\n    \"PCIAT-PCIAT_14\", \"PCIAT-PCIAT_15\", \"PCIAT-PCIAT_16\", \"PCIAT-PCIAT_17\", \"PCIAT-PCIAT_18\",\n    \"PCIAT-PCIAT_19\", \"PCIAT-PCIAT_20\", \"SDS-Season\", \"PreInt_EduHx-Season\"\n]\n\nfor colonne in colonnes_a_transformer:\n    if colonne in data.columns:\n        data[colonne] = data[colonne].astype('category')\n    else:\n        print(f\"La colonne '{colonne}' n'existe pas dans le DataFrame.\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-06T22:04:54.792285Z","iopub.execute_input":"2024-11-06T22:04:54.792688Z","iopub.status.idle":"2024-11-06T22:05:39.767466Z","shell.execute_reply.started":"2024-11-06T22:04:54.792645Z","shell.execute_reply":"2024-11-06T22:05:39.766410Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df=data\n# Obtenir les colonnes communes entre data et test\ncolonnes_communes = list(set(data.columns).intersection(test.columns))\n\n# Utiliser la liste pour sélectionner les colonnes dans le DataFrame\ndata = data[colonnes_communes]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-06T22:05:39.773520Z","iopub.execute_input":"2024-11-06T22:05:39.774246Z","iopub.status.idle":"2024-11-06T22:05:39.792895Z","shell.execute_reply.started":"2024-11-06T22:05:39.774194Z","shell.execute_reply":"2024-11-06T22:05:39.791323Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Utiliser .loc pour éviter le SettingWithCopyWarning\ndata.loc[:, \"sii\"] = df[\"sii\"]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-06T22:05:39.794836Z","iopub.execute_input":"2024-11-06T22:05:39.795754Z","iopub.status.idle":"2024-11-06T22:05:39.805028Z","shell.execute_reply.started":"2024-11-06T22:05:39.795686Z","shell.execute_reply":"2024-11-06T22:05:39.803490Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Séparation des données en entraînement et test\nX = data.drop(\"sii\", axis=1)\ny = data[\"sii\"]\n\n# Séparation des données en entraînement et validation\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)\n\n# Liste des colonnes numériques et catégoriques\nnumeric_features = X.select_dtypes(include=[\"int64\", \"float64\"]).columns\ncategorical_features = X.select_dtypes(include=[\"object\"]).columns\n\n# Prétraitement des données\nnumeric_transformer = Pipeline(steps=[\n    (\"imputer\", SimpleImputer(strategy=\"mean\")),\n    (\"scaler\", StandardScaler())\n])\n\ncategorical_transformer = Pipeline(steps=[\n    (\"imputer\", SimpleImputer(strategy=\"most_frequent\")),\n    (\"onehot\", OneHotEncoder(handle_unknown=\"ignore\", sparse_output=False))\n])\n\n# Création du préprocesseur pour combiner les transformations\npreprocessor = ColumnTransformer(\n    transformers=[\n        (\"num\", numeric_transformer, numeric_features),\n        (\"cat\", categorical_transformer, categorical_features)\n    ]\n)\n\n# Application du préprocesseur sur les données d'entraînement et de validation\nX_train = preprocessor.fit_transform(X_train)\nX_val = preprocessor.transform(X_val)\n\n# Conversion des labels en catégoriques\ny_train = to_categorical(y_train)\ny_val = to_categorical(y_val)\n\n# Calcul des poids de classe\nclass_weights = compute_class_weight(class_weight='balanced', classes=np.unique(np.argmax(y_train, axis=1)), y=np.argmax(y_train, axis=1))\nclass_weights_dict = dict(enumerate(class_weights))\n\n# Définition du modèle\nmodel = Sequential()\nmodel.add(Dense(128, activation=\"relu\", input_shape=(X_train.shape[1],), kernel_regularizer=l1(0.01), bias_regularizer=l2(0.01)))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.2))\nmodel.add(Dense(64, activation=\"relu\", kernel_regularizer=l1(0.01), bias_regularizer=l2(0.01)))\nmodel.add(BatchNormalization())\nmodel.add(Dropout(0.2))\nmodel.add(Dense(32, activation=\"relu\", kernel_regularizer=l1(0.01), bias_regularizer=l2(0.01)))\nmodel.add(Dense(y_train.shape[1], activation=\"softmax\"))\n\n# Compilation du modèle\nmodel.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.001), metrics=[\"accuracy\"])\n\n# Entraînement avec les poids de classe\nearly_stopping = EarlyStopping(monitor=\"val_loss\", patience=5, restore_best_weights=True)\nmodel.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_val, y_val), callbacks=[early_stopping], class_weight=class_weights_dict)\n\n# Évaluation du modèle\ny_pred = model.predict(X_val)\ny_pred_class = np.argmax(y_pred, axis=1)\n\n# Affichage des résultats\nprint(\"Accuracy:\", accuracy_score(np.argmax(y_val, axis=1), y_pred_class))\nprint(\"Classification Report:\")\nprint(classification_report(np.argmax(y_val, axis=1), y_pred_class))\nprint(\"Confusion Matrix:\")\nprint(confusion_matrix(np.argmax(y_val, axis=1), y_pred_class))\n\n\n\n# Charger les données de test\ntest_data = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\n\n# Prétraiter les données de test\nX_test = preprocessor.transform(test_data)\n\n# Faire des prédictions sur les données de test\ny_test_pred = model.predict(X_test)\ny_test_pred_class = np.argmax(y_test_pred, axis=1)  # Obtenir la classe avec la probabilité la plus élevée\n\n# Créer un DataFrame pour la soumission\nsubmission = pd.DataFrame({\n    'id': test_data['id'],  # L'identifiant des participants dans le fichier de test\n    'sii': y_test_pred_class  # Les prédictions faites par le modèle\n})\n\n# Sauvegarder le fichier de soumission en CSV\nsubmission.to_csv(\"submission.csv\", index=False)\n\nprint(\"Fichier de soumission créé avec succès !\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-06T22:05:39.857411Z","iopub.execute_input":"2024-11-06T22:05:39.858314Z","iopub.status.idle":"2024-11-06T22:05:59.424243Z","shell.execute_reply.started":"2024-11-06T22:05:39.858257Z","shell.execute_reply":"2024-11-06T22:05:59.422911Z"}},"outputs":[],"execution_count":null}]}