{"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":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-04T13:41:55.326775Z","iopub.execute_input":"2024-12-04T13:41:55.327474Z","iopub.status.idle":"2024-12-04T13:41:58.827814Z","shell.execute_reply.started":"2024-12-04T13:41:55.327433Z","shell.execute_reply":"2024-12-04T13:41:58.826736Z"}},"outputs":[],"execution_count":null},{"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-04T13:41:58.829949Z","iopub.execute_input":"2024-12-04T13:41:58.830417Z","iopub.status.idle":"2024-12-04T13:41:58.916694Z","shell.execute_reply.started":"2024-12-04T13:41:58.830351Z","shell.execute_reply":"2024-12-04T13:41:58.915663Z"}},"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        'metric'              :'rmse',\n        'objective'           :'regression',\n        'learning_rate'       : 0.04,\n        'max_depth'           : 12,\n        'num_leaves'          : 59,\n        'subsample'           : 0.70,\n        'colsample_bytree'    : 0.50,\n        'min_child_weight'    : 12, \n        'min_child_samples'   : 14,    \n        'reg_alpha'           : 0.23,\n        'reg_lambda'          : 0.36,\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-04T13:41:58.918179Z","iopub.execute_input":"2024-12-04T13:41:58.918651Z","iopub.status.idle":"2024-12-04T13:42:06.116712Z","shell.execute_reply.started":"2024-12-04T13:41:58.918604Z","shell.execute_reply":"2024-12-04T13:42:06.115576Z"}},"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-04T13:42:06.119752Z","iopub.execute_input":"2024-12-04T13:42:06.120224Z","iopub.status.idle":"2024-12-04T13:42:06.127450Z","shell.execute_reply.started":"2024-12-04T13:42:06.120163Z","shell.execute_reply":"2024-12-04T13:42:06.126455Z"}},"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-04T13:42:06.128626Z","iopub.execute_input":"2024-12-04T13:42:06.128959Z","iopub.status.idle":"2024-12-04T13:42:06.150086Z","shell.execute_reply.started":"2024-12-04T13:42:06.128929Z","shell.execute_reply":"2024-12-04T13:42:06.148996Z"}},"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-04T13:42:06.151032Z","iopub.execute_input":"2024-12-04T13:42:06.151361Z","iopub.status.idle":"2024-12-04T13:42:06.171271Z","shell.execute_reply.started":"2024-12-04T13:42:06.151330Z","shell.execute_reply":"2024-12-04T13:42:06.170299Z"}},"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-04T13:42:06.172699Z","iopub.execute_input":"2024-12-04T13:42:06.173134Z","iopub.status.idle":"2024-12-04T13:42:10.949243Z","shell.execute_reply.started":"2024-12-04T13:42:06.173089Z","shell.execute_reply":"2024-12-04T13:42:10.948148Z"}},"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-04T13:42:10.950526Z","iopub.execute_input":"2024-12-04T13:42:10.950844Z","iopub.status.idle":"2024-12-04T13:42:10.980120Z","shell.execute_reply.started":"2024-12-04T13:42:10.950811Z","shell.execute_reply":"2024-12-04T13:42:10.978888Z"}},"outputs":[],"execution_count":null},{"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-04T13:42:10.981336Z","iopub.execute_input":"2024-12-04T13:42:10.981643Z","iopub.status.idle":"2024-12-04T13:42:10.994669Z","shell.execute_reply.started":"2024-12-04T13:42:10.981614Z","shell.execute_reply":"2024-12-04T13:42:10.993628Z"}},"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-04T13:42:10.998623Z","iopub.execute_input":"2024-12-04T13:42:10.999118Z","iopub.status.idle":"2024-12-04T13:44:59.791675Z","shell.execute_reply.started":"2024-12-04T13:42:10.999083Z","shell.execute_reply":"2024-12-04T13:44:59.790143Z"}},"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-04T13:44:59.793816Z","iopub.execute_input":"2024-12-04T13:44:59.794520Z","iopub.status.idle":"2024-12-04T13:44:59.824952Z","shell.execute_reply.started":"2024-12-04T13:44:59.794468Z","shell.execute_reply":"2024-12-04T13:44:59.823257Z"}},"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-04T13:44:59.826519Z","iopub.execute_input":"2024-12-04T13:44:59.827708Z","iopub.status.idle":"2024-12-04T13:44:59.845178Z","shell.execute_reply.started":"2024-12-04T13:44:59.827653Z","shell.execute_reply":"2024-12-04T13:44:59.843830Z"}},"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-04T13:44:59.847173Z","iopub.execute_input":"2024-12-04T13:44:59.847896Z","iopub.status.idle":"2024-12-04T13:44:59.863315Z","shell.execute_reply.started":"2024-12-04T13:44:59.847849Z","shell.execute_reply":"2024-12-04T13:44:59.862294Z"}},"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-04T13:44:59.865081Z","iopub.execute_input":"2024-12-04T13:44:59.865426Z","iopub.status.idle":"2024-12-04T13:45:00.039687Z","shell.execute_reply.started":"2024-12-04T13:44:59.865368Z","shell.execute_reply":"2024-12-04T13:45:00.038430Z"}},"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-04T13:45:00.041229Z","iopub.execute_input":"2024-12-04T13:45:00.041713Z","iopub.status.idle":"2024-12-04T13:45:00.063245Z","shell.execute_reply.started":"2024-12-04T13:45:00.041661Z","shell.execute_reply":"2024-12-04T13:45:00.061640Z"}},"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-04T13:45:00.064869Z","iopub.execute_input":"2024-12-04T13:45:00.065340Z","iopub.status.idle":"2024-12-04T13:45:00.089976Z","shell.execute_reply.started":"2024-12-04T13:45:00.065290Z","shell.execute_reply":"2024-12-04T13:45:00.088464Z"}},"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-04T13:45:00.091703Z","iopub.execute_input":"2024-12-04T13:45:00.092067Z","iopub.status.idle":"2024-12-04T13:45:02.751820Z","shell.execute_reply.started":"2024-12-04T13:45:00.092034Z","shell.execute_reply":"2024-12-04T13:45:02.750720Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred = model.predict(XX)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-04T13:45:02.753592Z","iopub.execute_input":"2024-12-04T13:45:02.753956Z","iopub.status.idle":"2024-12-04T13:45:02.766775Z","shell.execute_reply.started":"2024-12-04T13:45:02.753922Z","shell.execute_reply":"2024-12-04T13:45:02.765346Z"}},"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,"execution":{"iopub.status.busy":"2024-12-04T13:45:02.768810Z","iopub.execute_input":"2024-12-04T13:45:02.769632Z","iopub.status.idle":"2024-12-04T13:45:02.783379Z","shell.execute_reply.started":"2024-12-04T13:45:02.769580Z","shell.execute_reply":"2024-12-04T13:45:02.782110Z"}},"outputs":[],"execution_count":null}]}