{"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":"\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os\nfrom concurrent.futures import ThreadPoolExecutor\nfrom tqdm import tqdm","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-11-13T13:14:04.195766Z","iopub.execute_input":"2024-11-13T13:14:04.196260Z","iopub.status.idle":"2024-11-13T13:14:04.201959Z","shell.execute_reply.started":"2024-11-13T13:14:04.196220Z","shell.execute_reply":"2024-11-13T13:14:04.200625Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pip install tensorflow","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T13:14:04.211867Z","iopub.execute_input":"2024-11-13T13:14:04.213033Z","iopub.status.idle":"2024-11-13T13:14:37.704335Z","shell.execute_reply.started":"2024-11-13T13:14:04.212984Z","shell.execute_reply":"2024-11-13T13:14:37.702791Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_csv=pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest_csv=pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:14:37.707398Z","iopub.execute_input":"2024-11-13T13:14:37.707863Z","iopub.status.idle":"2024-11-13T13:14:37.798057Z","shell.execute_reply.started":"2024-11-13T13:14:37.707820Z","shell.execute_reply":"2024-11-13T13:14:37.796859Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_csv.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:14:37.799793Z","iopub.execute_input":"2024-11-13T13:14:37.800785Z","iopub.status.idle":"2024-11-13T13:14:37.839572Z","shell.execute_reply.started":"2024-11-13T13:14:37.800724Z","shell.execute_reply":"2024-11-13T13:14:37.838262Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Loading train and test series parquet files and creating column for the mean, std deviation, median, minmum and maximum values","metadata":{}},{"cell_type":"code","source":"def process_file(filename, dirname):\n    df = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    df.drop('step', axis=1, inplace=True)\n\n    stats = {}\n    for col in df.columns:\n        stats[f'mean_{col}'] = df[col].mean()\n        stats[f'std_dev_{col}'] = df[col].std()\n        stats[f'median_{col}'] = df[col].median()\n        stats[f'min_{col}'] = df[col].min()\n        stats[f'max_{col}'] = df[col].max()\n        \n    return stats, filename.split('=')[1]\n\ndef load_time_series(dirname) -> pd.DataFrame:\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_list = []\n    for stats, id in results:\n        stats['id'] = id\n        stats_list.append(stats)\n\n    df = pd.DataFrame(stats_list)\n    return df\n\ntrain_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\")","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:14:37.841544Z","iopub.execute_input":"2024-11-13T13:14:37.842285Z","iopub.status.idle":"2024-11-13T13:15:43.536810Z","shell.execute_reply.started":"2024-11-13T13:14:37.842230Z","shell.execute_reply":"2024-11-13T13:15:43.535687Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_ts.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:43.540591Z","iopub.execute_input":"2024-11-13T13:15:43.540970Z","iopub.status.idle":"2024-11-13T13:15:43.569219Z","shell.execute_reply.started":"2024-11-13T13:15:43.540933Z","shell.execute_reply":"2024-11-13T13:15:43.568105Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Merging train and test csv and train and test time series data sets","metadata":{}},{"cell_type":"code","source":"train = pd.merge(train_csv, train_ts, how=\"left\", on='id')\ntest = pd.merge(test_csv, test_ts, how=\"left\", on='id')\n\ntrain1 = train.drop('id', axis=1)\ntest = test.drop('id', axis=1)\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:43.570959Z","iopub.execute_input":"2024-11-13T13:15:43.571961Z","iopub.status.idle":"2024-11-13T13:15:43.598489Z","shell.execute_reply.started":"2024-11-13T13:15:43.571904Z","shell.execute_reply":"2024-11-13T13:15:43.597506Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train1['sii'].isnull().sum()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:43.599741Z","iopub.execute_input":"2024-11-13T13:15:43.600107Z","iopub.status.idle":"2024-11-13T13:15:43.608453Z","shell.execute_reply.started":"2024-11-13T13:15:43.600068Z","shell.execute_reply":"2024-11-13T13:15:43.607056Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train1.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:43.609910Z","iopub.execute_input":"2024-11-13T13:15:43.610659Z","iopub.status.idle":"2024-11-13T13:15:43.638371Z","shell.execute_reply.started":"2024-11-13T13:15:43.610611Z","shell.execute_reply":"2024-11-13T13:15:43.637197Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Dropping features that are missing from test data from train data # ","metadata":{}},{"cell_type":"code","source":"mismatched_features = set(train1.columns) - set(test.columns)\n\n# Specify the column to keep\ncolumn_to_keep = 'sii'  # Replace with the actual column name\n\n# Remove the column_to_keep from the mismatched features set\nmismatched_features.remove(column_to_keep)\n\n# Drop mismatched features from train1, except for the specified column\ntrain1 = train1.drop(columns=mismatched_features)","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:43.639756Z","iopub.execute_input":"2024-11-13T13:15:43.640151Z","iopub.status.idle":"2024-11-13T13:15:43.650713Z","shell.execute_reply.started":"2024-11-13T13:15:43.640100Z","shell.execute_reply":"2024-11-13T13:15:43.649419Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train1.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:43.652309Z","iopub.execute_input":"2024-11-13T13:15:43.653116Z","iopub.status.idle":"2024-11-13T13:15:43.683821Z","shell.execute_reply.started":"2024-11-13T13:15:43.653049Z","shell.execute_reply":"2024-11-13T13:15:43.682452Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Filling missing values for numerical features by mean and categorical features by word 'missing' and for target feature 'sii' with mode","metadata":{}},{"cell_type":"code","source":"\nimport pandas as pd\n\ndef input_missing_values(df):\n  \"\"\"\n  Imputes missing values in a DataFrame.\n\n  Args:\n    df: The DataFrame with missing values.\n\n  Returns:\n    The DataFrame with imputed missing values.\n  \"\"\"\n\n  for col in df.columns:\n    if col == 'sii':  # Special handling for the 'sii' column\n      df[col].fillna(df[col].mode()[0], inplace=True)\n    elif df[col].dtype == 'object':  # Categorical column\n      df[col].fillna('missing', inplace=True)\n    else:  # Numerical column (except 'sii')\n      df[col].fillna(df[col].mean(), inplace=True)\n\n  return df\n\n\ntrain1 = input_missing_values(train1)\ntrain1.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:43.685576Z","iopub.execute_input":"2024-11-13T13:15:43.686722Z","iopub.status.idle":"2024-11-13T13:15:43.765421Z","shell.execute_reply.started":"2024-11-13T13:15:43.686658Z","shell.execute_reply":"2024-11-13T13:15:43.764086Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Manually Encoding categorical features and numerical feutures with standard scaler","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\n\n# Define the seasonal values and manually encode the seasonal features\nseasonal_values = ['Spring', 'Summer', 'Fall', 'Winter', 'missing']\n\n# Manually encode the categorical seasonal features\nfor column in train1.select_dtypes(include='object').columns:\n    if set(train1[column].unique()).issubset(seasonal_values):\n        train1[column] = train1[column].map(\n            {value: i for i, value in enumerate(seasonal_values)}\n        )\n\n# Separate the target column \ntarget_column = 'sii'\nX = train1.drop(columns=[target_column])  # Drop the target column\ny = train1[target_column]  # Separate the target column\n\n# Select numerical columns only\nnumerical_cols = X.select_dtypes(include=['float64', 'int64']).columns\n\n# Initialize the standard scaler and apply it to the numerical features\nscaler = StandardScaler()\nX[numerical_cols] = scaler.fit_transform(X[numerical_cols])\n\n# Combine the scaled features with the target column\ntrain1_scaled = X.join(y)\n\n# Print the scaled DataFrame with column headers\ntrain1_scaled\n","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:43.766822Z","iopub.execute_input":"2024-11-13T13:15:43.767194Z","iopub.status.idle":"2024-11-13T13:15:43.851370Z","shell.execute_reply.started":"2024-11-13T13:15:43.767157Z","shell.execute_reply":"2024-11-13T13:15:43.850202Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Import necessary libraries\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport scipy.stats as stats\n\n# Assume TrainData is your dataframe containing only numerical data\n# Calculate Z-scores for all columns\nz_scores = train1_scaled.apply(stats.zscore)\n\n# Define outlier threshold\nthreshold = 3\n\n# Identify outliers\noutliers = (z_scores > threshold) | (z_scores < -threshold)\n\n# Create a copy of the data without outliers\nTrain3 = train1_scaled[(~outliers).all(axis=1)]\n\n# Plot box plots before and after outlier removal\nfig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 6))\nfig.suptitle(\"Box Plots Before and After Outlier Removal\")\n\n# Box plot before outlier removal\naxes[0].boxplot(train1_scaled.values, vert=False)\naxes[0].set_title(\"Before Outlier Removal\")\naxes[0].set_yticklabels(train1_scaled.columns)\n\n# Box plot after outlier removal\naxes[1].boxplot(Train3.values, vert=False)\naxes[1].set_title(\"After Outlier Removal\")\naxes[1].set_yticklabels(train1_scaled.columns)\n\n# Show plot\nplt.tight_layout()\nplt.show()\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-13T13:15:43.852832Z","iopub.execute_input":"2024-11-13T13:15:43.853261Z","iopub.status.idle":"2024-11-13T13:15:48.408885Z","shell.execute_reply.started":"2024-11-13T13:15:43.853221Z","shell.execute_reply":"2024-11-13T13:15:48.407538Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = Train3.drop('sii',axis=1)\ny = Train3['sii']","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:48.412680Z","iopub.execute_input":"2024-11-13T13:15:48.413097Z","iopub.status.idle":"2024-11-13T13:15:48.420031Z","shell.execute_reply.started":"2024-11-13T13:15:48.413048Z","shell.execute_reply":"2024-11-13T13:15:48.418857Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y.value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:48.421313Z","iopub.execute_input":"2024-11-13T13:15:48.421697Z","iopub.status.idle":"2024-11-13T13:15:48.436401Z","shell.execute_reply.started":"2024-11-13T13:15:48.421659Z","shell.execute_reply":"2024-11-13T13:15:48.435130Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Handling imbalanced for target feature 'sii' using SMOTE technique","metadata":{}},{"cell_type":"code","source":"import imblearn\nfrom imblearn.over_sampling import SMOTE\n\nsmote = SMOTE(random_state=42)\nX_balanced, y_balanced = smote.fit_resample(X, y)\n\ny_balanced.value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:48.438001Z","iopub.execute_input":"2024-11-13T13:15:48.439127Z","iopub.status.idle":"2024-11-13T13:15:48.658775Z","shell.execute_reply.started":"2024-11-13T13:15:48.439085Z","shell.execute_reply":"2024-11-13T13:15:48.657585Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Training the data using ensemble method ","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, GradientBoostingClassifier, ExtraTreesClassifier, VotingClassifier\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report\n\n\n# Split data into training and testing sets\nX_train, X_test, y_train, y_test = train_test_split(X_balanced, y_balanced, test_size=0.2, random_state=42)\n\n# Define individual models\nrf_model = RandomForestClassifier(random_state=42)\nada_model = AdaBoostClassifier(random_state=42)\ngb_model = GradientBoostingClassifier(random_state=42)\net_model = ExtraTreesClassifier(random_state=42)\n\n# Create ensemble models (voting, averaging, stacking)\nvoting_model = VotingClassifier(estimators=[('rf', rf_model), ('ada', ada_model), ('gb', gb_model), ('et', et_model)], voting='hard')\n# averaging_model = AveragingClassifier(estimators=[rf_model, ada_model, gb_model, et_model])  # Requires installation of scikit-learn-contrib-ensemble\n# stacking_model = StackingClassifier(estimators=[('rf', rf_model), ('ada', ada_model), ('gb', gb_model)], final_estimator=LogisticRegression())  # Requires installation of scikit-learn-contrib-ensemble\n\n# Train models\nmodels = [rf_model, ada_model, gb_model, et_model, voting_model]  # Add averaging_model and stacking_model if installed\nfor model in models:\n    model.fit(X_train, y_train)\n\n# Make predictions\npredictions = {}\nfor model in models:\n    predictions[model.__class__.__name__] = model.predict(X_test)\n\n# Evaluate metrics\nfor model_name, y_pred in predictions.items():\n    accuracy = accuracy_score(y_test, y_pred)\n    precision = precision_score(y_test, y_pred, average='weighted')\n    recall = recall_score(y_test, y_pred, average='weighted')\n    f1 = f1_score(y_test, y_pred, average='weighted')\n\n    print(f\"\\n{model_name}\")\n    print(\"Accuracy:\", accuracy)\n    print(\"Precision:\", precision)\n    print(\"Recall:\", recall)\n    print(\"F1-score:\", f1)\n    print(classification_report(y_test, y_pred))","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:15:48.660017Z","iopub.execute_input":"2024-11-13T13:15:48.660389Z","iopub.status.idle":"2024-11-13T13:16:25.097870Z","shell.execute_reply.started":"2024-11-13T13:15:48.660333Z","shell.execute_reply":"2024-11-13T13:16:25.096457Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:16:25.099401Z","iopub.execute_input":"2024-11-13T13:16:25.099794Z","iopub.status.idle":"2024-11-13T13:16:25.128184Z","shell.execute_reply.started":"2024-11-13T13:16:25.099747Z","shell.execute_reply":"2024-11-13T13:16:25.126945Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Handling missing values for test data by calling the function 'input_missing_values' created for train data","metadata":{}},{"cell_type":"code","source":"test1 = input_missing_values(test)","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:16:25.130016Z","iopub.execute_input":"2024-11-13T13:16:25.130917Z","iopub.status.idle":"2024-11-13T13:16:25.177928Z","shell.execute_reply.started":"2024-11-13T13:16:25.130863Z","shell.execute_reply":"2024-11-13T13:16:25.176686Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Encoding categorical features for test data","metadata":{}},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\n\n# Define the seasonal values\nseasonal_values = ['Spring', 'Summer', 'Fall', 'Winter', 'missing']\n\n# Manually encode the seasonal features\nfor column in test.select_dtypes(include='object').columns:\n    if set(test1[column].unique()).issubset(seasonal_values):\n        test1[column] = test1[column].map(\n            {value: i for i, value in enumerate(seasonal_values)}\n        )\n\n# Initialize the StandardScaler\nscaler = StandardScaler()\n\n# Identify numerical columns\nnumerical_columns = test1.select_dtypes(include=['float64', 'int64']).columns\n\n# Scale numerical features and retain column names\ntest1[numerical_columns] = scaler.fit_transform(test1[numerical_columns])\n\n\n\ntest1.head()","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:16:25.179449Z","iopub.execute_input":"2024-11-13T13:16:25.179934Z","iopub.status.idle":"2024-11-13T13:16:25.240809Z","shell.execute_reply.started":"2024-11-13T13:16:25.179880Z","shell.execute_reply":"2024-11-13T13:16:25.239738Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Encoding the test data","metadata":{}},{"cell_type":"markdown","source":"# Predicting the test data using trainned voting model ","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"prediction =voting_model.predict(test1)\nprediction","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:16:25.242286Z","iopub.execute_input":"2024-11-13T13:16:25.242713Z","iopub.status.idle":"2024-11-13T13:16:25.292745Z","shell.execute_reply.started":"2024-11-13T13:16:25.242674Z","shell.execute_reply":"2024-11-13T13:16:25.291413Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Creating submission file using the predicted values","metadata":{}},{"cell_type":"code","source":"sub = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv')\nsub['sii'] = prediction\nsub.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-11-13T13:16:25.294296Z","iopub.execute_input":"2024-11-13T13:16:25.294682Z","iopub.status.idle":"2024-11-13T13:16:25.308794Z","shell.execute_reply.started":"2024-11-13T13:16:25.294644Z","shell.execute_reply":"2024-11-13T13:16:25.307651Z"},"trusted":true},"outputs":[],"execution_count":null}]}