{"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\nimport matplotlib.pyplot as plt\nimport sklearn","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:14.153249Z","iopub.execute_input":"2024-12-07T18:47:14.153638Z","iopub.status.idle":"2024-12-07T18:47:14.159944Z","shell.execute_reply.started":"2024-12-07T18:47:14.153607Z","shell.execute_reply":"2024-12-07T18:47:14.158717Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/train.csv')\ntest_df = pd.read_csv('/kaggle/input/child-mind-institute-problematic-internet-use/test.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:16.027408Z","iopub.execute_input":"2024-12-07T18:47:16.027868Z","iopub.status.idle":"2024-12-07T18:47:16.085333Z","shell.execute_reply.started":"2024-12-07T18:47:16.027831Z","shell.execute_reply":"2024-12-07T18:47:16.083894Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Count rows with at least one null value\nrows_with_null = train_df.isnull().any(axis=1).sum()\n\nprint(f\"Number of rows with at least one null value: {rows_with_null}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:38:43.545635Z","iopub.execute_input":"2024-12-07T18:38:43.546189Z","iopub.status.idle":"2024-12-07T18:38:43.561431Z","shell.execute_reply.started":"2024-12-07T18:38:43.546137Z","shell.execute_reply":"2024-12-07T18:38:43.560044Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(train_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:38:55.697606Z","iopub.execute_input":"2024-12-07T18:38:55.698089Z","iopub.status.idle":"2024-12-07T18:38:55.706772Z","shell.execute_reply.started":"2024-12-07T18:38:55.698052Z","shell.execute_reply":"2024-12-07T18:38:55.705446Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"'''\nimport dask.dataframe as dd\n\n# Read the Parquet file into a Dask DataFrame\nddf = dd.read_parquet('/kaggle/input/child-mind-institute-problematic-internet-use/series_train.parquet', columns=['id', 'enmo'])\n\nddf['id'] = ddf['id'].astype(str)\n\n# Group by 'id' and compute the average 'enmo'\ntrain_enmo_avg = ddf.groupby('id')['enmo'].mean().compute()\n\n# Convert to Pandas DataFrame and reset index\ntrain_enmo_avg = train_enmo_avg.reset_index()\n\n# Rename columns for clarity\ntrain_enmo_avg.columns = ['id', 'avg_enmo']\n\n# Display the result\nprint(train_enmo_avg.head())\n'''","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"'''\n# Read the Parquet file into a Dask DataFrame\ntest_ddf = dd.read_parquet('/kaggle/input/child-mind-institute-problematic-internet-use/series_test.parquet', columns=['id', 'enmo'])\n\ntest_ddf['id'] = test_ddf['id'].astype(str)\n\n\n# Group by 'id' and compute the average 'enmo'\ntest_enmo_avg = test_ddf.groupby('id')['enmo'].mean().compute()\n\n# Convert to Pandas DataFrame and reset index\ntest_enmo_avg = test_enmo_avg.reset_index()\n\n# Rename columns for clarity\ntest_enmo_avg.columns = ['id', 'avg_enmo']\n\n# Display the result\nprint(test_enmo_avg.head())\n'''","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train_enmo_avg['avg_enmo'] = train_enmo_avg['avg_enmo'].fillna(0)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#test_enmo_avg['avg_enmo'] = test_enmo_avg['avg_enmo'].fillna(0)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train_enmo_avg","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train_df = pd.merge(train_df, train_enmo_avg, on='id', how='left')\n\n#test_df = pd.merge(test_df, test_enmo_avg, on='id', how='left')\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train_df['avg_enmo'] = train_df['avg_enmo'].fillna(0)\n#test_df['avg_enmo'] = test_df['avg_enmo'].fillna(0)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df.shape","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df.shape","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Drop cols from train set that arent in test set\n\n# Step 2: Get the list of columns in test_df\ntest_columns = test_df.columns.tolist()\n\n# Step 3: Create a list of columns to keep\ncolumns_to_keep = ['sii'] + [col for col in test_columns if col != 'id']  # Exclude 'id' from test_columns\n\n# Step 4: Filter train_df to keep only the desired columns\ntrain_df = train_df[['id'] + columns_to_keep]\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:22.618904Z","iopub.execute_input":"2024-12-07T18:47:22.619293Z","iopub.status.idle":"2024-12-07T18:47:22.639031Z","shell.execute_reply.started":"2024-12-07T18:47:22.619257Z","shell.execute_reply":"2024-12-07T18:47:22.637639Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#train_df = train_df.dropna(subset=['sii'])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(train_df.shape)\nprint(test_df.shape)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import OrdinalEncoder\n\n# Step 1: Identify columns with \"Season\" in their names\nseason_columns = train_df.columns[train_df.columns.str.contains(\"Season\")]\nprint(season_columns)\n# Step 2: Replace NaN with 0 in these columns\ntrain_df[season_columns] = train_df[season_columns].fillna(0).astype(str)\ntest_df[season_columns] = test_df[season_columns].fillna(0).astype(str)\n\n# Step 3: Initialize the OrdinalEncoder\nencoder = OrdinalEncoder()\n\n# Step 4: Fit the encoder and transform the identified columns\ntrain_df[season_columns] = encoder.fit_transform(train_df[season_columns])\ntest_df[season_columns] = encoder.fit_transform(test_df[season_columns])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:25.982208Z","iopub.execute_input":"2024-12-07T18:47:25.982606Z","iopub.status.idle":"2024-12-07T18:47:26.067362Z","shell.execute_reply.started":"2024-12-07T18:47:25.982571Z","shell.execute_reply":"2024-12-07T18:47:26.066054Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Lets drop the non-numeric columns as they should not have much influence\n\n# Drop all non-numeric columns\ntrain_df = train_df.select_dtypes(include=['number']).join(train_df['id'])\ntest_df = test_df.select_dtypes(include=['number']).join(test_df['id'])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:28.047998Z","iopub.execute_input":"2024-12-07T18:47:28.048423Z","iopub.status.idle":"2024-12-07T18:47:28.066223Z","shell.execute_reply.started":"2024-12-07T18:47:28.048386Z","shell.execute_reply":"2024-12-07T18:47:28.064940Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Now, let's impute the NaN values with the column means grouped by age.\n\ntarget_column = 'sii'\n\n# Fill NaN values in all numeric columns except the target column\ndf_imputed = train_df.copy()\nfor col in train_df.columns:\n    if col != target_column and train_df[col].dtype in ['float64', 'int64']:  # Skip target column\n        # Impute based on group mean\n        df_imputed[col] = train_df.groupby(['Basic_Demos-Age', 'Basic_Demos-Sex'])[col].transform(lambda x: x.fillna(x.mean()))\n        \n        # Fallback: Fill remaining NaNs with the column mean\n        df_imputed[col].fillna(df_imputed[col].mean(), inplace=True)\n     \n    \ntest_df = test_df.copy()\nfor col in test_df.columns:\n    if test_df[col].dtype in ['float64', 'int64']:  # Skip target column\n        # Impute based on group mean\n        test_df[col] = test_df.groupby(['Basic_Demos-Age', 'Basic_Demos-Sex'])[col].transform(lambda x: x.fillna(x.mean()))\n        \n        # Fallback: Fill remaining NaNs with the column mean\n        test_df[col].fillna(test_df[col].mean(), inplace=True)\n\n\n# Display the resulting DataFrame\n#print(df_imputed)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:29.864675Z","iopub.execute_input":"2024-12-07T18:47:29.865663Z","iopub.status.idle":"2024-12-07T18:47:30.897005Z","shell.execute_reply.started":"2024-12-07T18:47:29.865608Z","shell.execute_reply":"2024-12-07T18:47:30.895816Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Print columns with NaN values\ncols_with_nan = test_df.columns[test_df.isna().any()].tolist()\n\nprint(\"Columns with NaN values:\", cols_with_nan)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\nfrom sklearn.decomposition import PCA\n\n# Columns to exclude from PCA (non-numeric columns)\nexclude_cols = ['id', 'sii']\n\n# Step 1: Extract the columns to exclude\ndf_excluded = df_imputed[exclude_cols]\n\n# Step 2: Standard scale the remaining columns\nscaler = StandardScaler()\ndf_scaled = scaler.fit_transform(df_imputed.drop(columns=exclude_cols))\n\n\n# Step 3: Apply PCA while keeping 90% variance\npca = PCA(n_components=0.95)  # Set n_components to 0.90\ndf_pca = pca.fit_transform(df_scaled)\n\n# Step 4: Convert PCA result to DataFrame and combine with excluded columns\ndf_pca = pd.DataFrame(df_pca, columns=[f'PC{i+1}' for i in range(df_pca.shape[1])])\ndf_final = pd.concat([df_excluded.reset_index(drop=True), df_pca], axis=1)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:35.963928Z","iopub.execute_input":"2024-12-07T18:47:35.964336Z","iopub.status.idle":"2024-12-07T18:47:36.272840Z","shell.execute_reply.started":"2024-12-07T18:47:35.964301Z","shell.execute_reply":"2024-12-07T18:47:36.271813Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_final","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Columns to exclude from PCA (non-numeric columns)\nexclude_cols = ['id']\n\n# Step 1: Extract the columns to exclude\ndf_test_exc= test_df[exclude_cols]\n\n# Step 2: Standard scale the remaining columns\ndf_scaled = scaler.transform(test_df.drop(columns=exclude_cols))\n\nX_test_pca = pca.transform(df_scaled)\n\n# Step 3: Create a DataFrame from the PCA output\npc_columns = [f'PC{i+1}' for i in range(X_test_pca.shape[1])]\ndf_final_test = pd.DataFrame(X_test_pca, columns=pc_columns)\n\n# Step 4: Concatenate the ID column with the PCA DataFrame\ndf_final_test = pd.concat([test_df[['id']].reset_index(drop=True), df_final_test.reset_index(drop=True)], axis=1)\n\n'''\n# Step 3: Apply PCA while keeping 90% variance\npca = PCA(n_components=0.90)  # Set n_components to 0.90\ndf_pca_test = pca.fit_transform(df_scaled)\n\n# Step 4: Convert PCA result to DataFrame and combine with excluded columns\ndf_pca_test = pd.DataFrame(df_pca_test, columns=[f'PC{i+1}' for i in range(df_pca_test.shape[1])])\ndf_final_test = pd.concat([df_test_exc.reset_index(drop=True), df_pca_test], axis=1)\n'''\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:41.901504Z","iopub.execute_input":"2024-12-07T18:47:41.901996Z","iopub.status.idle":"2024-12-07T18:47:41.928048Z","shell.execute_reply.started":"2024-12-07T18:47:41.901954Z","shell.execute_reply":"2024-12-07T18:47:41.926627Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_final","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nfrom sklearn.cluster import KMeans\n\nexclude_cols = ['sii','id']\nX = df_final.drop(columns=exclude_cols)\n# Assuming X is your data\ninertia = []\nk_range = range(1, 11)  # Test cluster sizes from 1 to 10\nfor k in k_range:\n    kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42)\n    kmeans.fit(X)\n    inertia.append(kmeans.inertia_)\n\nplt.plot(k_range, inertia, marker='o')\nplt.xlabel('Number of Clusters')\nplt.ylabel('Inertia')\nplt.title('Elbow Method for Optimal k')\nplt.show()\n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nfrom sklearn.cluster import KMeans\n\n# Step 1: Fit K-Means clustering on the 5 PCs\nkmeans = KMeans(n_clusters=3, random_state=42)  # Choose the number of clusters\ndf_final['cluster'] = kmeans.fit_predict(df_final.drop(columns=['id', 'sii']))\n\n# Step 2: Impute NaN values in the target column\nfor cluster in df_final['cluster'].unique():\n    # Calculate the mean (or median) target for the current cluster\n    mean_target = df_final.loc[df_final['cluster'] == cluster, 'sii'].mean()\n    \n    # Fill NaN values in the target column for the current cluster\n    df_final.loc[(df_final['cluster'] == cluster) & (df_final['sii'].isna()), 'sii'] = mean_target\n\n# Step 3: Display the resulting DataFrame\nprint(df_final)\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:48.639132Z","iopub.execute_input":"2024-12-07T18:47:48.639530Z","iopub.status.idle":"2024-12-07T18:47:50.121124Z","shell.execute_reply.started":"2024-12-07T18:47:48.639494Z","shell.execute_reply":"2024-12-07T18:47:50.119962Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_final['sii'] = df_final['sii'].round().astype(int)  # Convert to integer type after rounding\n#df_final","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:56.666565Z","iopub.execute_input":"2024-12-07T18:47:56.667445Z","iopub.status.idle":"2024-12-07T18:47:56.673947Z","shell.execute_reply.started":"2024-12-07T18:47:56.667399Z","shell.execute_reply":"2024-12-07T18:47:56.672335Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_final.set_index('id', inplace=True)\ndf_final_test.set_index('id', inplace=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:47:58.237208Z","iopub.execute_input":"2024-12-07T18:47:58.237778Z","iopub.status.idle":"2024-12-07T18:47:58.246198Z","shell.execute_reply.started":"2024-12-07T18:47:58.237704Z","shell.execute_reply":"2024-12-07T18:47:58.244678Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nimport lightgbm as lgb\n\n# Prepare features and target variable\nX = df_final.drop(columns=['sii', 'cluster']) # Features\ny = df_final['sii']                   # Target variable\n\n# Split the dataset into training and testing sets\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n\nprint(X_train.shape)\nprint(X_test.shape)\nprint(y_train.shape)\nprint(y_test.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:48:00.781826Z","iopub.execute_input":"2024-12-07T18:48:00.782310Z","iopub.status.idle":"2024-12-07T18:48:01.961436Z","shell.execute_reply.started":"2024-12-07T18:48:00.782257Z","shell.execute_reply":"2024-12-07T18:48:01.960233Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import make_scorer, cohen_kappa_score\n\n# Define the scorer using make_scorer\nkappa_scorer = make_scorer(cohen_kappa_score, greater_is_better=True)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from xgboost import XGBClassifier\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import RandomizedSearchCV\nfrom sklearn.metrics import accuracy_score, classification_report\nfrom lightgbm import LGBMClassifier\n\n'''\n# Parameter distributions to sample from\nparam_distributions = {\n    'eta': [0.01, 0.05, 0.1, 0.3],  # Learning rates\n    'max_depth': [3, 5, 7, 9],      # Maximum depth of trees\n    'n_estimators': [50, 100, 200], # Number of trees\n    'min_child_weight': [1, 3, 5],  # Minimum child weight\n    'subsample': [0.6, 0.8, 1.0],  # Subsample ratio of training instances\n    'colsample_bytree': [0.6, 0.8, 1.0], # Subsample ratio of columns when constructing each tree\n    'gamma': [0, 0.1, 0.5, 1],      # Minimum loss reduction\n}\n\n# Initialize the XGBoost classifier\nmodel = XGBClassifier(objective='multi:softprob', num_class=4)\n\n# Set up RandomizedSearchCV\nrandom_search = RandomizedSearchCV(\n    estimator=model, \n    param_distributions=param_distributions,\n    n_iter=50,  # Number of parameter settings to sample\n    scoring=kappa_scorer,  # Evaluation metric\n    cv=5,  # 5-fold cross-validation\n    verbose=3,  # Verbose output\n    random_state=42,  # For reproducibility\n    n_jobs=-1  # Use all available cores\n)\n\n# Fit the model using RandomizedSearchCV\nrandom_search.fit(X_train, y_train)\n\n# Print the best parameters and best score\nprint(\"Best parameters found: \", random_search.best_params_)\nprint(\"Best cross-validation accuracy: \", random_search.best_score_)\n'''","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:48:46.694138Z","iopub.execute_input":"2024-12-07T18:48:46.694570Z","iopub.status.idle":"2024-12-07T18:48:46.703939Z","shell.execute_reply.started":"2024-12-07T18:48:46.694534Z","shell.execute_reply":"2024-12-07T18:48:46.702568Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import cohen_kappa_score\nfrom lightgbm import LGBMClassifier\nfrom sklearn.metrics import accuracy_score, classification_report\n\nparams = {\n    'eta': 0.3, \n    'max_depth': 3,  \n    'num_class': 4,\n    'n_estimators': 50}\n\n'''\nparams = {'subsample': 0.6, \n          'n_estimators': 100, \n          'min_child_weight': 1, \n          'max_depth': 3, \n          'gamma': 1, \n          'eta': 0.1, \n          'colsample_bytree': 0.8}\n'''\n# Initialize the XGBoost classifier\nmodel = XGBClassifier(objective='multi:softprob', **params)\n\n\n# Train the model\nmodel.fit(X_train, y_train)\n\n\n# Make predictions\ny_pred = model.predict(X_test)\n\n# Evaluate the model\nkappa = cohen_kappa_score(y_test, y_pred)\nreport = classification_report(y_test, y_pred)\n\nprint(f'Cohen Kappa: {kappa}')\nprint('Classification Report:')\nprint(report)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:48:54.208656Z","iopub.execute_input":"2024-12-07T18:48:54.209074Z","iopub.status.idle":"2024-12-07T18:48:54.563683Z","shell.execute_reply.started":"2024-12-07T18:48:54.209039Z","shell.execute_reply":"2024-12-07T18:48:54.562449Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Access the number of trees\nbooster = model.get_booster()\nnum_trees = len(booster.get_dump())\nprint(f\"Number of trees in the model: {num_trees}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T18:53:27.889453Z","iopub.execute_input":"2024-12-07T18:53:27.889843Z","iopub.status.idle":"2024-12-07T18:53:27.908690Z","shell.execute_reply.started":"2024-12-07T18:53:27.889804Z","shell.execute_reply":"2024-12-07T18:53:27.905793Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom xgboost import to_graphviz\n\ngraph = to_graphviz(model, num_trees=199)\ngraph.render(\"tree\", format=\"png\")  # Saves as 'tree.png'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:09:21.153619Z","iopub.execute_input":"2024-12-07T19:09:21.154989Z","iopub.status.idle":"2024-12-07T19:09:21.288600Z","shell.execute_reply.started":"2024-12-07T19:09:21.154926Z","shell.execute_reply":"2024-12-07T19:09:21.287332Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from IPython.display import Image\nImage(filename=\"tree.png\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-07T19:09:23.205678Z","iopub.execute_input":"2024-12-07T19:09:23.206717Z","iopub.status.idle":"2024-12-07T19:09:23.216571Z","shell.execute_reply.started":"2024-12-07T19:09:23.206674Z","shell.execute_reply":"2024-12-07T19:09:23.215389Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_final_test","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds = model.predict(df_final_test)\ntest_preds","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred_df = pd.DataFrame(test_preds, columns=['sii'], index=test_df['id'])\n\npred_df.to_csv('submission.csv', index=True)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}