{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","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":30918,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport tensorflow as tf\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import Dense, Dropout, BatchNormalization, Input, Conv1D, MaxPooling1D, Flatten\nfrom tensorflow.keras.regularizers import l2\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler, LabelEncoder\nfrom tensorflow.keras.utils import to_categorical\n\n# Chargement des données\ntrain_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\n\ntrain_df_clean = train_df.dropna(subset=['sii']).copy()\n\ntrain_columns = set(train_df_clean.columns)\ntest_columns = set(test_df.columns)\ncolumns_to_drop = list(train_columns - test_columns - {'sii'})\ntrain_df_clean.drop(columns=columns_to_drop, inplace=True)\ntest_df.drop(columns=list(test_columns - train_columns), errors='ignore', inplace=True)\n\n# Encodage des variables catégorielles\nlabel_encoder = LabelEncoder()\ncategorical_columns = train_df_clean.select_dtypes(include=['object']).columns\n\nfor col in categorical_columns:\n    train_df_clean[col] = train_df_clean[col].astype(str)\n    test_df[col] = test_df[col].astype(str)\n    train_df_clean[col] = label_encoder.fit_transform(train_df_clean[col])\n    test_df[col] = test_df[col].map(lambda x: label_encoder.transform([x])[0] if x in label_encoder.classes_ else -1)\n\n# Remplissage des valeurs manquantes pour les variables numériques\nnumeric_cols = train_df_clean.select_dtypes(include=['float', 'int']).columns\nnumeric_cols = [col for col in numeric_cols if col != 'sii']\n\nfor col in numeric_cols:\n    median_value = train_df_clean[col].median()\n    train_df_clean[col] = train_df_clean[col].fillna(median_value)\n    test_df[col] = test_df[col].fillna(median_value)\n\nprint(f\"Taille des données après encodage : {train_df_clean.shape}\")\n\n# Séparation des features et de la target\nX = train_df_clean.drop(columns=['id', 'sii'])\ny = train_df_clean['sii']\n\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)\n\n# Mise à l'échelle des features\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_val_scaled = scaler.transform(X_val)\nX_test_scaled = scaler.transform(test_df.drop(columns=['id']))\n\nnum_classes = len(y.unique())\ny_train_encoded = to_categorical(y_train, num_classes=num_classes)\ny_val_encoded = to_categorical(y_val, num_classes=num_classes)\n\n# Pour utiliser un CNN, on reshape nos données en ajoutant une dimension de canal\nX_train_model = np.expand_dims(X_train_scaled, axis=2)  # shape: (n_samples, n_features, 1)\nX_val_model   = np.expand_dims(X_val_scaled, axis=2)\nX_test_model  = np.expand_dims(X_test_scaled, axis=2)\n\ndef create_cnn(input_shape, num_classes):\n    inputs = Input(shape=input_shape)\n    \n    # Première bloc de convolution\n    x = Conv1D(32, kernel_size=3, activation='relu', padding='same', kernel_regularizer=l2(0.001))(inputs)\n    x = BatchNormalization()(x)\n    x = MaxPooling1D(pool_size=2)(x)\n    x = Dropout(0.3)(x)\n    \n    # Deuxième bloc de convolution\n    x = Conv1D(64, kernel_size=3, activation='relu', padding='same', kernel_regularizer=l2(0.001))(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling1D(pool_size=2)(x)\n    x = Dropout(0.3)(x)\n    \n    # Troisième bloc de convolution\n    x = Conv1D(128, kernel_size=3, activation='relu', padding='same', kernel_regularizer=l2(0.001))(x)\n    x = BatchNormalization()(x)\n    x = MaxPooling1D(pool_size=2)(x)\n    x = Dropout(0.3)(x)\n    \n    # Passage aux couches denses\n    x = Flatten()(x)\n    x = Dense(64, activation='relu', kernel_regularizer=l2(0.001))(x)\n    x = Dropout(0.5)(x)\n    outputs = Dense(num_classes, activation='softmax')(x)\n    \n    model = Model(inputs=inputs, outputs=outputs)\n    return model\n\ncnn_model = create_cnn(input_shape=X_train_model.shape[1:], num_classes=num_classes)\ncnn_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n\n# Callbacks\nearly_stop = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)\nreduce_lr  = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=5, min_lr=1e-6)\n\n# Entraînement du modèle\nhistory = cnn_model.fit(\n    X_train_model, y_train_encoded,\n    validation_data=(X_val_model, y_val_encoded),\n    epochs=100,\n    batch_size=32,\n    callbacks=[early_stop, reduce_lr],\n    verbose=1\n)\n\n# Prédiction sur le jeu de test\ntest_pred_probs = cnn_model.predict(X_test_model)\ntest_pred = np.argmax(test_pred_probs, axis=1)\n\nsubmission = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv\")\nsubmission['sii'] = test_pred\nsubmission.to_csv('submission.csv', index=False)\n\nprint(\"✅ Fichier de soumission généré avec succès !\")\nprint(submission)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-24T14:01:04.172217Z","iopub.execute_input":"2025-02-24T14:01:04.172567Z","iopub.status.idle":"2025-02-24T14:01:44.113934Z","shell.execute_reply.started":"2025-02-24T14:01:04.172539Z","shell.execute_reply":"2025-02-24T14:01:44.112487Z"}},"outputs":[],"execution_count":null}]}