{"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":"gpu","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":6058,"sourceType":"modelInstanceVersion","modelInstanceId":4679,"modelId":2819}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Working on model improvements","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport os\nfrom imblearn.under_sampling import RandomUnderSampler\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import classification_report, accuracy_score\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport scipy.stats as stats\nimport keras\nimport keras_nlp","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:43:02.099471Z","iopub.execute_input":"2024-10-19T04:43:02.100256Z","iopub.status.idle":"2024-10-19T04:43:17.835246Z","shell.execute_reply.started":"2024-10-19T04:43:02.100215Z","shell.execute_reply":"2024-10-19T04:43:17.834321Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the path to the parquet files and training CSV\nparquet_path = '/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet/'\ntraining_csv_path = '/kaggle/input/child-mind-institute-problematic-internet-use/train.csv'\ntest_csv_path = '/kaggle/input/child-mind-institute-problematic-internet-use/test.csv'\n\n# Load training and test CSV files\ntrain_df = pd.read_csv(training_csv_path)\ntest_df = pd.read_csv(test_csv_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:43:17.837061Z","iopub.execute_input":"2024-10-19T04:43:17.837617Z","iopub.status.idle":"2024-10-19T04:43:17.914482Z","shell.execute_reply.started":"2024-10-19T04:43:17.837582Z","shell.execute_reply":"2024-10-19T04:43:17.913532Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define function to calculate mode with safe handling for scalar values\ndef calculate_mode(series):\n    mode_result = stats.mode(series)\n    if isinstance(mode_result.mode, np.ndarray) and len(mode_result.mode) > 0:\n        return mode_result.mode[0]\n    else:\n        return mode_result.mode\n\n# List of columns to calculate statistics for\ncolumns_to_check = ['X', 'Y', 'Z', 'ENMO', 'anglez', 'light', 'battery_voltage', 'step', 'non-wear-flag', 'weekday', 'quarter', 'relative_date_PCIAT']\n\n# Initialize list to hold processed dataframes\nprocessed_dataframes = []\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:43:17.915760Z","iopub.execute_input":"2024-10-19T04:43:17.916153Z","iopub.status.idle":"2024-10-19T04:43:17.922946Z","shell.execute_reply.started":"2024-10-19T04:43:17.916088Z","shell.execute_reply":"2024-10-19T04:43:17.921828Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Iterate through each folder in the parquet directory\nfor folder in os.listdir(parquet_path):\n    folder_path = os.path.join(parquet_path, folder)\n    if os.path.isdir(folder_path) and folder.startswith(\"id=\"):\n        for file in os.listdir(folder_path):\n            if file.endswith('.parquet'):\n                file_path = os.path.join(folder_path, file)\n                parquet_df = pd.read_parquet(file_path)\n                # Filter out columns that are available in the current parquet file\n                available_columns = [col for col in columns_to_check if col in parquet_df.columns]                 \n                data = {'id': folder.split('=')[1]} # Initialize a dictionary to hold the calculated statistics\n                \n                for col in ['X', 'Y', 'Z', 'ENMO', 'anglez', 'light', 'battery_voltage']: # Calculate statistics for available columns\n                    if col in available_columns:\n                        data[f'{col}_mean'] = parquet_df[col].mean()\n                        data[f'{col}_std'] = parquet_df[col].std()\n                        data[f'{col}_range'] = parquet_df[col].max() - parquet_df[col].min()\n                if 'step' in available_columns:\n                    data['step_sum'] = parquet_df['step'].sum()\n                if 'non-wear-flag' in available_columns:\n                    data['non_wear_flag_percentage'] = parquet_df['non-wear-flag'].mean() * 100\n                if 'weekday' in available_columns:\n                    data['weekday_mode'] = calculate_mode(parquet_df['weekday'])\n                if 'quarter' in available_columns:\n                    data['quarter_mode'] = calculate_mode(parquet_df['quarter'])\n                if 'relative_date_PCIAT' in available_columns:\n                    data['relative_date_PCIAT_mean'] = parquet_df['relative_date_PCIAT'].mean()\n                    data['relative_date_PCIAT_range'] = parquet_df['relative_date_PCIAT'].max() - parquet_df['relative_date_PCIAT'].min()\n\n                # Create a DataFrame with the calculated statistics\n                avg_df = pd.DataFrame([data])\n                processed_dataframes.append(avg_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:43:17.925901Z","iopub.execute_input":"2024-10-19T04:43:17.926372Z","iopub.status.idle":"2024-10-19T04:45:04.942382Z","shell.execute_reply.started":"2024-10-19T04:43:17.926322Z","shell.execute_reply":"2024-10-19T04:45:04.941490Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Concatenate all processed DataFrames and merge with training data\nall_avg_df = pd.concat(processed_dataframes, ignore_index=True)\n\n# Identify intersecting columns between train and test data\nintersecting_columns = train_df.columns.intersection(test_df.columns).tolist()\n\n# Merge only on intersecting columns, including the target variable 'sii'\nfinal_df = all_avg_df.merge(train_df[intersecting_columns + ['sii']], on='id', how='left')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:45:04.943620Z","iopub.execute_input":"2024-10-19T04:45:04.943931Z","iopub.status.idle":"2024-10-19T04:45:05.068552Z","shell.execute_reply.started":"2024-10-19T04:45:04.943899Z","shell.execute_reply":"2024-10-19T04:45:05.067590Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:45:05.070482Z","iopub.execute_input":"2024-10-19T04:45:05.071004Z","iopub.status.idle":"2024-10-19T04:45:05.106704Z","shell.execute_reply.started":"2024-10-19T04:45:05.070948Z","shell.execute_reply":"2024-10-19T04:45:05.105608Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_df.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:45:05.107761Z","iopub.execute_input":"2024-10-19T04:45:05.108043Z","iopub.status.idle":"2024-10-19T04:45:05.132183Z","shell.execute_reply.started":"2024-10-19T04:45:05.108011Z","shell.execute_reply":"2024-10-19T04:45:05.131142Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Droping some columns which have more NAN values\nnew_final_df = final_df.drop(columns=['id', 'PAQ_A-Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-Season', 'PAQ_C-PAQ_C_Total',\n                           'Fitness_Endurance-Season', 'Fitness_Endurance-Max_Stage', 'Fitness_Endurance-Time_Mins',\n                           'Fitness_Endurance-Time_Sec', 'FGC-FGC_GSND', 'FGC-FGC_GSND_Zone', 'FGC-FGC_GSD',\n                           'FGC-FGC_GSD_Zone', 'Physical-Waist_Circumference'])\nnew_final_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:57:03.956326Z","iopub.execute_input":"2024-10-19T04:57:03.957633Z","iopub.status.idle":"2024-10-19T04:57:03.990128Z","shell.execute_reply.started":"2024-10-19T04:57:03.957593Z","shell.execute_reply":"2024-10-19T04:57:03.989149Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"new_final_df.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:57:06.377483Z","iopub.execute_input":"2024-10-19T04:57:06.378487Z","iopub.status.idle":"2024-10-19T04:57:06.397142Z","shell.execute_reply.started":"2024-10-19T04:57:06.378440Z","shell.execute_reply":"2024-10-19T04:57:06.395900Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Function to fill missing values based on column type\ndef fill_missing_values(dataframe, column, method='mean'):\n    \"\"\"\n    Fill missing values in a DataFrame column based on the specified method.\n    \n    :param dataframe: DataFrame containing the data\n    :param column: Column name to fill missing values\n    :param method: Method for filling missing values: 'mean', 'median', or 'mode'\n    \"\"\"\n    if method == 'mean':\n        value = dataframe[column].mean()\n    elif method == 'median':\n        value = dataframe[column].median()\n    elif method == 'mode':\n        value = dataframe[column].mode()[0]\n    else:\n        raise ValueError(\"Method must be 'mean', 'median', or 'mode'\")\n    \n    dataframe[column].fillna(value, inplace=True)\n\n# Filling missing values for various columns\nfill_missing_values(new_final_df, 'CGAS-CGAS_Score', method='median')\nfill_missing_values(new_final_df, 'Physical-BMI', method='mean')\nfill_missing_values(new_final_df, 'Physical-Height', method='mode')\nfill_missing_values(new_final_df, 'Physical-Weight', method='median')\nfill_missing_values(new_final_df, 'Physical-Diastolic_BP', method='mode')\nfill_missing_values(new_final_df, 'Physical-HeartRate', method='median')\nfill_missing_values(new_final_df, 'Physical-Systolic_BP', method='median')\nfill_missing_values(new_final_df, 'FGC-FGC_CU', method='median')\nfill_missing_values(new_final_df, 'FGC-FGC_CU_Zone', method='mode')\nfill_missing_values(new_final_df, 'FGC-FGC_PU', method='mode')\nfill_missing_values(new_final_df, 'FGC-FGC_PU_Zone', method='mode')\nfill_missing_values(new_final_df, 'FGC-FGC_SRL', method='median')\nfill_missing_values(new_final_df, 'FGC-FGC_SRL_Zone', method='mode')\nfill_missing_values(new_final_df, 'FGC-FGC_SRR', method='mode')\nfill_missing_values(new_final_df, 'FGC-FGC_SRR_Zone', method='mode')\nfill_missing_values(new_final_df, 'FGC-FGC_TL', method='mode')\nfill_missing_values(new_final_df, 'FGC-FGC_TL_Zone', method='mode')\nfill_missing_values(new_final_df, 'BIA-BIA_Activity_Level_num', method='mode')\nfill_missing_values(new_final_df, 'BIA-BIA_BMC', method='mean')\nfill_missing_values(new_final_df, 'BIA-BIA_BMI', method='mean')\nfill_missing_values(new_final_df, 'BIA-BIA_BMR', method='mean')\nfill_missing_values(new_final_df, 'BIA-BIA_DEE', method='mean')\nfill_missing_values(new_final_df, 'BIA-BIA_ECW', method='median')\nfill_missing_values(new_final_df, 'BIA-BIA_FFM', method='median')\nfill_missing_values(new_final_df, 'BIA-BIA_FFMI', method='mode')\nfill_missing_values(new_final_df, 'BIA-BIA_FMI', method='mean')\nfill_missing_values(new_final_df, 'BIA-BIA_Fat', method='median')\nfill_missing_values(new_final_df, 'BIA-BIA_Frame_num', method='mode')\nfill_missing_values(new_final_df, 'BIA-BIA_ICW', method='median')\nfill_missing_values(new_final_df, 'BIA-BIA_LDM', method='median')\nfill_missing_values(new_final_df, 'BIA-BIA_LST', method='median')\nfill_missing_values(new_final_df, 'BIA-BIA_SMM', method='median')\nfill_missing_values(new_final_df, 'BIA-BIA_TBW', method='median')\nfill_missing_values(new_final_df, 'SDS-SDS_Total_Raw', method='median')\nfill_missing_values(new_final_df, 'SDS-SDS_Total_T', method='median')\nfill_missing_values(new_final_df, 'PreInt_EduHx-computerinternet_hoursday', method='mode')\n\n# Optionally, you can check for any remaining missing values\nremaining_missing = new_final_df.isnull().sum().sum()\nif remaining_missing > 0:\n    print(f\"Warning: There are still {remaining_missing} missing values in the DataFrame.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:57:10.379329Z","iopub.execute_input":"2024-10-19T04:57:10.379713Z","iopub.status.idle":"2024-10-19T04:57:10.425422Z","shell.execute_reply.started":"2024-10-19T04:57:10.379676Z","shell.execute_reply":"2024-10-19T04:57:10.424321Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define the season mapping\nseason_mapping = {\n    'Winter': 1,\n    'Spring': 2,\n    'Summer': 3,\n    'Fall': 4\n}\n\n# Iterate through columns in the DataFrame\nfor column in new_final_df.columns:\n    # Check if the column name ends with 'Season' and is of object data type\n    if column.endswith('Season') and new_final_df[column].dtype == 'object':\n        # Map the values in the column using the defined mapping\n        new_final_df[column] = new_final_df[column].map(season_mapping)\n\n# Optionally, check the updated DataFrame to ensure mapping is applied\nprint(new_final_df[[col for col in new_final_df.columns if col.endswith('Season')]].head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:57:13.393910Z","iopub.execute_input":"2024-10-19T04:57:13.394692Z","iopub.status.idle":"2024-10-19T04:57:13.417894Z","shell.execute_reply.started":"2024-10-19T04:57:13.394633Z","shell.execute_reply":"2024-10-19T04:57:13.416726Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Forward Fill / Backward Fill: If the seasons have a natural order or if you believe the data has a temporal aspect (like time series data), you can use forward or backward filling.","metadata":{}},{"cell_type":"code","source":"for column in new_final_df.columns:\n    if column.endswith('Season'):\n        new_final_df[column].fillna(method='ffill', inplace=True)  # Forward fill","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:57:22.217488Z","iopub.execute_input":"2024-10-19T04:57:22.217890Z","iopub.status.idle":"2024-10-19T04:57:22.225969Z","shell.execute_reply.started":"2024-10-19T04:57:22.217852Z","shell.execute_reply":"2024-10-19T04:57:22.225075Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"new_final_df.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:57:23.797204Z","iopub.execute_input":"2024-10-19T04:57:23.797893Z","iopub.status.idle":"2024-10-19T04:57:23.816147Z","shell.execute_reply.started":"2024-10-19T04:57:23.797849Z","shell.execute_reply":"2024-10-19T04:57:23.815148Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Function to detect and replace outliers\ndef detect_and_replace_outliers(df, label_col, method='median'):\n    # Get numeric columns and exclude the label column\n    numeric_columns = df.select_dtypes(include=['float64', 'int64']).columns\n    numeric_columns = numeric_columns.drop(label_col)  # Exclude the label column    \n    for col in numeric_columns:\n        # Calculate the first and third quartile (Q1 and Q3)\n        Q1 = df[col].quantile(0.25)\n        Q3 = df[col].quantile(0.75)\n        IQR = Q3 - Q1        \n        # Define the bounds for detecting outliers\n        lower_bound = Q1 - 1.5 * IQR\n        upper_bound = Q3 + 1.5 * IQR        \n        # Detect outliers\n        outliers = (df[col] < lower_bound) | (df[col] > upper_bound)        \n        # Replace outliers with the mean or median\n        if method == 'mean':\n            replacement_value = df[col].mean()\n        else:  # Default to 'median'\n            replacement_value = df[col].median()        \n        df.loc[outliers, col] = replacement_value        \n        print(f\"Outliers in '{col}' have been replaced with {method}.\")    \n    return df\n\n# Replace outliers in the DataFrame (excluding the 'sii' label column) with the median\nnew_final_df = detect_and_replace_outliers(new_final_df, label_col='sii', method='median')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:57:25.114768Z","iopub.execute_input":"2024-10-19T04:57:25.115523Z","iopub.status.idle":"2024-10-19T04:57:25.232714Z","shell.execute_reply.started":"2024-10-19T04:57:25.115453Z","shell.execute_reply":"2024-10-19T04:57:25.231552Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define your features and target variable\nX = new_final_df.drop(columns=['sii'])  # Features\ny = new_final_df['sii']  # Target\n\n# Split data into training and testing sets\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:57:36.479324Z","iopub.execute_input":"2024-10-19T04:57:36.479730Z","iopub.status.idle":"2024-10-19T04:57:36.490070Z","shell.execute_reply.started":"2024-10-19T04:57:36.479690Z","shell.execute_reply":"2024-10-19T04:57:36.489159Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Preprocessing for BERT: Convert features to string format\ntrain_strings = [\" \".join([f\"{col}: {val}\" for col, val in zip(X.columns, row)]) for row in X_train.values]\ntest_strings = [\" \".join([f\"{col}: {val}\" for col, val in zip(X.columns, row)]) for row in X_test.values]\n\n# Pretrained classifier with raw string data\nclassifier = keras_nlp.models.BertClassifier.from_preset(\n    \"bert_base_en\",\n    num_classes=len(np.unique(y)),  # Adjust based on your dataset\n)\n\n# Fit the classifier on the training data\nclassifier.fit(x=train_strings, y=y_train, batch_size=2, epochs=3)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T04:57:38.513016Z","iopub.execute_input":"2024-10-19T04:57:38.513443Z","iopub.status.idle":"2024-10-19T05:02:39.915430Z","shell.execute_reply.started":"2024-10-19T04:57:38.513408Z","shell.execute_reply":"2024-10-19T05:02:39.914358Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Predict on the test set\ny_pred_raw = classifier.predict(x=test_strings, batch_size=2)\nprint(\"Predictions on test data:\")\nprint(y_pred_raw)\n\n# Evaluation\nprint(\"BERT Classifier Classification Report:\")\nprint(classification_report(y_test, np.argmax(y_pred_raw, axis=1)))\nprint(f\"Accuracy: {accuracy_score(y_test, np.argmax(y_pred_raw, axis=1))}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-19T05:02:39.917475Z","iopub.execute_input":"2024-10-19T05:02:39.917963Z","iopub.status.idle":"2024-10-19T05:02:47.695775Z","shell.execute_reply.started":"2024-10-19T05:02:39.917893Z","shell.execute_reply":"2024-10-19T05:02:47.694735Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}