{"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"},{"sourceId":8718644,"sourceType":"datasetVersion","datasetId":5231253}],"dockerImageVersionId":30762,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import re\nimport copy\nimport numpy as np\nimport pandas as pd\nimport polars as pl\nfrom tqdm import tqdm\nfrom functools import partial\nfrom pathlib import Path\nfrom concurrent.futures import ThreadPoolExecutor\nfrom sklearn.preprocessing import LabelEncoder, OneHotEncoder\nimport os\nimport glob","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-10-17T22:51:04.040374Z","iopub.execute_input":"2024-10-17T22:51:04.041042Z","iopub.status.idle":"2024-10-17T22:51:05.920568Z","shell.execute_reply.started":"2024-10-17T22:51:04.040998Z","shell.execute_reply":"2024-10-17T22:51:05.919555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Targets = [\"sii\"]\n\ndef apply_label_encoding(df, columns):\n    le = LabelEncoder()\n    for col in columns:\n        df[col] = le.fit_transform(df[col].astype(str))\n    return df\n\ndef convert_non_numeric_to_numeric(df, preserve_columns):\n    columns_to_encode = df.select_dtypes(include=['object', 'category']).columns.difference(preserve_columns)\n    df = apply_label_encoding(df, columns_to_encode)\n    return df\n\ndef load_df(train_path, test_path, target_cols):\n    \n    df_train_temp = pl.read_csv(train_path)\n    df_test_temp = pl.read_csv(test_path)\n    \n    common_columns = list(set(df_train_temp.columns) & set(df_test_temp.columns))\n    \n    common_columns_train = common_columns + [col for col in target_cols if col in df_train_temp.columns]\n\n    df_train = pl.read_csv(train_path, columns=common_columns_train).to_pandas()\n    df_test = pl.read_csv(test_path, columns=common_columns).to_pandas()\n    \n    return df_train, df_test\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]\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, 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    \n    return df\n\n# Usage example (specify your actual file paths here)\ntrain_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/train.csv\"\ntest_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/test.csv\"\nseries_train_dir = '/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet'\nseries_test_dir = '/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet'\n\ndf_train, df_test = load_df(train_path, test_path, Targets)\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\")\ntime_series_cols = train_ts.columns.tolist()\ntime_series_cols.remove(\"id\")\n\ntrain = pd.merge(df_train, train_ts, how=\"left\", on='id')\ntest = pd.merge(df_test, test_ts, how=\"left\", on='id')\n","metadata":{"execution":{"iopub.status.busy":"2024-10-17T22:51:05.922737Z","iopub.execute_input":"2024-10-17T22:51:05.923306Z","iopub.status.idle":"2024-10-17T22:52:32.88025Z","shell.execute_reply.started":"2024-10-17T22:51:05.92326Z","shell.execute_reply":"2024-10-17T22:52:32.879147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train","metadata":{"execution":{"iopub.status.busy":"2024-10-17T22:52:32.881769Z","iopub.execute_input":"2024-10-17T22:52:32.88247Z","iopub.status.idle":"2024-10-17T22:52:32.91973Z","shell.execute_reply.started":"2024-10-17T22:52:32.882422Z","shell.execute_reply":"2024-10-17T22:52:32.918731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = train\ndf_test = test","metadata":{"execution":{"iopub.status.busy":"2024-10-17T22:52:32.922386Z","iopub.execute_input":"2024-10-17T22:52:32.922904Z","iopub.status.idle":"2024-10-17T22:52:32.927392Z","shell.execute_reply.started":"2024-10-17T22:52:32.92285Z","shell.execute_reply":"2024-10-17T22:52:32.926301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preserve_columns = [\"id\"] + Targets\ndf_train = convert_non_numeric_to_numeric(df_train, preserve_columns)\ndf_test = convert_non_numeric_to_numeric(df_test, ['id'])\ndf_train = df_train.dropna(subset=Targets).reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T22:52:32.92881Z","iopub.execute_input":"2024-10-17T22:52:32.929099Z","iopub.status.idle":"2024-10-17T22:52:32.978462Z","shell.execute_reply.started":"2024-10-17T22:52:32.929069Z","shell.execute_reply":"2024-10-17T22:52:32.977519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"top_feature_names = ['id', 'Basic_Demos-Enroll_Season', 'Basic_Demos-Age', 'Basic_Demos-Sex',\n                'CGAS-Season', 'CGAS-CGAS_Score', 'Physical-Season', 'Physical-BMI',\n                'Physical-Height', 'Physical-Weight', 'Physical-Waist_Circumference',\n                'Physical-Diastolic_BP', 'Physical-HeartRate', 'Physical-Systolic_BP',\n                'Fitness_Endurance-Season', 'Fitness_Endurance-Max_Stage',\n                'Fitness_Endurance-Time_Mins', 'Fitness_Endurance-Time_Sec',\n                'FGC-Season', 'FGC-FGC_CU', 'FGC-FGC_CU_Zone', 'FGC-FGC_GSND',\n                'FGC-FGC_GSND_Zone', 'FGC-FGC_GSD', 'FGC-FGC_GSD_Zone', 'FGC-FGC_PU',\n                'FGC-FGC_PU_Zone', 'FGC-FGC_SRL', 'FGC-FGC_SRL_Zone', 'FGC-FGC_SRR',\n                'FGC-FGC_SRR_Zone', 'FGC-FGC_TL', 'FGC-FGC_TL_Zone', 'BIA-Season',\n                'BIA-BIA_Activity_Level_num', 'BIA-BIA_BMC', 'BIA-BIA_BMI',\n                'BIA-BIA_BMR', 'BIA-BIA_DEE', 'BIA-BIA_ECW', 'BIA-BIA_FFM',\n                'BIA-BIA_FFMI', 'BIA-BIA_FMI', 'BIA-BIA_Fat', 'BIA-BIA_Frame_num',\n                'BIA-BIA_ICW', 'BIA-BIA_LDM', 'BIA-BIA_LST', 'BIA-BIA_SMM',\n                'BIA-BIA_TBW', 'PAQ_A-Season', 'PAQ_A-PAQ_A_Total', 'PAQ_C-Season',\n                'PAQ_C-PAQ_C_Total', 'SDS-Season', 'SDS-SDS_Total_Raw',\n                'SDS-SDS_Total_T', 'PreInt_EduHx-Season',\n                'PreInt_EduHx-computerinternet_hoursday']","metadata":{"execution":{"iopub.status.busy":"2024-10-17T22:52:32.979584Z","iopub.execute_input":"2024-10-17T22:52:32.979946Z","iopub.status.idle":"2024-10-17T22:52:32.989704Z","shell.execute_reply.started":"2024-10-17T22:52:32.979912Z","shell.execute_reply":"2024-10-17T22:52:32.988736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = df_train[top_feature_names + ['sii']]\ndf_test = df_test[top_feature_names]","metadata":{"execution":{"iopub.status.busy":"2024-10-17T22:52:32.990996Z","iopub.execute_input":"2024-10-17T22:52:32.991315Z","iopub.status.idle":"2024-10-17T22:52:33.00643Z","shell.execute_reply.started":"2024-10-17T22:52:32.991283Z","shell.execute_reply":"2024-10-17T22:52:33.005248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def groupCalculate(data, exclude_column, cap_value=1000):\n    columns = data.columns.drop(exclude_column)  # Exclude the target column from feature generation\n    new_features = []\n    index = 0\n    for column1 in columns:\n        index += 1\n        for column2 in columns[index:]:\n            # Ensure both columns are numeric to avoid division errors\n            if pd.api.types.is_numeric_dtype(data[column1]) and pd.api.types.is_numeric_dtype(data[column2]):\n                # Adding a small constant (e.g., 1e-10) to the denominator to avoid division by zero\n                ratio = data[column1] / (data[column2] + 1e-10)\n                # Cap the ratio values to avoid extremely large values\n                new_feature = np.clip(ratio, a_min=None, a_max=cap_value)\n                new_features.append(pd.DataFrame({f'{column1}_{column2}_rate': new_feature}))\n    new_features_df = pd.concat(new_features, axis=1)\n    data = pd.concat([data, new_features_df], axis=1)\n    return data\n#exclude_columns = ['id','sii']\n#df_train = groupCalculate(df_train, exclude_columns, cap_value=1000)\n#exclude_columns = ['id']\n#df_test = groupCalculate(df_test, exclude_columns, cap_value=1000)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T22:52:33.007784Z","iopub.execute_input":"2024-10-17T22:52:33.008158Z","iopub.status.idle":"2024-10-17T22:52:36.931207Z","shell.execute_reply.started":"2024-10-17T22:52:33.008125Z","shell.execute_reply":"2024-10-17T22:52:36.930203Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom catboost import CatBoostClassifier, Pool\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import cohen_kappa_score\nfrom imblearn.over_sampling import RandomOverSampler\nfrom imblearn.under_sampling import RandomUnderSampler\nfrom sklearn.impute import SimpleImputer\n\nseed = 2024\noversample_strategy = 'auto' \nundersample_strategy = 'auto'\n\n# Assuming df_train and df_test are already loaded\nTARGET = 'sii'  # Target column\nFEATURE_COLS = df_train.columns.drop([TARGET, 'id'])  # Exclude 'id' and target column\n\nX = df_train[FEATURE_COLS]\ny = df_train[TARGET]\nX_test = df_test[FEATURE_COLS]\n\n# Identify categorical and numerical features\ncategorical_cols = X.select_dtypes(include=['object', 'category']).columns.tolist()\nnumerical_cols = X.select_dtypes(exclude=['object', 'category']).columns.tolist()\n\n# Simple Imputation: Fill missing values\nimputer = SimpleImputer(strategy='mean')\n# Fit on the training data and transform both training and test data\nX = imputer.fit_transform(df_train[FEATURE_COLS])\nX_test = imputer.transform(df_test[FEATURE_COLS])\n\n# CatBoost parameters\ncb_params = {\n    'iterations': 10000,\n    'early_stopping_rounds': 500,\n    #'auto_class_weights': 'Balanced',\n    'loss_function': 'MultiClass',\n    'eval_metric': 'AUC',\n    'task_type': 'GPU',\n    'use_best_model': True,\n    'cat_features': categorical_cols  \n}\n\n\nfrom sklearn.model_selection import StratifiedKFold\nfrom imblearn.over_sampling import RandomOverSampler\nfrom imblearn.under_sampling import RandomUnderSampler\nfrom sklearn.preprocessing import MinMaxScaler\nfrom sklearn.ensemble import VotingClassifier, VotingRegressor\nfrom sklearn.linear_model import LogisticRegression, Ridge\nfrom sklearn.svm import SVC, SVR\nfrom sklearn.metrics import cohen_kappa_score\nfrom catboost import CatBoostClassifier\nfrom xgboost import XGBClassifier, XGBRegressor\nfrom lightgbm import LGBMClassifier, LGBMRegressor\nfrom sklearn.ensemble import RandomForestRegressor\nimport numpy as np\n\nn_splits = 5\nfold_predictions = []\nfold_qwk_scores = []\n\nfor seed in range(1, 11):\n    skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=seed)\n    for fold_idx, (train_idx, val_idx) in enumerate(skf.split(X, y), 1):\n        X_train, X_val = X[train_idx], X[val_idx]\n        y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]\n\n        # Applying sampling manually\n        sampler_1 = RandomOverSampler(sampling_strategy='auto', random_state=seed)\n        sampler_2 = RandomUnderSampler(sampling_strategy='auto', random_state=seed)\n        X_train_res, y_train_res = sampler_2.fit_resample(*sampler_1.fit_resample(X_train, y_train))\n\n        # Define classifiers\n        classifiers = [\n            ('catboost', CatBoostClassifier(iterations=100, learning_rate=0.1, random_seed=seed, verbose=False)),\n            ('xgb', XGBClassifier(n_estimators=100, learning_rate=0.1, random_state=seed, use_label_encoder=False, eval_metric='mlogloss')),\n            ('lgbm', LGBMClassifier(n_estimators=100, learning_rate=0.1, random_state=seed)),\n            ('svc', SVC(probability=True, random_state=seed)),\n            ('logreg', LogisticRegression(random_state=seed, multi_class='multinomial', solver='lbfgs'))\n        ]\n\n        # Define regressors\n        regressors = [\n            ('rf', RandomForestRegressor(n_estimators=100, random_state=seed)),\n            ('lgbm_reg', LGBMRegressor(n_estimators=100, learning_rate=0.1, random_state=seed)),\n            ('xgb_reg', XGBRegressor(n_estimators=100, learning_rate=0.1, random_state=seed)),\n            ('ridge', Ridge(random_state=seed)),\n            ('svr', SVR())\n        ]\n\n        # Voting ensemble for classifiers\n        voting_clf = VotingClassifier(estimators=classifiers, voting='soft')\n        voting_clf.fit(X_train_res, y_train_res)\n        clf_val_predictions = voting_clf.predict_proba(X_val)  # Predict probabilities for each class\n\n        # Voting ensemble for regressors\n        voting_reg = VotingRegressor(estimators=regressors)\n        voting_reg.fit(X_train_res, y_train_res)\n        reg_val_predictions = voting_reg.predict(X_val)  # Continuous outputs\n\n        # Transform regression outputs to the [0, 1] range\n        scaler = MinMaxScaler()\n        reg_val_probabilities = scaler.fit_transform(reg_val_predictions.reshape(-1, 1))\n\n        # Combine classifier probabilities and transformed regression outputs\n        combined_val_predictions = (clf_val_predictions + reg_val_probabilities) / 2\n        final_val_predictions = np.argmax(combined_val_predictions, axis=1)\n\n        # Calculate QWK\n        kappa = cohen_kappa_score(y_val, final_val_predictions, weights='quadratic')\n        fold_qwk_scores.append(kappa)\n        print(f\"Fold {fold_idx}: Kappa Score = {kappa}\")\n\n        # Store test set predictions for further processing\n        fold_predictions.append(voting_clf.predict_proba(X_test))\n\n# Convert list of arrays to a single numpy array and calculate the mean predictions\ntest_predictions = np.mean(np.stack(fold_predictions), axis=0)\n\n# Convert probabilities to class labels for submission\nfinal_test_predictions = np.argmax(test_predictions, axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-10-17T22:52:36.932921Z","iopub.execute_input":"2024-10-17T22:52:36.933275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\n# Path to the sample submission file\nsample_submission_path = \"/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv\"\nsubmission = pd.read_csv(sample_submission_path)\ntarget_column_name = 'sii'  # Update this to the actual target column name if different.\n\nif len(final_predictions) == len(submission):\n    submission[target_column_name] = final_predictions\nelse:\n    print(\"Mismatch in the number of predictions and the number of rows in the submission file.\")\n\nsubmission.to_csv(\"submission.csv\", index=False)\n\nsubmission.head()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}