{"metadata":{"kernelspec":{"language":"python","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"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":104857,"databundleVersionId":12651513,"sourceType":"competition"}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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":"2025-06-14T09:28:11.294054Z","iopub.execute_input":"2025-06-14T09:28:11.294608Z","iopub.status.idle":"2025-06-14T09:28:11.30127Z","shell.execute_reply.started":"2025-06-14T09:28:11.294578Z","shell.execute_reply":"2025-06-14T09:28:11.300757Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\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\nprint(\"Train shape:\", train.shape)\nprint(\"Test shape:\", test.shape)\ntrain.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:28:28.181596Z","iopub.execute_input":"2025-06-14T09:28:28.182278Z","iopub.status.idle":"2025-06-14T09:28:41.134125Z","shell.execute_reply.started":"2025-06-14T09:28:28.182252Z","shell.execute_reply":"2025-06-14T09:28:41.133382Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt\n\n# Target Distribution\nsns.histplot(train['Lap_Time_Seconds'], kde=True, bins=30)\nplt.title(\"Target Distribution - Lap Time (Seconds)\")\nplt.show()\n\n# Null Count\nprint(\"Missing values:\\n\", train.isnull().sum().sort_values(ascending=False).head(10))\n\n\nnumeric_cols = train.select_dtypes(include=['int64', 'float64']).columns\ncorr = train[numeric_cols].corr()\nplt.figure(figsize=(12, 8))\nsns.heatmap(corr[['Lap_Time_Seconds']].sort_values(by='Lap_Time_Seconds', ascending=False), annot=True, cmap='coolwarm')\nplt.title(\"Correlation with Lap_Time_Seconds\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:29:08.025414Z","iopub.execute_input":"2025-06-14T09:29:08.026226Z","iopub.status.idle":"2025-06-14T09:29:22.508377Z","shell.execute_reply.started":"2025-06-14T09:29:08.026192Z","shell.execute_reply":"2025-06-14T09:29:22.507602Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TARGET = 'Lap_Time_Seconds'\n\nDROP_COLS = [\n    'Unique ID', 'rider_name', 'team_name', 'bike_name',\n    'circuit_name', 'points', 'position'\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:29:35.286669Z","iopub.execute_input":"2025-06-14T09:29:35.286954Z","iopub.status.idle":"2025-06-14T09:29:35.290862Z","shell.execute_reply.started":"2025-06-14T09:29:35.286933Z","shell.execute_reply":"2025-06-14T09:29:35.290115Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def add_features(df):\n    df['LapTime_Estimate'] = df['Circuit_Length_km'] / df['Avg_Speed_kmh'] * 3600\n    df['Points_per_Year'] = df['Championship_Points'] / (df['years_active'] + 1)\n    df['Finish_Rate'] = df['finishes'] / (df['starts'] + 1)\n    df['Podium_Rate'] = df['podiums'] / (df['starts'] + 1)\n    df['Win_Rate'] = df['wins'] / (df['starts'] + 1)\n    df['Avg_Temp'] = (df['Ambient_Temperature_Celsius'] + df['Track_Temperature_Celsius']) / 2\n    return df\n\ntrain = add_features(train)\ntest = add_features(test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:29:48.267711Z","iopub.execute_input":"2025-06-14T09:29:48.268258Z","iopub.status.idle":"2025-06-14T09:29:48.365879Z","shell.execute_reply.started":"2025-06-14T09:29:48.268235Z","shell.execute_reply":"2025-06-14T09:29:48.365102Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nX = train.drop(DROP_COLS + [TARGET], axis=1)\nX_test = test.drop(DROP_COLS, axis=1)\ny = train[TARGET]\n\n\nall_data = pd.concat([X, X_test], axis=0)\nall_data.fillna(-1, inplace=True)\n\n\ncat_cols = all_data.select_dtypes(include='object').columns\nfor col in cat_cols:\n    all_data[col] = all_data[col].astype('category').cat.codes\n\n\nX = all_data.iloc[:len(train)]\nX_test = all_data.iloc[len(train):]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:30:06.002206Z","iopub.execute_input":"2025-06-14T09:30:06.002534Z","iopub.status.idle":"2025-06-14T09:30:09.708953Z","shell.execute_reply.started":"2025-06-14T09:30:06.002509Z","shell.execute_reply":"2025-06-14T09:30:09.708319Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:30:19.579497Z","iopub.execute_input":"2025-06-14T09:30:19.579814Z","iopub.status.idle":"2025-06-14T09:30:20.464038Z","shell.execute_reply.started":"2025-06-14T09:30:19.579795Z","shell.execute_reply":"2025-06-14T09:30:20.463398Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from lightgbm import LGBMRegressor\nfrom sklearn.metrics import mean_squared_error\n\nmodel = LGBMRegressor(\n    n_estimators=1000,\n    learning_rate=0.05,\n    max_depth=8,\n    num_leaves=70,\n    subsample=0.9,\n    colsample_bytree=0.8,\n    random_state=42\n)\n\nmodel.fit(X_train, y_train)\n\nval_preds = model.predict(X_val)\nrmse = mean_squared_error(y_val, val_preds, squared=False)\nprint(\"Validation RMSE:\", rmse)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:32:09.800152Z","iopub.execute_input":"2025-06-14T09:32:09.800448Z","iopub.status.idle":"2025-06-14T09:33:55.944248Z","shell.execute_reply.started":"2025-06-14T09:32:09.800426Z","shell.execute_reply":"2025-06-14T09:33:55.943366Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"importances = model.feature_importances_\nfeatures = pd.Series(importances, index=X.columns).sort_values(ascending=False)\n\nplt.figure(figsize=(12, 6))\nsns.barplot(x=features[:20], y=features.index[:20])\nplt.title(\"Top 20 Feature Importances\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:34:51.93685Z","iopub.execute_input":"2025-06-14T09:34:51.937397Z","iopub.status.idle":"2025-06-14T09:34:52.197343Z","shell.execute_reply.started":"2025-06-14T09:34:51.937373Z","shell.execute_reply":"2025-06-14T09:34:52.196712Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train['Speed_Degradation'] = X_train['Avg_Speed_kmh'] * X_train['Tire_Degradation_Factor_per_Lap']\nX_val['Speed_Degradation'] = X_val['Avg_Speed_kmh'] * X_val['Tire_Degradation_Factor_per_Lap']\nX_test['Speed_Degradation'] = X_test['Avg_Speed_kmh'] * X_test['Tire_Degradation_Factor_per_Lap']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:35:49.078144Z","iopub.execute_input":"2025-06-14T09:35:49.07841Z","iopub.status.idle":"2025-06-14T09:35:49.092778Z","shell.execute_reply.started":"2025-06-14T09:35:49.078392Z","shell.execute_reply":"2025-06-14T09:35:49.092027Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train['Temp_Condition'] = X_train['Track_Temperature_Celsius'] * X_train['Track_Condition']\nX_val['Temp_Condition'] = X_val['Track_Temperature_Celsius'] * X_val['Track_Condition']\nX_test['Temp_Condition'] = X_test['Track_Temperature_Celsius'] * X_test['Track_Condition']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:35:55.83051Z","iopub.execute_input":"2025-06-14T09:35:55.831255Z","iopub.status.idle":"2025-06-14T09:35:55.849577Z","shell.execute_reply.started":"2025-06-14T09:35:55.831229Z","shell.execute_reply":"2025-06-14T09:35:55.848943Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = LGBMRegressor(\n    n_estimators=1500,\n    learning_rate=0.03,\n    max_depth=10,\n    num_leaves=90,\n    subsample=0.85,\n    colsample_bytree=0.85,\n    random_state=42\n)\n\nmodel.fit(X_train, y_train)\nval_preds = model.predict(X_val)\nrmse = mean_squared_error(y_val, val_preds, squared=False)\nprint(\"Validation RMSE:\", rmse)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:36:11.816301Z","iopub.execute_input":"2025-06-14T09:36:11.816638Z","iopub.status.idle":"2025-06-14T09:38:57.51957Z","shell.execute_reply.started":"2025-06-14T09:36:11.816614Z","shell.execute_reply":"2025-06-14T09:38:57.518832Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Ratio of Circuit length to number of corners\nX_train['Corners_per_Km'] = X_train['Corners_per_Lap'] / (X_train['Circuit_Length_km'] + 1e-3)\nX_val['Corners_per_Km'] = X_val['Corners_per_Lap'] / (X_val['Circuit_Length_km'] + 1e-3)\nX_test['Corners_per_Km'] = X_test['Corners_per_Lap'] / (X_test['Circuit_Length_km'] + 1e-3)\n\n# LapTime Estimate - Actual difference\nX_train['Est_Error'] = X_train['LapTime_Estimate'] - y_train\nX_val['Est_Error'] = X_val['LapTime_Estimate'] - y_val\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:41:24.201884Z","iopub.execute_input":"2025-06-14T09:41:24.202183Z","iopub.status.idle":"2025-06-14T09:41:24.237388Z","shell.execute_reply.started":"2025-06-14T09:41:24.202162Z","shell.execute_reply":"2025-06-14T09:41:24.236769Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = LGBMRegressor(\n    n_estimators=2000,\n    learning_rate=0.025,\n    max_depth=12,\n    num_leaves=100,\n    subsample=0.85,\n    colsample_bytree=0.8,\n    reg_alpha=1.5,\n    reg_lambda=2.0,\n    random_state=42\n)\n\nmodel.fit(X_train, y_train)\nval_preds = model.predict(X_val)\nrmse = mean_squared_error(y_val, val_preds, squared=False)\nprint(\"Validation RMSE:\", rmse)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T09:41:39.744718Z","iopub.execute_input":"2025-06-14T09:41:39.745195Z","iopub.status.idle":"2025-06-14T09:46:49.861154Z","shell.execute_reply.started":"2025-06-14T09:41:39.745171Z","shell.execute_reply":"2025-06-14T09:46:49.860426Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}