{"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":30804,"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 os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:10:24.110158Z","iopub.execute_input":"2024-12-05T10:10:24.111240Z","iopub.status.idle":"2024-12-05T10:10:28.813656Z","shell.execute_reply.started":"2024-12-05T10:10:24.111194Z","shell.execute_reply":"2024-12-05T10:10:28.812612Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom colorama import Fore, Style\n\nfrom lightgbm import LGBMRegressor\nfrom xgboost import XGBRegressor\n\nfrom sklearn.base import clone\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.impute import KNNImputer\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\nfrom scipy.optimize import minimize\nfrom sklearn.ensemble import VotingRegressor\n\nimport torch\nimport os\nimport torch.nn as nn\nfrom concurrent.futures import ThreadPoolExecutor\nimport torch.optim as optim\nfrom keras.optimizers import Adam\nfrom tqdm import tqdm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:11:00.696262Z","iopub.execute_input":"2024-12-05T10:11:00.697311Z","iopub.status.idle":"2024-12-05T10:11:02.241027Z","shell.execute_reply.started":"2024-12-05T10:11:00.697268Z","shell.execute_reply":"2024-12-05T10:11:02.239878Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\")\ndf = df.dropna(subset=['sii']) \ntest = pd.read_csv(\"/kaggle/input/child-mind-institute-problematic-internet-use/test.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:11:22.187596Z","iopub.execute_input":"2024-12-05T10:11:22.188814Z","iopub.status.idle":"2024-12-05T10:11:22.252184Z","shell.execute_reply.started":"2024-12-05T10:11:22.188770Z","shell.execute_reply":"2024-12-05T10:11:22.250817Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:11:31.815929Z","iopub.execute_input":"2024-12-05T10:11:31.816521Z","iopub.status.idle":"2024-12-05T10:11:31.855849Z","shell.execute_reply.started":"2024-12-05T10:11:31.816468Z","shell.execute_reply":"2024-12-05T10:11:31.854523Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:11:39.225242Z","iopub.execute_input":"2024-12-05T10:11:39.225658Z","iopub.status.idle":"2024-12-05T10:11:39.252093Z","shell.execute_reply.started":"2024-12-05T10:11:39.225624Z","shell.execute_reply":"2024-12-05T10:11:39.250934Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"season_mapping = {\n    'Winter': -1,\n    'Spring': -0.5,\n    'Summer': 0.5,\n    'Fall': 1\n}\n\n# mapping non-string values\ndf = df.replace(season_mapping)\ntest = test.replace(season_mapping)\n\n# dropping questions not in test dataset\ntest_missing_columns = set(df.columns) - set(test.columns)\nfor col in test_missing_columns:\n    if col != 'sii':  # Retain the target column for training\n        df.drop(columns=col, inplace=True)\n        \n# for later use\ntrain_ids = df['id']\ntest_ids = test['id']\ntrain_labels = df['sii']\ndf = df.drop(columns=['id'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:12:01.413869Z","iopub.execute_input":"2024-12-05T10:12:01.414300Z","iopub.status.idle":"2024-12-05T10:12:01.458569Z","shell.execute_reply.started":"2024-12-05T10:12:01.414263Z","shell.execute_reply":"2024-12-05T10:12:01.457440Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = df.drop(columns=['sii'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:15:03.538752Z","iopub.execute_input":"2024-12-05T10:15:03.539184Z","iopub.status.idle":"2024-12-05T10:15:03.546214Z","shell.execute_reply.started":"2024-12-05T10:15:03.539148Z","shell.execute_reply":"2024-12-05T10:15:03.545113Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"imputer = KNNImputer(n_neighbors=3)  \nimputed_data = imputer.fit_transform(df)\n\ntrain = pd.DataFrame(imputed_data, columns=df.columns)\ntrain[:5]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:15:14.714195Z","iopub.execute_input":"2024-12-05T10:15:14.715301Z","iopub.status.idle":"2024-12-05T10:15:17.267724Z","shell.execute_reply.started":"2024-12-05T10:15:14.715255Z","shell.execute_reply":"2024-12-05T10:15:17.266568Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def load_time_series(dirname) -> pd.DataFrame:\n    # opening parquet files and returning 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, 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    return df\n\ndef 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    return df.describe().values.reshape(-1), filename.split('=')[1]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:15:29.951755Z","iopub.execute_input":"2024-12-05T10:15:29.952457Z","iopub.status.idle":"2024-12-05T10:15:29.961058Z","shell.execute_reply.started":"2024-12-05T10:15:29.952394Z","shell.execute_reply":"2024-12-05T10:15:29.959778Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class AutoEncoder(nn.Module):\n    def __init__(self, input_dim, encoding_dim):\n        super(AutoEncoder, self).__init__()\n        self.encoder = nn.Sequential(\n            nn.Linear(input_dim, encoding_dim*3),\n            nn.ReLU(),\n            nn.Linear(encoding_dim*3, encoding_dim*2),\n            nn.ReLU(),\n            nn.Linear(encoding_dim*2, encoding_dim),\n            nn.ReLU()\n        )\n        self.decoder = nn.Sequential(\n            nn.Linear(encoding_dim, input_dim*2),\n            nn.ReLU(),\n            nn.Linear(input_dim*2, input_dim*3),\n            nn.ReLU(),\n            nn.Linear(input_dim*3, input_dim),\n            nn.Sigmoid()\n        )\n        \n    def forward(self, x):\n        encoded = self.encoder(x)\n        decoded = self.decoder(encoded)\n        return decoded","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:15:44.838464Z","iopub.execute_input":"2024-12-05T10:15:44.838879Z","iopub.status.idle":"2024-12-05T10:15:44.846416Z","shell.execute_reply.started":"2024-12-05T10:15:44.838843Z","shell.execute_reply":"2024-12-05T10:15:44.845410Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def perform_autoencoder(df, encoding_dim=50, epochs=50, batch_size=32):\n    scaler = StandardScaler()\n    df_scaled = scaler.fit_transform(df)\n    \n    data_tensor = torch.FloatTensor(df_scaled)\n    \n    input_dim = data_tensor.shape[1]\n    autoencoder = AutoEncoder(input_dim, encoding_dim)\n    \n    criterion = nn.MSELoss()\n    optimizer = optim.Adam(autoencoder.parameters())\n    \n    for epoch in range(epochs):\n        for i in range(0, len(data_tensor), batch_size):\n            batch = data_tensor[i : i + batch_size]\n            optimizer.zero_grad()\n            reconstructed = autoencoder(batch)\n            loss = criterion(reconstructed, batch)\n            loss.backward()\n            optimizer.step()\n            \n        if (epoch + 1) % 20 == 0:\n            print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}]')\n                 \n    with torch.no_grad():\n        encoded_data = autoencoder.encoder(data_tensor).numpy()\n        \n    df_encoded = pd.DataFrame(encoded_data, columns=[f'Enc_{i + 1}' for i in range(encoded_data.shape[1])])\n    \n    return df_encoded\n    ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:15:58.862511Z","iopub.execute_input":"2024-12-05T10:15:58.862945Z","iopub.status.idle":"2024-12-05T10:15:58.872423Z","shell.execute_reply.started":"2024-12-05T10:15:58.862908Z","shell.execute_reply":"2024-12-05T10:15:58.871263Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def quadratic_weighted_kappa(y_true, y_pred):\n    return cohen_kappa_score(y_true, y_pred, weights='quadratic')\n\n# threshold rounder\ndef threshold_Rounder(oof_non_rounded, thresholds):\n    return np.where(oof_non_rounded < thresholds[0], 0,\n                    np.where(oof_non_rounded < thresholds[1], 1,\n                             np.where(oof_non_rounded < thresholds[2], 2, 3)))\n# prediction evaluation using qwk function\ndef evaluate_predictions(thresholds, y_true, oof_non_rounded):\n    rounded_p = threshold_Rounder(oof_non_rounded, thresholds)\n    return -quadratic_weighted_kappa(y_true, rounded_p)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:16:16.814742Z","iopub.execute_input":"2024-12-05T10:16:16.815194Z","iopub.status.idle":"2024-12-05T10:16:16.821868Z","shell.execute_reply.started":"2024-12-05T10:16:16.815157Z","shell.execute_reply":"2024-12-05T10:16:16.820556Z"}},"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\")\nprint(f'Shape of Train : {train_ts.shape}')\nprint(f'Shape of Test : {test_ts.shape}')\n\ndf_train_ts = train_ts.drop('id', axis=1)\ndf_test_ts = test_ts.drop('id', axis=1)\n\ntrain_ts_encoded = perform_autoencoder(df_train_ts, encoding_dim=60, epochs=100, batch_size=32)\ntest_ts_encoded = perform_autoencoder(df_test_ts, encoding_dim=60, epochs=100, batch_size=32)\n\ntime_series_cols = train_ts_encoded.columns.tolist()\ntrain_ts_encoded[\"id\"]=train_ts[\"id\"]\ntest_ts_encoded['id']=test_ts[\"id\"]\n\ntrain['id'] = train_ids\ntest['id'] = test_ids\ntrain = pd.merge(train, train_ts_encoded, how=\"left\", on='id')\ntest = pd.merge(test, test_ts_encoded, how=\"left\", on='id')\n\ntrain[:5]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:16:25.072459Z","iopub.execute_input":"2024-12-05T10:16:25.073407Z","iopub.status.idle":"2024-12-05T10:18:03.397281Z","shell.execute_reply.started":"2024-12-05T10:16:25.073336Z","shell.execute_reply":"2024-12-05T10:18:03.395900Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# funciton that trains any regressor model using kfold cross validation, k hard coded = 5\ndef TrainML(model_class, test_data) -> list[int]:\n    global train\n    train = train.drop(columns=['id'])\n    X = train # .drop(['sii'], axis=1)\n    y = train_labels\n    n_splits=5\n    random_state=42\n       \n    scaler = StandardScaler()\n    \n    scaler.fit(X)\n\n\n    X = pd.DataFrame(scaler.transform(X), columns=X.columns)\n   \n    # ids are stored in test_ids variable\n    test_data = test_data.drop(columns='id')\n    test_data = pd.DataFrame(scaler.transform(test_data), columns=test_data.columns)\n    SKF = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=random_state)\n    \n    train_S = []\n    test_S = []\n    \n    oof_non_rounded = np.zeros(len(y), dtype=float) \n    oof_rounded = np.zeros(len(y), dtype=int) \n    test_preds = np.zeros((len(test_data), n_splits))\n\n    for fold, (train_idx, test_idx) in enumerate(tqdm(SKF.split(X, y), desc=\"Training Folds\", total=n_splits)):\n        X_train, X_val = X.iloc[train_idx], X.iloc[test_idx]\n        y_train, y_val = y.iloc[train_idx], y.iloc[test_idx]\n        model = clone(model_class)\n        model.fit(X_train, y_train)\n\n        y_train_pred = model.predict(X_train)\n        y_val_pred = model.predict(X_val)\n\n        oof_non_rounded[test_idx] = y_val_pred\n        y_val_pred_rounded = y_val_pred.round(0).astype(int)\n        oof_rounded[test_idx] = y_val_pred_rounded\n\n        train_kappa = quadratic_weighted_kappa(y_train, y_train_pred.round(0).astype(int))\n        val_kappa = quadratic_weighted_kappa(y_val, y_val_pred_rounded)\n\n        train_S.append(train_kappa)\n        test_S.append(val_kappa)\n        \n        test_preds[:, fold] = model.predict(test_data)\n        \n        print(f\"Fold {fold+1} - Train QWK: {train_kappa:.4f}, Validation QWK: {val_kappa:.4f}\")\n        \n    print(f\"Mean Train QWK --> {np.mean(train_S):.4f}\")\n    print(f\"Mean Validation QWK ---> {np.mean(test_S):.4f}\")\n\n    KappaOPtimizer = minimize(evaluate_predictions,\n                              x0=[0.5, 1.5, 2.5], args=(y, oof_non_rounded), \n                              method='Nelder-Mead')\n    assert KappaOPtimizer.success, \"Optimization did not converge.\"\n    \n    oof_tuned = threshold_Rounder(oof_non_rounded, KappaOPtimizer.x)\n    tKappa = quadratic_weighted_kappa(y, oof_tuned)\n\n    print(f\"----> || Optimized QWK SCORE :: {Fore.CYAN}{Style.BRIGHT} {tKappa:.3f}{Style.RESET_ALL}\")\n\n    tpm = test_preds.mean(axis=1)\n    tp_rounded = threshold_Rounder(tpm, KappaOPtimizer.x)\n    return tp_rounded.tolist()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:18:03.400064Z","iopub.execute_input":"2024-12-05T10:18:03.400744Z","iopub.status.idle":"2024-12-05T10:18:03.414853Z","shell.execute_reply.started":"2024-12-05T10:18:03.400706Z","shell.execute_reply":"2024-12-05T10:18:03.413612Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"LGBM_params = {\n    'n_estimators': 300,\n    'learning_rate': 0.01,\n    'max_depth': 12,\n    'num_leaves': 478,\n    'min_data_in_leaf': 13,\n    'feature_fraction': 0.893,\n    'bagging_fraction': 0.784,\n    'bagging_freq': 4,\n    'lambda_l1': 10,  \n    'lambda_l2': 0.01\n}\n\n\nXGB_Params = {\n    'learning_rate': 0.01,\n    'max_depth': 6,\n    'n_estimators': 300,\n    'subsample': 0.8,\n    'colsample_bytree': 0.8,\n    'reg_alpha': 1,  \n    'reg_lambda': 5,  \n    'random_state': 42,\n    'tree_method': 'exact'\n}\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:18:03.416257Z","iopub.execute_input":"2024-12-05T10:18:03.416969Z","iopub.status.idle":"2024-12-05T10:18:03.431702Z","shell.execute_reply.started":"2024-12-05T10:18:03.416928Z","shell.execute_reply":"2024-12-05T10:18:03.430684Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Light = LGBMRegressor(**LGBM_params, random_state=42, verbose=-1)\nXGB_Model = XGBRegressor(**XGB_Params)\n\nvoting_model = VotingRegressor(estimators=[\n    ('lightgbm', Light),\n    ('xgboost', XGB_Model),\n],\n     weights=[0.6, 0.3] \n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:18:03.433860Z","iopub.execute_input":"2024-12-05T10:18:03.434218Z","iopub.status.idle":"2024-12-05T10:18:03.447553Z","shell.execute_reply.started":"2024-12-05T10:18:03.434182Z","shell.execute_reply":"2024-12-05T10:18:03.446278Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"vote_preds = TrainML(model_class=voting_model, test_data=test)\nfinal_sub = pd.DataFrame({\n    \n    'id'   : test_ids,\n    'sii': vote_preds\n})\n\n\nfinal_sub.to_csv('submission.csv', index=False)\nfinal_sub","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:18:03.449212Z","iopub.execute_input":"2024-12-05T10:18:03.449562Z","iopub.status.idle":"2024-12-05T10:18:27.709227Z","shell.execute_reply.started":"2024-12-05T10:18:03.449529Z","shell.execute_reply":"2024-12-05T10:18:27.708139Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"final_sub.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T10:18:27.710609Z","iopub.execute_input":"2024-12-05T10:18:27.710935Z","iopub.status.idle":"2024-12-05T10:18:27.733087Z","shell.execute_reply.started":"2024-12-05T10:18:27.710903Z","shell.execute_reply":"2024-12-05T10:18:27.731864Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}