{"metadata":{"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"colab":{"provenance":[]},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":104857,"databundleVersionId":12651513,"sourceType":"competition"}],"dockerImageVersionId":31040,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\n\n# ✅ Use the correct dataset folder path\ntrain = pd.read_csv('/kaggle/input/burnout-datathon-ieeecsmuj/train.csv')\ntest = pd.read_csv('/kaggle/input/burnout-datathon-ieeecsmuj/test.csv')\nsample = pd.read_csv('/kaggle/input/burnout-datathon-ieeecsmuj/sample_submission.csv')\n\n# Preview data\nprint(\"Train shape:\", train.shape)\nprint(\"Test shape:\", test.shape)\ntrain.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:01:48.757203Z","iopub.execute_input":"2025-06-14T16:01:48.757506Z","iopub.status.idle":"2025-06-14T16:02:04.426489Z","shell.execute_reply.started":"2025-06-14T16:01:48.757480Z","shell.execute_reply":"2025-06-14T16:02:04.425679Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Check missing values\nmissing = train.isnull().sum()\nmissing = missing[missing > 0].sort_values(ascending=False)\nprint(\"Missing values in train set:\\n\", missing)\n\n# Optional: check % of missing\nmissing_percent = (train.isnull().sum() / len(train)) * 100\nmissing_percent[missing_percent > 0].sort_values(ascending=False)\nprint(\"Percentage of Missing values in train set:\\n\",missing_percent)\n","metadata":{"id":"AJzeeVPmt49O","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:02:18.052066Z","iopub.execute_input":"2025-06-14T16:02:18.052435Z","iopub.status.idle":"2025-06-14T16:02:20.663017Z","shell.execute_reply.started":"2025-06-14T16:02:18.052407Z","shell.execute_reply":"2025-06-14T16:02:20.662069Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Check type and unique values\nprint(\"Penalty dtype:\", train['Penalty'].dtype)\nprint(\"Unique values in Penalty:\\n\", train['Penalty'].unique())\n","metadata":{"id":"dat1Mz4H5rTa","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:02:51.492759Z","iopub.execute_input":"2025-06-14T16:02:51.493130Z","iopub.status.idle":"2025-06-14T16:02:51.578128Z","shell.execute_reply.started":"2025-06-14T16:02:51.493104Z","shell.execute_reply":"2025-06-14T16:02:51.577166Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Fill missing Penalty values\ntrain['Penalty'] = train['Penalty'].fillna('No Penalty')\ntest['Penalty'] = test['Penalty'].fillna('No Penalty')\nval['Penalty'] = val['Penalty'].fillna('No Penalty')","metadata":{"id":"XzLc-NH752mg","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:03:30.972883Z","iopub.execute_input":"2025-06-14T16:03:30.973188Z","iopub.status.idle":"2025-06-14T16:03:31.150929Z","shell.execute_reply.started":"2025-06-14T16:03:30.973167Z","shell.execute_reply":"2025-06-14T16:03:31.150034Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cat_cols = train.select_dtypes(include='object').columns.tolist()\nprint(\"Categorical columns:\", cat_cols)","metadata":{"id":"B95RzCHe5_40","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:03:33.745575Z","iopub.execute_input":"2025-06-14T16:03:33.745908Z","iopub.status.idle":"2025-06-14T16:03:34.679480Z","shell.execute_reply.started":"2025-06-14T16:03:33.745878Z","shell.execute_reply":"2025-06-14T16:03:34.678513Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import OneHotEncoder\n\n# Define columns to encode\nlow_card_cols = [\n    'category_x', 'Track_Condition', 'Tire_Compound_Front',\n    'Tire_Compound_Rear', 'Penalty', 'Session', 'weather'\n]\n\n# One-hot encode with pandas (for simplicity)\ntrain_encoded = pd.get_dummies(train, columns=low_card_cols, drop_first=True)\ntest_encoded = pd.get_dummies(test, columns=low_card_cols, drop_first=True)\nval_encoded = pd.get_dummies(val, columns=low_card_cols, drop_first=True)\n\n# Align the columns so train/test have the same features\ntrain_encoded, test_encoded = train_encoded.align(test_encoded, join='left', axis=1, fill_value=0)\ntrain_encoded, val_encoded = train_encoded.align(val_encoded, join='left', axis=1, fill_value=0)\n","metadata":{"id":"eR1eY-NN6KTg","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:03:39.809460Z","iopub.execute_input":"2025-06-14T16:03:39.809735Z","iopub.status.idle":"2025-06-14T16:03:43.344065Z","shell.execute_reply.started":"2025-06-14T16:03:39.809717Z","shell.execute_reply":"2025-06-14T16:03:43.343089Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\n# Encode high-cardinality categorical variables\nlabel_cols = ['rider_name', 'team_name', 'bike_name', 'circuit_name']\n\n# Use LabelEncoder for each\nfor col in label_cols:\n    le = LabelEncoder()\n    # Fit on combined train/test/val to avoid unseen labels\n    combined = pd.concat([train_encoded[col], test_encoded[col], val_encoded[col]], axis=0).astype(str)\n    le.fit(combined)\n    train_encoded[col] = le.transform(train_encoded[col].astype(str))\n    test_encoded[col] = le.transform(test_encoded[col].astype(str))\n    val_encoded[col] = le.transform(val_encoded[col].astype(str))\n\n# Drop low-importance columns\ntrain_encoded = train_encoded.drop(columns=['shortname', 'track'], errors='ignore')\ntest_encoded = test_encoded.drop(columns=['shortname', 'track'], errors='ignore')\nval_encoded = val_encoded.drop(columns=['shortname', 'track'], errors='ignore')\n","metadata":{"id":"EsaulKhE6Mu6","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:03:47.086497Z","iopub.execute_input":"2025-06-14T16:03:47.087576Z","iopub.status.idle":"2025-06-14T16:03:49.759464Z","shell.execute_reply.started":"2025-06-14T16:03:47.087545Z","shell.execute_reply":"2025-06-14T16:03:49.758551Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\n# Define features and target\ntarget = 'Lap_Time_Seconds'\nfeatures = [col for col in train_encoded.columns if col != target and col != 'Unique ID']\n\nX_train = train_encoded[features]\ny_train = train_encoded[target]\n\nX_val = val_encoded[features]\ny_val = val_encoded[target]","metadata":{"id":"atgDRwm7RAA4","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:03:54.835093Z","iopub.execute_input":"2025-06-14T16:03:54.835406Z","iopub.status.idle":"2025-06-14T16:03:55.069093Z","shell.execute_reply.started":"2025-06-14T16:03:54.835384Z","shell.execute_reply":"2025-06-14T16:03:55.068210Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pip install --upgrade lightgbm","metadata":{"id":"Cm5EJF_cOxnC","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:04:17.432779Z","iopub.execute_input":"2025-06-14T16:04:17.433104Z","iopub.status.idle":"2025-06-14T16:04:23.202254Z","shell.execute_reply.started":"2025-06-14T16:04:17.433082Z","shell.execute_reply":"2025-06-14T16:04:23.201292Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import lightgbm\nprint(lightgbm.__version__)\n","metadata":{"id":"wkCU3IuGSx3-","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:04:29.738197Z","iopub.execute_input":"2025-06-14T16:04:29.738801Z","iopub.status.idle":"2025-06-14T16:04:34.754463Z","shell.execute_reply.started":"2025-06-14T16:04:29.738761Z","shell.execute_reply":"2025-06-14T16:04:34.753185Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from lightgbm import LGBMRegressor, early_stopping, log_evaluation\n\nmodel = LGBMRegressor(\n    n_estimators=1000,\n    learning_rate=0.05,\n    max_depth=7,\n    random_state=42,\n    objective='regression'\n)\n","metadata":{"id":"Yug2WXPJQ6wC","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:04:38.274964Z","iopub.execute_input":"2025-06-14T16:04:38.276367Z","iopub.status.idle":"2025-06-14T16:04:38.281275Z","shell.execute_reply.started":"2025-06-14T16:04:38.276330Z","shell.execute_reply":"2025-06-14T16:04:38.280363Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.fit(\n    X_train, y_train,\n    eval_set=[(X_val, y_val)],\n    callbacks=[\n        early_stopping(stopping_rounds=50),\n        log_evaluation(period=100)\n    ]\n)","metadata":{"id":"ghvEhhTjS59y","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:04:56.465736Z","iopub.execute_input":"2025-06-14T16:04:56.466105Z","iopub.status.idle":"2025-06-14T16:06:48.508232Z","shell.execute_reply.started":"2025-06-14T16:04:56.466064Z","shell.execute_reply":"2025-06-14T16:06:48.507335Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import mean_squared_error\n# Predict on validation set\ny_pred = model.predict(X_val)\nrmse = np.sqrt(mean_squared_error(y_val, y_pred))\nprint(\"Validation RMSE:\", rmse)","metadata":{"id":"MwKTnjePRGWU","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:07:24.494002Z","iopub.execute_input":"2025-06-14T16:07:24.494346Z","iopub.status.idle":"2025-06-14T16:07:34.231983Z","shell.execute_reply.started":"2025-06-14T16:07:24.494321Z","shell.execute_reply":"2025-06-14T16:07:34.231013Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport pandas as pd\n\n# Get feature importances\nimportances = model.feature_importances_\nfeature_names = X_train.columns\nfeat_imp_df = pd.DataFrame({'Feature': feature_names, 'Importance': importances})\nfeat_imp_df = feat_imp_df.sort_values(by='Importance', ascending=False)\n\n# Plot top 20\nplt.figure(figsize=(12, 6))\nplt.barh(feat_imp_df['Feature'].head(20)[::-1], feat_imp_df['Importance'].head(20)[::-1])\nplt.xlabel(\"Importance\")\nplt.title(\"Top 20 Feature Importances\")\nplt.tight_layout()\nplt.show()\n","metadata":{"id":"CgA4gzdhbs6J","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:07:37.938558Z","iopub.execute_input":"2025-06-14T16:07:37.939271Z","iopub.status.idle":"2025-06-14T16:07:38.323180Z","shell.execute_reply.started":"2025-06-14T16:07:37.939233Z","shell.execute_reply":"2025-06-14T16:07:38.322158Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test.head()","metadata":{"id":"Y5vhFm0OBA1a","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:07:46.407698Z","iopub.execute_input":"2025-06-14T16:07:46.408141Z","iopub.status.idle":"2025-06-14T16:07:46.425637Z","shell.execute_reply.started":"2025-06-14T16:07:46.408099Z","shell.execute_reply":"2025-06-14T16:07:46.424641Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#  Define features (excluding target and ID)\nfeatures = [col for col in test_encoded.columns if col != 'Unique ID' or col!='Lap_Time_Seconds']\n","metadata":{"id":"pi28ZPK9ApLt","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:07:56.377752Z","iopub.execute_input":"2025-06-14T16:07:56.378146Z","iopub.status.idle":"2025-06-14T16:07:56.382819Z","shell.execute_reply.started":"2025-06-14T16:07:56.378119Z","shell.execute_reply":"2025-06-14T16:07:56.381840Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Ensure test has same features and order as train\nX_test = test_encoded[features]  # 'features' comes from train_encoded\n\n# Align test to training columns, fill any missing with 0\nX_test_aligned = X_test.reindex(columns=X_train.columns, fill_value=0)\n","metadata":{"id":"AW6b4k4ZEYxW","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:07:59.981634Z","iopub.execute_input":"2025-06-14T16:07:59.981984Z","iopub.status.idle":"2025-06-14T16:08:00.112941Z","shell.execute_reply.started":"2025-06-14T16:07:59.981960Z","shell.execute_reply":"2025-06-14T16:08:00.111997Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Predict using aligned test data\ntest_preds = model.predict(X_test_aligned)\n\n# Create solution file\nsolution_df = pd.DataFrame({\n    'Unique ID': test_encoded['Unique ID'],\n    'Lap_Time_Seconds': test_preds\n})\n\nsolution_df.to_csv('solution.csv', index=False)\n\nprint(\"✅ created solution.csv\")\n","metadata":{"id":"RRmFLxShEfF2","trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:08:05.821503Z","iopub.execute_input":"2025-06-14T16:08:05.821885Z","iopub.status.idle":"2025-06-14T16:08:26.172933Z","shell.execute_reply.started":"2025-06-14T16:08:05.821860Z","shell.execute_reply":"2025-06-14T16:08:26.171959Z"}},"outputs":[],"execution_count":null}]}