{"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":"import polars as pl\nimport os\nfrom tqdm import tqdm\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nimport numpy as np\nimport pandas as pd\nfrom concurrent.futures import ThreadPoolExecutor\nfrom keras.models import Sequential\nfrom keras.layers import Dense\nfrom keras.optimizers import Adam\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.utils.class_weight import compute_class_weight\nfrom keras import regularizers\nfrom keras.layers import Dropout\nfrom imblearn.over_sampling import SMOTE\nfrom imblearn.under_sampling import RandomUnderSampler\nfrom sklearn.preprocessing import StandardScaler\nfrom tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-18T15:50:59.100346Z","iopub.execute_input":"2025-02-18T15:50:59.100820Z","iopub.status.idle":"2025-02-18T15:50:59.113020Z","shell.execute_reply.started":"2025-02-18T15:50:59.100779Z","shell.execute_reply":"2025-02-18T15:50:59.111899Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def time_features(df):\n    # Convert time_of_day to hours\n    df[\"hours\"] = df[\"time_of_day\"] // (3_600 * 1_000_000_000)\n    # Basic features \n    features = [\n        df[\"non-wear_flag\"].mean(),\n        df[\"enmo\"][df[\"enmo\"] >= 0.05].sum(),\n    ]\n    \n    # Define conditions for night, day, and no mask (full data)\n    night = ((df[\"hours\"] >= 22) | (df[\"hours\"] <= 5))\n    day = ((df[\"hours\"] <= 20) & (df[\"hours\"] >= 7))\n    no_mask = np.ones(len(df), dtype=bool)\n    \n    # List of columns of interest and masks\n    keys = [\"enmo\", \"anglez\", \"light\", \"battery_voltage\"]\n    masks = [no_mask, night, day]\n    \n    # Helper function for feature extraction\n    def extract_stats(data):\n        return [\n            data.mean(), \n            data.std(), \n            data.max(), \n            data.min(), \n            data.diff().mean(), \n            data.diff().std()\n        ]\n    \n    # Iterate over keys and masks to generate the statistics\n    for key in keys:\n        for mask in masks:\n            filtered_data = df.loc[mask, key]\n            features.extend(extract_stats(filtered_data))\n\n    return features\n\n# Code for parallelized computation of time series data from: Sheikh Muhammad Abdullah \n# https://www.kaggle.com/code/abdmental01/cmi-best-single-model\ndef process_file(filename, dirname):\n    # Process file and extract time features\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    df.drop('step', axis=1, inplace=True)\n    return time_features(df), filename.split('=')[1]\n\ndef load_time_series(dirname) -> pd.DataFrame:\n    # Load time series from directory in parallel\n    ids = os.listdir(dirname)\n    \n    with ThreadPoolExecutor() as executor:\n        results = list(tqdm(executor.map(lambda fname: process_file(fname, dirname), ids), total=len(ids)))\n    \n    stats, indexes = zip(*results)\n    \n    df = pd.DataFrame(stats, columns=[f\"stat_{i}\" for i in range(len(stats[0]))])\n    df['id'] = indexes\n    \n    return df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-18T15:03:51.634786Z","iopub.execute_input":"2025-02-18T15:03:51.635354Z","iopub.status.idle":"2025-02-18T15:03:51.646406Z","shell.execute_reply.started":"2025-02-18T15:03:51.635319Z","shell.execute_reply":"2025-02-18T15:03:51.645303Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet\")\ntest_ts = load_time_series(\"/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet\")\ntrain = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\ntrain = pd.merge(train, train_ts, how=\"left\", on='id')\ntest = pd.merge(test, test_ts, how=\"left\", on='id')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-18T15:03:51.647754Z","iopub.execute_input":"2025-02-18T15:03:51.648239Z","iopub.status.idle":"2025-02-18T15:05:18.811732Z","shell.execute_reply.started":"2025-02-18T15:03:51.648189Z","shell.execute_reply":"2025-02-18T15:05:18.810612Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# columns_to_drop = ['id'] + [col for col in train.columns if 'stat_' in col]\n# trainclean = train.drop(columns=columns_to_drop)\n# testclean = test.drop(columns=columns_to_drop)\n\ncolumns = ['Basic_Demos-Age', 'Basic_Demos-Sex', 'Physical-BMI', 'Physical-Height', 'Physical-Weight', 'Fitness_Endurance-Max_Stage', 'Fitness_Endurance-Time_Mins', 'FGC-FGC_CU', 'BIA-BIA_BMI', 'PreInt_EduHx-computerinternet_hoursday']\ntrainclean = train[columns+['sii']]\ntestclean = test[columns]\n\nprint(trainclean.head(5))\n\nprint(testclean.columns)\n\n\ncategorical_cols = ['Basic_Demos-Sex']\n\ntrainclean = pd.get_dummies(trainclean, columns=categorical_cols)\ntestclean = pd.get_dummies(testclean, columns=categorical_cols)\n\nprint(trainclean.columns)\n\nprint(testclean.columns)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-18T15:23:59.957885Z","iopub.execute_input":"2025-02-18T15:23:59.958268Z","iopub.status.idle":"2025-02-18T15:23:59.978643Z","shell.execute_reply.started":"2025-02-18T15:23:59.958225Z","shell.execute_reply":"2025-02-18T15:23:59.977341Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"early_stopping = EarlyStopping(\n    monitor='val_loss',\n    patience=10,            \n    restore_best_weights=True\n)\nreduce_lr = ReduceLROnPlateau(\n    monitor='val_loss',\n    factor=0.5,             \n    patience=5,             \n    verbose=1\n)\nX = trainclean.drop(columns=[\"sii\"]) \ny = trainclean[\"sii\"]\nfinal=testclean\n\nX = X.fillna(X.mean())\n\nvalid_indices = y.notna()\nX = X[valid_indices]\ny = y[valid_indices]\n\nX_train, X_val, y_train, y_val = train_test_split(\n    X, \n    y, \n    test_size=0.2, \n    stratify=y,        \n    random_state=42\n)\n\n\n\nsmote = SMOTE(sampling_strategy={1:1000, 2:800, 3:400}, random_state=42)\nX_train_res, y_train_res = smote.fit_resample(X_train, y_train)\n\nscaler = StandardScaler()\nX_train_res = scaler.fit_transform(X_train_res)\nX_val = scaler.transform(X_val)\n\n# Définir le taux d'apprentissage\nlearning_rate = 0.0001\n\n# Créer l'optimiseur Adam avec un taux d'apprentissage spécifique\noptimizer = Adam(learning_rate=learning_rate)\n\n\n# Construction du modèle MLP\nmodel_mlp = Sequential()\nmodel_mlp.add(Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.01)))\nmodel_mlp.add(Dropout(0.1))\nmodel_mlp.add(Dense(32, activation='relu', kernel_regularizer=regularizers.l2(0.01)))\nmodel_mlp.add(Dropout(0.1))\nmodel_mlp.add(Dense(16, activation='relu', kernel_regularizer=regularizers.l2(0.01)))\nmodel_mlp.add(Dropout(0.1))\nmodel_mlp.add(Dense(4, activation='softmax'))\n\nmodel_mlp.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\n\nhistory = model_mlp.fit(\n    X_train_res, \n    y_train_res,\n    epochs=1000,\n    batch_size=64,\n    validation_data=(X_val, y_val),\n    callbacks=[early_stopping, reduce_lr]\n)\n\n# Affichage de l'accuracy et de la loss pour chaque époque\nplt.figure(figsize=(12, 6))\n\n# Loss\nplt.subplot(1, 2, 1)\nplt.plot(history.history['loss'], label='Loss (train)')\nplt.plot(history.history['val_loss'], label='Loss (val)')\nplt.title('Loss par époque')\nplt.xlabel('Époque')\nplt.ylabel('Loss')\nplt.legend()\n\n# Accuracy\nplt.subplot(1, 2, 2)\nplt.plot(history.history['accuracy'], label='Accuracy (train)')\nplt.plot(history.history['val_accuracy'], label='Accuracy (val)')\nplt.title('Accuracy par époque')\nplt.xlabel('Époque')\nplt.ylabel('Accuracy')\nplt.legend()\n\nplt.show()\n\n\ny_pred_mlp = model_mlp.predict(final)\n\n# Transformer les prédictions en classes (l'index de la classe avec la probabilité la plus élevée)\ny_pred_mlp_classes_final = y_pred_mlp.argmax(axis=1)\n\n\n\nsubmission = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv\")\n\nsubmission['sii'] = y_pred_mlp_classes_final\nprint(y_pred_mlp_classes_final[:20])\n# Créer le fichier de soumission\nsubmission.to_csv('submission.csv', index=False)\nprint(submission)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-18T16:08:01.769283Z","iopub.execute_input":"2025-02-18T16:08:01.769877Z","iopub.status.idle":"2025-02-18T16:08:27.034558Z","shell.execute_reply.started":"2025-02-18T16:08:01.769823Z","shell.execute_reply":"2025-02-18T16:08:27.033148Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Afficher la répartition des classes dans y_train (ou y_test si vous voulez analyser les classes dans les données de test)\nplt.figure(figsize=(8, 6))\n\n# Utilisation de seaborn pour afficher un histogramme\nsns.countplot(x=y_train_res)\n\n# Ajouter un titre et des labels aux axes\nplt.title(\"Répartition des classes dans y_train\")\nplt.xlabel(\"Classe\")\nplt.ylabel(\"Nombre d'exemples\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-18T16:05:54.787989Z","iopub.execute_input":"2025-02-18T16:05:54.789310Z","iopub.status.idle":"2025-02-18T16:05:55.022529Z","shell.execute_reply.started":"2025-02-18T16:05:54.789242Z","shell.execute_reply":"2025-02-18T16:05:55.021050Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(np.unique(y_train))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-02-18T13:40:03.063445Z","iopub.execute_input":"2025-02-18T13:40:03.064455Z","iopub.status.idle":"2025-02-18T13:40:03.075798Z","shell.execute_reply.started":"2025-02-18T13:40:03.064392Z","shell.execute_reply":"2025-02-18T13:40:03.073698Z"}},"outputs":[],"execution_count":null}]}