{"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 numpy as np\nimport pandas as pd\n\ntrain_data = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv', index_col='id')\ntest_data = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv', index_col='id')\n\ntrain_data.shape, test_data.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:15:46.178024Z","iopub.execute_input":"2024-12-04T12:15:46.178377Z","iopub.status.idle":"2024-12-04T12:15:46.223153Z","shell.execute_reply.started":"2024-12-04T12:15:46.178344Z","shell.execute_reply":"2024-12-04T12:15:46.222367Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.impute import KNNImputer\nfrom lightgbm import LGBMRegressor\n\ndef filling_sii(data):\n    # Filling missing data\n    num_imputer = KNNImputer(n_neighbors=2, weights=\"uniform\")\n    \n    features = data.columns.tolist()\n        \n    num_features = [f for f in features if data[f].dtype == 'float' or f == 'Basic_Demos-Age']\n    impute_features = [f for f in num_features if f != 'sii']\n    \n    num_imputer.fit(data[impute_features])\n    data[impute_features] = num_imputer.transform(data[impute_features])\n    \n    cat_features = [f for f in features if f not in num_features and f != 'sii']\n    \n    for cat in cat_features:\n        data[cat] = data[cat].fillna('unknown')\n        data[cat] = data[cat].astype('category')\n\n    # Data preparation\n    train_sii = data[data['sii'].notna()].copy()\n    test_sii = data[data['sii'].isnull()].copy()\n    \n    y_sii = train_sii['sii'].copy()\n    X_sii = train_sii.drop('sii', axis=1).copy()\n    test_X_sii = test_sii.drop('sii', axis=1).copy()\n\n    # Modeling\n    lgbm_params = {\n        'learning_rate': 0.046,\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    model = LGBMRegressor(**lgbm_params, verbose=-1)\n    model.fit(X_sii, y_sii)\n\n    pred = model.predict(test_X_sii)\n\n    # Data setting\n    X_sii['sii'] = y_sii.copy()\n    test_X_sii['sii'] = np.round(pred.copy())\n    \n    sii_impute = pd.concat([X_sii, test_X_sii], axis=0)\n    sii_impute.sort_index(axis=0, inplace=True)\n    \n    return sii_impute['sii']\n\ntrain_data['sii'] = filling_sii(train_data.copy())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:15:48.134818Z","iopub.execute_input":"2024-12-04T12:15:48.135158Z","iopub.status.idle":"2024-12-04T12:15:57.676737Z","shell.execute_reply.started":"2024-12-04T12:15:48.135125Z","shell.execute_reply":"2024-12-04T12:15:57.675584Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_col = train_data.columns.tolist()\ntest_col = test_data.columns.tolist()\n\nfeatures = test_col.copy()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:16:00.670420Z","iopub.execute_input":"2024-12-04T12:16:00.671270Z","iopub.status.idle":"2024-12-04T12:16:00.675314Z","shell.execute_reply.started":"2024-12-04T12:16:00.671234Z","shell.execute_reply":"2024-12-04T12:16:00.674418Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"main_df = pd.concat([train_data[features], test_data], axis=0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:16:02.641927Z","iopub.execute_input":"2024-12-04T12:16:02.642894Z","iopub.status.idle":"2024-12-04T12:16:02.654026Z","shell.execute_reply.started":"2024-12-04T12:16:02.642841Z","shell.execute_reply":"2024-12-04T12:16:02.652727Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"num_features = [f for f in features if train_data[f].dtype == 'float' or f=='Basic_Demos-Age']\ncat_features = [f for f in features if f not in num_features]\n\nlen(cat_features), len(num_features)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:16:04.589853Z","iopub.execute_input":"2024-12-04T12:16:04.590529Z","iopub.status.idle":"2024-12-04T12:16:04.598738Z","shell.execute_reply.started":"2024-12-04T12:16:04.590483Z","shell.execute_reply":"2024-12-04T12:16:04.597949Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def handling_nulls(df):\n    imputer = KNNImputer(n_neighbors=2, weights=\"uniform\")\n\n    imputer.fit(df[num_features])\n    df[num_features] = imputer.transform(df[num_features])\n\n    for cat in cat_features:\n        df[cat] = df[cat].fillna('unknown')\n        df[cat] = df[cat].astype('category')\n\n    return df\n\nmain_df = handling_nulls(main_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:16:06.306948Z","iopub.execute_input":"2024-12-04T12:16:06.307621Z","iopub.status.idle":"2024-12-04T12:16:10.705811Z","shell.execute_reply.started":"2024-12-04T12:16:06.307588Z","shell.execute_reply":"2024-12-04T12:16:10.704931Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import MinMaxScaler\n\ndf_code = pd.get_dummies(main_df, columns=cat_features)\n\nscaler = MinMaxScaler()\ndf_code[num_features] = scaler.fit_transform(df_code[num_features])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:16:12.990662Z","iopub.execute_input":"2024-12-04T12:16:12.990960Z","iopub.status.idle":"2024-12-04T12:16:13.019077Z","shell.execute_reply.started":"2024-12-04T12:16:12.990935Z","shell.execute_reply":"2024-12-04T12:16:13.018137Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Time series","metadata":{}},{"cell_type":"code","source":"from tqdm import tqdm\nfrom IPython.display import clear_output\nfrom concurrent.futures import ThreadPoolExecutor\nimport os\n\nimport warnings\nwarnings.filterwarnings('ignore')\npd.options.display.max_columns = None","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:16:15.393714Z","iopub.execute_input":"2024-12-04T12:16:15.394494Z","iopub.status.idle":"2024-12-04T12:16:15.398780Z","shell.execute_reply.started":"2024-12-04T12:16:15.394461Z","shell.execute_reply":"2024-12-04T12:16:15.397897Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def process_file(filename, dirname):\n    data = pd.read_parquet(os.path.join(dirname, filename, 'part-0.parquet'))\n    data.drop('step', axis=1, inplace=True)\n    return data.describe().values.reshape(-1), 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    stats, indexes = zip(*results)\n    \n    data = pd.DataFrame(stats, columns=[f\"stat_{i}\" for i in range(len(stats[0]))])\n    data['id'] = indexes\n    return data\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')\n\ntime_series_cols = train_ts.columns.tolist()\ntime_series_cols.remove('id')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:16:17.674048Z","iopub.execute_input":"2024-12-04T12:16:17.674451Z","iopub.status.idle":"2024-12-04T12:17:34.035780Z","shell.execute_reply.started":"2024-12-04T12:16:17.674389Z","shell.execute_reply":"2024-12-04T12:17:34.034911Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_main_ts = pd.concat([train_ts, test_ts], axis=0)\n\nscaler = MinMaxScaler()\ndf_main_ts[time_series_cols] = scaler.fit_transform(df_main_ts[time_series_cols])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:17:36.245807Z","iopub.execute_input":"2024-12-04T12:17:36.246136Z","iopub.status.idle":"2024-12-04T12:17:36.266461Z","shell.execute_reply.started":"2024-12-04T12:17:36.246106Z","shell.execute_reply":"2024-12-04T12:17:36.265791Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_code = df_code.reset_index()\n\ntrain_df = df_code[:3960].copy()\ntest_df = df_code[3960:].copy()\n\ntrain_df.shape, test_df.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:17:39.451172Z","iopub.execute_input":"2024-12-04T12:17:39.451754Z","iopub.status.idle":"2024-12-04T12:17:39.486465Z","shell.execute_reply.started":"2024-12-04T12:17:39.451697Z","shell.execute_reply":"2024-12-04T12:17:39.484347Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_ts = df_main_ts[:996].copy()\ntest_ts = df_main_ts[996:].copy()\n\ntrain_ts.shape, test_ts.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:17:40.999025Z","iopub.execute_input":"2024-12-04T12:17:40.999932Z","iopub.status.idle":"2024-12-04T12:17:41.012174Z","shell.execute_reply.started":"2024-12-04T12:17:40.999875Z","shell.execute_reply":"2024-12-04T12:17:41.011218Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"main_train_data = pd.merge(train_df, train_ts, how='left', on='id')\nmain_test_data = pd.merge(test_df, test_ts, how='left', on='id')\n\nfor col in time_series_cols:\n    \n    main_train_data[col] = main_train_data[col].fillna(main_train_data[col].median())\n    main_test_data[col] = main_test_data[col].fillna(main_test_data[col].median())\n\nmain_train_data.shape, main_test_data.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:17:43.078220Z","iopub.execute_input":"2024-12-04T12:17:43.079762Z","iopub.status.idle":"2024-12-04T12:17:43.185959Z","shell.execute_reply.started":"2024-12-04T12:17:43.079711Z","shell.execute_reply":"2024-12-04T12:17:43.184985Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y = train_data['sii'].copy()\nX = main_train_data.drop('id', axis=1)\nXX = main_test_data.drop('id', axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:17:45.466108Z","iopub.execute_input":"2024-12-04T12:17:45.466518Z","iopub.status.idle":"2024-12-04T12:17:45.574167Z","shell.execute_reply.started":"2024-12-04T12:17:45.466460Z","shell.execute_reply":"2024-12-04T12:17:45.573484Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train, X_test, y_train, y_test = train_test_split(X, y)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:17:47.794913Z","iopub.execute_input":"2024-12-04T12:17:47.795345Z","iopub.status.idle":"2024-12-04T12:17:47.815749Z","shell.execute_reply.started":"2024-12-04T12:17:47.795286Z","shell.execute_reply":"2024-12-04T12:17:47.814701Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lgbm_params = {  \n    'learning_rate': 0.046,\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\nmodel = LGBMRegressor(**lgbm_params, verbose=-1)\n\nmodel.fit(X, y)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:37:05.040640Z","iopub.execute_input":"2024-12-04T12:37:05.041610Z","iopub.status.idle":"2024-12-04T12:37:06.947222Z","shell.execute_reply.started":"2024-12-04T12:37:05.041561Z","shell.execute_reply":"2024-12-04T12:37:06.946151Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred = model.predict(XX)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T12:37:09.629632Z","iopub.execute_input":"2024-12-04T12:37:09.630356Z","iopub.status.idle":"2024-12-04T12:37:09.680883Z","shell.execute_reply.started":"2024-12-04T12:37:09.630323Z","shell.execute_reply":"2024-12-04T12:37:09.680002Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sub = pd.DataFrame({'id': main_test_data['id'], 'sii': np.round(pred)})\nsub.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}