{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","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":"none","dataSources":[{"sourceId":104857,"databundleVersionId":12651513,"sourceType":"competition"}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.ensemble import RandomForestRegressor\nfrom xgboost import XGBRegressor\nfrom sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:35:50.430731Z","iopub.execute_input":"2025-06-14T16:35:50.431046Z","iopub.status.idle":"2025-06-14T16:35:54.483839Z","shell.execute_reply.started":"2025-06-14T16:35:50.431021Z","shell.execute_reply":"2025-06-14T16:35:54.482828Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n    train_df = pd.read_csv('/kaggle/input/burnout-datathon-ieeecsmuj/train.csv')\n    test_df = pd.read_csv('/kaggle/input/burnout-datathon-ieeecsmuj/test.csv')\n    sample_submission = pd.read_csv('/kaggle/input/burnout-datathon-ieeecsmuj/sample_submission.csv')\n   \n    test_ids = test_df['Unique ID'].copy()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:36:48.019054Z","iopub.execute_input":"2025-06-14T16:36:48.019334Z","iopub.status.idle":"2025-06-14T16:37:08.736522Z","shell.execute_reply.started":"2025-06-14T16:36:48.019315Z","shell.execute_reply":"2025-06-14T16:37:08.735816Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ntrain_df['Penalty'] = train_df['Penalty'].fillna(\"No Penalty\")\ntest_df['Penalty'] = test_df['Penalty'].fillna(\"No Penalty\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:37:08.737704Z","iopub.execute_input":"2025-06-14T16:37:08.738024Z","iopub.status.idle":"2025-06-14T16:37:08.914502Z","shell.execute_reply.started":"2025-06-14T16:37:08.738000Z","shell.execute_reply":"2025-06-14T16:37:08.913339Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nlow_card_cols = ['category_x', 'Track_Condition', 'Tire_Compound_Front', \n                'Tire_Compound_Rear', 'Penalty', 'Session', 'weather', 'track']\n\ntrain_df = pd.get_dummies(train_df, columns=low_card_cols, drop_first=True)\ntest_df = pd.get_dummies(test_df, columns=low_card_cols, drop_first=True)\n\nhigh_card_cols = ['shortname', 'circuit_name', 'rider_name', 'team_name', 'bike_name']\nle = LabelEncoder()\nfor col in high_card_cols:\n    train_df[col] = le.fit_transform(train_df[col].astype(str))\n    test_df[col] = le.transform(test_df[col].astype(str))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:37:12.191529Z","iopub.execute_input":"2025-06-14T16:37:12.191865Z","iopub.status.idle":"2025-06-14T16:37:16.597819Z","shell.execute_reply.started":"2025-06-14T16:37:12.191842Z","shell.execute_reply":"2025-06-14T16:37:16.597074Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ntrain_df, test_df = train_df.align(test_df, join='left', axis=1, fill_value=0)\nviz_df = train_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:37:24.830220Z","iopub.execute_input":"2025-06-14T16:37:24.830516Z","iopub.status.idle":"2025-06-14T16:37:25.458933Z","shell.execute_reply.started":"2025-06-14T16:37:24.830495Z","shell.execute_reply":"2025-06-14T16:37:25.458020Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nplt.figure(figsize=(10, 6))\nsns.histplot(train_df['Lap_Time_Seconds'].to_pandas() if hasattr(train_df, 'to_pandas') else train_df['Lap_Time_Seconds'], \n             bins=50, kde=True)\nplt.title(\"Distribution of Lap Times\")\nplt.xlabel(\"Lap Time (seconds)\")\nplt.ylabel(\"Frequency\")\nplt.show()\n\n\ncorr_matrix = train_df.to_pandas().corr() if hasattr(train_df, 'to_pandas') else train_df.corr()\nplt.figure(figsize=(15, 10))\nsns.heatmap(corr_matrix[['Lap_Time_Seconds']].sort_values(by='Lap_Time_Seconds', ascending=False), \n            annot=True, cmap='coolwarm')\nplt.title(\"Features Correlation with Lap Time\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:37:27.699386Z","iopub.execute_input":"2025-06-14T16:37:27.699703Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nX = train_df.drop(columns=['Lap_Time_Seconds', 'Unique ID'])\ny = train_df['Lap_Time_Seconds']\n\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:38:31.961509Z","iopub.execute_input":"2025-06-14T16:38:31.962019Z","iopub.status.idle":"2025-06-14T16:38:33.361589Z","shell.execute_reply.started":"2025-06-14T16:38:31.961993Z","shell.execute_reply":"2025-06-14T16:38:33.360745Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"corr_matrix = train_df.corr()\nplt.figure(figsize=(15, 10))\nsns.heatmap(corr_matrix[['Lap_Time_Seconds']].sort_values(by='Lap_Time_Seconds', ascending=False), \n            annot=True, cmap='coolwarm')\nplt.title(\"Features Correlation with Lap Time\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:38:33.362359Z","iopub.execute_input":"2025-06-14T16:38:33.362955Z","iopub.status.idle":"2025-06-14T16:38:53.513346Z","shell.execute_reply.started":"2025-06-14T16:38:33.362936Z","shell.execute_reply":"2025-06-14T16:38:53.512282Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n    rf_model = RandomForestRegressor(n_estimators=100, max_depth=10, \n                                   random_state=42, n_jobs=-1)\n   \n    xgb_model = XGBRegressor(n_estimators=500, max_depth=8,\n                           learning_rate=0.05, random_state=42, n_jobs=-1)\n    \n   \n    rf_model.fit(X_train, y_train)\n    xgb_model.fit(X_train, y_train)\n    X_train_pd, y_train_pd, X_val_pd, y_val_pd = X_train, y_train, X_val, y_val","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:39:01.368658Z","iopub.execute_input":"2025-06-14T16:39:01.369778Z","iopub.status.idle":"2025-06-14T16:57:46.083495Z","shell.execute_reply.started":"2025-06-14T16:39:01.369680Z","shell.execute_reply":"2025-06-14T16:57:46.082785Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nrf_model.fit(X_train_pd, y_train_pd)\nxgb_model.fit(X_train_pd, y_train_pd)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:57:46.084866Z","iopub.execute_input":"2025-06-14T16:57:46.085172Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ndef evaluate_model(model, X_val, y_val):\n    y_pred = model.predict(X_val)\n    \n    mae = mean_absolute_error(y_val, y_pred)\n    mse = mean_squared_error(y_val, y_pred)\n    rmse = np.sqrt(mse)\n    r2 = r2_score(y_val, y_pred)\n    \n    print(f\"MAE: {mae:.4f}\")\n    print(f\"MSE: {mse:.4f}\")\n    print(f\"RMSE: {rmse:.4f}\")\n    print(f\"R2 Score: {r2:.4f}\")\n    \n    return y_pred\n\nprint(\"Random Forest Performance:\")\nrf_pred = evaluate_model(rf_model, X_val_pd, y_val_pd)\n\nprint(\"\\nXGBoost Performance:\")\nxgb_pred = evaluate_model(xgb_model, X_val_pd, y_val_pd)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Random Forest Performance:\")\nrf_pred = evaluate_model(rf_model, X_val, y_val)\n\nprint(\"\\nXGBoost Performance:\")\nxgb_pred = evaluate_model(xgb_model, X_val, y_val)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nrf_feature_imp = pd.DataFrame({\n    'Feature': X.columns.to_list() if hasattr(X.columns, 'to_list') else X.columns,\n    'Importance': rf_model.feature_importances_\n}).sort_values('Importance', ascending=False)\n\nplt.figure(figsize=(12, 8))\nsns.barplot(x='Importance', y='Feature', data=rf_feature_imp.head(20))\nplt.title(\"Random Forest Feature Importance\")\nplt.show()\n\n\nxgb_feature_imp = pd.DataFrame({\n    'Feature': X.columns.to_list() if hasattr(X.columns, 'to_list') else X.columns,\n    'Importance': xgb_model.feature_importances_\n}).sort_values('Importance', ascending=False)\n\nplt.figure(figsize=(12, 8))\nsns.barplot(x='Importance', y='Feature', data=xgb_feature_imp.head(20))\nplt.title(\"XGBoost Feature Importance\")\nplt.show()\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ntest_features = test_df[X.columns] \n\n\n\ntest_features_pd = test_features\n\nfinal_predictions = xgb_model.predict(test_features_pd)\n\n\nsubmission = pd.DataFrame({\n    'Unique ID': test_ids.to_pandas() if hasattr(test_ids, 'to_pandas') else test_ids,\n    'Lap_Time_Seconds': final_predictions\n})\n\nsubmission.to_csv('sub.csv', index=False)\n","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}