{"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":"nvidiaTeslaT4","dataSources":[{"sourceId":81933,"databundleVersionId":9643020,"sourceType":"competition"},{"sourceId":7453542,"sourceType":"datasetVersion","datasetId":921302}],"dockerImageVersionId":30805,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"pip install xgboost lightgbm catboost scikit-learn\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:07:05.363772Z","iopub.execute_input":"2024-12-05T19:07:05.36458Z","iopub.status.idle":"2024-12-05T19:07:46.380055Z","shell.execute_reply.started":"2024-12-05T19:07:05.36454Z","shell.execute_reply":"2024-12-05T19:07:46.378767Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.ensemble import VotingClassifier\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_squared_error\nfrom xgboost import XGBClassifier\nfrom lightgbm import LGBMClassifier\nfrom catboost import CatBoostClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nimport numpy as np\nimport pandas as pd\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.decomposition import PCA","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:24:17.730838Z","iopub.execute_input":"2024-12-05T19:24:17.731398Z","iopub.status.idle":"2024-12-05T19:24:17.736614Z","shell.execute_reply.started":"2024-12-05T19:24:17.731344Z","shell.execute_reply":"2024-12-05T19:24:17.735574Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest_data = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')\nsample_submission = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/sample_submission.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:24:17.738485Z","iopub.execute_input":"2024-12-05T19:24:17.738822Z","iopub.status.idle":"2024-12-05T19:24:17.79681Z","shell.execute_reply.started":"2024-12-05T19:24:17.738783Z","shell.execute_reply":"2024-12-05T19:24:17.795834Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"threshold = 0.5 * len(train_data)\ncolumns_with_data = train_data.columns[train_data.isnull().sum() < threshold]\ntrain_data = train_data[columns_with_data]\ntrain_data.fillna(0, inplace=True)\ntrain_data_cleaned = train_data.dropna(subset=['sii'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:24:17.797822Z","iopub.execute_input":"2024-12-05T19:24:17.798101Z","iopub.status.idle":"2024-12-05T19:24:17.816609Z","shell.execute_reply.started":"2024-12-05T19:24:17.798072Z","shell.execute_reply":"2024-12-05T19:24:17.815537Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"season_cols = [\n    'Basic_Demos-Enroll_Season', 'CGAS-Season', 'Physical-Season',\n    'FGC-Season', 'BIA-Season', 'PCIAT-Season', 'SDS-Season', 'PreInt_EduHx-Season'\n]\nseason_mapping = {'Spring': 0, 'Summer': 1, 'Fall': 2, 'Winter': 3}\nfor col in season_cols:\n    if col in train_data_cleaned.columns:\n        train_data_cleaned[col] = train_data_cleaned[col].map(season_mapping).fillna(-1).astype(int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:24:17.818446Z","iopub.execute_input":"2024-12-05T19:24:17.818715Z","iopub.status.idle":"2024-12-05T19:24:17.834839Z","shell.execute_reply.started":"2024-12-05T19:24:17.818688Z","shell.execute_reply":"2024-12-05T19:24:17.83396Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"common_columns = train_data_cleaned.columns.intersection(test_data.columns)\nX = train_data_cleaned[common_columns]\ny = train_data_cleaned['sii']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:24:17.836083Z","iopub.execute_input":"2024-12-05T19:24:17.836518Z","iopub.status.idle":"2024-12-05T19:24:17.843196Z","shell.execute_reply.started":"2024-12-05T19:24:17.836471Z","shell.execute_reply":"2024-12-05T19:24:17.842319Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"encoder = LabelEncoder()\ncategorical_columns = X.select_dtypes(include=['object']).columns\n\nfor col in categorical_columns:\n    X.loc[:, col] = encoder.fit_transform(X[col].astype(str))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:24:17.844552Z","iopub.execute_input":"2024-12-05T19:24:17.844865Z","iopub.status.idle":"2024-12-05T19:24:17.859968Z","shell.execute_reply.started":"2024-12-05T19:24:17.844831Z","shell.execute_reply":"2024-12-05T19:24:17.8591Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X = X.drop(columns=['id'], errors='ignore')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:24:17.860942Z","iopub.execute_input":"2024-12-05T19:24:17.861248Z","iopub.status.idle":"2024-12-05T19:24:17.870513Z","shell.execute_reply.started":"2024-12-05T19:24:17.861219Z","shell.execute_reply":"2024-12-05T19:24:17.869434Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"scaler = StandardScaler()\nX_scaled = scaler.fit_transform(X)\npca = PCA(n_components=0.95)\nX_pca = pca.fit_transform(X_scaled)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:24:17.871735Z","iopub.execute_input":"2024-12-05T19:24:17.872017Z","iopub.status.idle":"2024-12-05T19:24:17.896634Z","shell.execute_reply.started":"2024-12-05T19:24:17.871989Z","shell.execute_reply":"2024-12-05T19:24:17.895929Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.1, stratify=y, random_state=42)\n\nprint(f\"Training set distribution:\\n{y_train.value_counts(normalize=True)}\")\nprint(f\"Test set distribution:\\n{y_test.value_counts(normalize=True)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:24:17.897479Z","iopub.execute_input":"2024-12-05T19:24:17.897772Z","iopub.status.idle":"2024-12-05T19:24:17.916666Z","shell.execute_reply.started":"2024-12-05T19:24:17.897738Z","shell.execute_reply":"2024-12-05T19:24:17.913398Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def quadratic_weighted_kappa(y_true, y_pred, num_ratings=None):\n    \"\"\"\n    Calculate the Quadratic Weighted Kappa (QWK) score.\n    \n    Parameters:\n        y_true (array-like): Ground truth ratings.\n        y_pred (array-like): Predicted ratings.\n        num_ratings (int): The number of possible ratings (e.g., 5 for ratings 0-4). \n                           If None, it will infer from the unique labels in y_true and y_pred.\n    \n    Returns:\n        float: Quadratic Weighted Kappa score.\n    \"\"\"\n    # Ensure inputs are numpy arrays\n    y_true = np.array(y_true, dtype=int)\n    y_pred = np.array(y_pred, dtype=int)\n\n    \n    # Infer the number of ratings if not provided\n    if num_ratings is None:\n        num_ratings = max(max(y_true), max(y_pred)) + 1\n    \n    # Confusion matrix\n    O = np.zeros((num_ratings, num_ratings))\n    for a, p in zip(y_true, y_pred):\n        O[a, p] += 1\n    \n    # Expected matrix\n    actual_hist = np.sum(O, axis=1)\n    predicted_hist = np.sum(O, axis=0)\n    E = np.outer(actual_hist, predicted_hist) / np.sum(O)\n    \n    # Weight matrix\n    W = np.zeros((num_ratings, num_ratings))\n    for i in range(num_ratings):\n        for j in range(num_ratings):\n            W[i, j] = ((i - j) ** 2) / ((num_ratings - 1) ** 2)\n    \n    # Calculate QWK\n    numerator = np.sum(W * O)\n    denominator = np.sum(W * E)\n    kappa = 1 - numerator / denominator\n    \n    return kappa","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:25:49.296572Z","iopub.execute_input":"2024-12-05T19:25:49.296928Z","iopub.status.idle":"2024-12-05T19:25:49.304996Z","shell.execute_reply.started":"2024-12-05T19:25:49.296897Z","shell.execute_reply":"2024-12-05T19:25:49.303996Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"rf_model = RandomForestClassifier(n_estimators=100, random_state=42)\nxgb_model = XGBClassifier(n_estimators=100, learning_rate=0.1, random_state=42)\nlgbm_model = LGBMClassifier(n_estimators=100, learning_rate=0.1, random_state=42)\n# cat_model = CatBoostClassifier(iterations=100, learning_rate=0.1, random_seed=42, verbose=0)\n\nvoting_classifier = VotingClassifier(\n    estimators=[\n        ('rf', rf_model),\n        ('xgb', xgb_model),\n        ('lgbm', lgbm_model),\n        # ('cat', cat_model)\n    ]\n)\n\n# Train the Voting Regressor\nmodel = voting_classifier.fit(X_train, y_train)\n\n# Predict on test data\nensemble_preds = voting_classifier.predict(X_test)\ny_test = y_test.tolist()\nqwk_score = quadratic_weighted_kappa(y_test, ensemble_preds, num_ratings=4)\nprint(f\"Quadratic Weighted Kappa Score: {qwk_score:.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:25:52.24831Z","iopub.execute_input":"2024-12-05T19:25:52.249242Z","iopub.status.idle":"2024-12-05T19:25:55.120128Z","shell.execute_reply.started":"2024-12-05T19:25:52.249206Z","shell.execute_reply":"2024-12-05T19:25:55.119061Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_data.fillna(0, inplace=True)\n\n# Encode categorical columns in test data\nfor col in season_cols:\n    if col in test_data.columns:\n        test_data[col] = test_data[col].map(season_mapping).fillna(-1).astype(int)\n\n# Prepare the test features\nX_test_data = test_data[common_columns].drop(columns=['id'], errors='ignore')\n\n# Standardize and apply PCA to the test data\nX_test_scaled = scaler.transform(X_test_data)\nX_test_pca = pca.transform(X_test_scaled)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:28:41.434229Z","iopub.execute_input":"2024-12-05T19:28:41.434629Z","iopub.status.idle":"2024-12-05T19:28:41.456115Z","shell.execute_reply.started":"2024-12-05T19:28:41.434596Z","shell.execute_reply":"2024-12-05T19:28:41.455106Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ensemble_preds = voting_classifier.predict(X_test_pca)\n\nsubmission = pd.DataFrame({\n    'id': sample['id'],\n    'sii': ensemble_preds\n})\n\n# Save the submission to a CSV file\nsubmission.to_csv('submission.csv', index=False)\n\n# Check the first few rows of the submission\nprint(submission.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-05T19:28:48.299934Z","iopub.execute_input":"2024-12-05T19:28:48.300925Z","iopub.status.idle":"2024-12-05T19:28:48.325559Z","shell.execute_reply.started":"2024-12-05T19:28:48.300889Z","shell.execute_reply":"2024-12-05T19:28:48.324635Z"}},"outputs":[],"execution_count":null}]}