{"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, Add, Activation\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\nfrom sklearn.utils import class_weight\nfrom tensorflow.keras.optimizers import Adam\n\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\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\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\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\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\nX_train_model = X_train_scaled\nX_val_model   = X_val_scaled\nX_test_model  = X_test_scaled\nclasses = np.unique(y_train)\nclass_weights = class_weight.compute_class_weight(\n    class_weight='balanced',\n    classes=classes,\n    y=y_train\n)\nclass_weights = dict(enumerate(class_weights))\nprint(\"Poids des classes :\", class_weights)\n\ndef create_resnet(input_shape, num_classes):\n    inputs = Input(shape=input_shape)\n    \n    x = Dense(64, activation='relu', kernel_regularizer=l2(0.001))(inputs)\n    x = BatchNormalization()(x)\n    x = Dropout(0.3)(x)\n    \n    shortcut = x\n    x = Dense(64, activation='relu', kernel_regularizer=l2(0.001))(x)\n    x = BatchNormalization()(x)\n    x = Dropout(0.3)(x)\n    x = Dense(64, activation='linear', kernel_regularizer=l2(0.001))(x)\n    x = BatchNormalization()(x)\n    x = Add()([shortcut, x])\n    x = Activation('relu')(x)\n    \n    shortcut = x\n    x = Dense(64, activation='relu', kernel_regularizer=l2(0.001))(x)\n    x = BatchNormalization()(x)\n    x = Dropout(0.3)(x)\n    x = Dense(64, activation='linear', kernel_regularizer=l2(0.001))(x)\n    x = BatchNormalization()(x)\n    x = Add()([shortcut, x])\n    x = Activation('relu')(x)\n    \n    x = Dense(32, activation='relu', kernel_regularizer=l2(0.001))(x)\n    x = BatchNormalization()(x)\n    x = Dropout(0.3)(x)\n    \n    outputs = Dense(num_classes, activation='softmax')(x)\n    \n    model = Model(inputs=inputs, outputs=outputs)\n    return model\n\nresnet_model = create_resnet(input_shape=X_train_model.shape[1:], num_classes=num_classes)\nresnet_model.compile(optimizer=Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy'])\n\n\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\nhistory = resnet_model.fit(\n    X_train_model, y_train_encoded,\n    validation_data=(X_val_model, y_val_encoded),\n    epochs=1000,\n    batch_size=64,\n    callbacks=[early_stop, reduce_lr],\n    verbose=1\n    , class_weight=class_weights\n)\n\ntest_pred_probs = resnet_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-25T13:59:55.848026Z","iopub.execute_input":"2025-02-25T13:59:55.848354Z","iopub.status.idle":"2025-02-25T14:00:14.381304Z","shell.execute_reply.started":"2025-02-25T13:59:55.848326Z","shell.execute_reply":"2025-02-25T14:00:14.380163Z"}},"outputs":[],"execution_count":null}]}