{"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":"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":"# 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-14T13:33:48.155408Z","iopub.execute_input":"2025-06-14T13:33:48.155828Z","iopub.status.idle":"2025-06-14T13:33:50.392312Z","shell.execute_reply.started":"2025-06-14T13:33:48.155797Z","shell.execute_reply":"2025-06-14T13:33:50.390831Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data = pd.read_csv(\"/kaggle/input/burnout-datathon-ieeecsmuj/train.csv\")\ntest_data =  pd.read_csv(\"/kaggle/input/burnout-datathon-ieeecsmuj/test.csv\")\nval_data =  pd.read_csv(\"/kaggle/input/burnout-datathon-ieeecsmuj/val.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:33:50.393865Z","iopub.execute_input":"2025-06-14T13:33:50.394447Z","iopub.status.idle":"2025-06-14T13:34:17.654360Z","shell.execute_reply.started":"2025-06-14T13:33:50.394394Z","shell.execute_reply":"2025-06-14T13:34:17.653287Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train = train_data[[col for col in train_data.columns if col != 'Lap_Time_Seconds']]\ny_train = train_data['Lap_Time_Seconds']\n\nX_val = val_data[[col for col in val_data.columns if col != 'Lap_Time_Seconds']]\ny_val = val_data['Lap_Time_Seconds']\n\nX_test = test_data\n\nprint(f\"\\n{X_train.info()}\\n\")\n#Columns\nprint(f\"Number of Features: {len(X_train.columns)}\")\nprint(f\"List of Features: {X_train.columns}\")\n\n\nprint(f\"Number of Features: {len(X_val.columns)}\")\nprint(f\"List of Features: {X_val.columns}\")\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:34:17.656232Z","iopub.execute_input":"2025-06-14T13:34:17.656484Z","iopub.status.idle":"2025-06-14T13:34:18.109791Z","shell.execute_reply.started":"2025-06-14T13:34:17.656464Z","shell.execute_reply":"2025-06-14T13:34:18.108983Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"numerical_columns = []\ncategorical_columns = []\nfor i, dtype in enumerate(X_train.dtypes):\n    if dtype == 'object':\n        categorical_columns.append(X_train.dtypes.index[i])\n    else:\n        numerical_columns.append(X_train.dtypes.index[i])\n\nprint(f\"Categorical Columns: {categorical_columns}\\n---------------------\") #Needs to be encoded\nprint(f\"Numerical Columns: {numerical_columns}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:34:18.110863Z","iopub.execute_input":"2025-06-14T13:34:18.111133Z","iopub.status.idle":"2025-06-14T13:34:18.121137Z","shell.execute_reply.started":"2025-06-14T13:34:18.111109Z","shell.execute_reply":"2025-06-14T13:34:18.119985Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"X_train[numerical_columns].describe()\n#No need to scale the data.","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:34:18.122183Z","iopub.execute_input":"2025-06-14T13:34:18.122590Z","iopub.status.idle":"2025-06-14T13:34:20.821390Z","shell.execute_reply.started":"2025-06-14T13:34:18.122558Z","shell.execute_reply":"2025-06-14T13:34:20.820525Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for col in categorical_columns:\n    print(f\"Number of unique values in {col}: {X_train[col].nunique()}\")\n#Dropping rider_name,team_name,bike_name.","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:34:20.822201Z","iopub.execute_input":"2025-06-14T13:34:20.822426Z","iopub.status.idle":"2025-06-14T13:34:22.195564Z","shell.execute_reply.started":"2025-06-14T13:34:20.822407Z","shell.execute_reply":"2025-06-14T13:34:22.194698Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Number of null values in each column: {X_train.isnull().sum()}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:34:22.196476Z","iopub.execute_input":"2025-06-14T13:34:22.196714Z","iopub.status.idle":"2025-06-14T13:34:23.560623Z","shell.execute_reply.started":"2025-06-14T13:34:22.196694Z","shell.execute_reply":"2025-06-14T13:34:23.559179Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Columns that can be dropped since they are not relevant to performance/ lap timing.\ncolumns_to_be_dropped = ['shortname','circuit_name','rider_name','team_name','bike_name','Unique ID', 'Penalty']\nX_train = X_train.drop(columns=columns_to_be_dropped, errors='ignore')\nX_val  = X_val.drop(columns=columns_to_be_dropped, errors='ignore')\nX_test = X_test.drop(columns=columns_to_be_dropped, errors='ignore')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:34:23.561624Z","iopub.execute_input":"2025-06-14T13:34:23.561988Z","iopub.status.idle":"2025-06-14T13:34:23.931767Z","shell.execute_reply.started":"2025-06-14T13:34:23.561953Z","shell.execute_reply":"2025-06-14T13:34:23.930696Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len(X_val.columns), len(X_train.columns), len(X_test.columns)  #making sure there are no errors.","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T13:34:23.933976Z","iopub.execute_input":"2025-06-14T13:34:23.934251Z","iopub.status.idle":"2025-06-14T13:34:23.941312Z","shell.execute_reply.started":"2025-06-14T13:34:23.934231Z","shell.execute_reply":"2025-06-14T13:34:23.940209Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"Final Columns: {len(X_train.columns)}\")\n\n#Encoding\none_hot_features = ['category_x', 'Tire_Compound_Front', 'Tire_Compound_Rear','Session']\nordinal_features = ['Track_Condition', 'weather', 'track']\n\nfor col in ordinal_features:\n    print(X_train[col].unique())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:47:41.291864Z","iopub.execute_input":"2025-06-14T16:47:41.292213Z","iopub.status.idle":"2025-06-14T16:47:41.582213Z","shell.execute_reply.started":"2025-06-14T16:47:41.292188Z","shell.execute_reply":"2025-06-14T16:47:41.581080Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"numerical_features = [col for col in X_train.columns if col not in categorical_columns]\nnumerical_features","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:47:43.191854Z","iopub.execute_input":"2025-06-14T16:47:43.192203Z","iopub.status.idle":"2025-06-14T16:47:43.201140Z","shell.execute_reply.started":"2025-06-14T16:47:43.192178Z","shell.execute_reply":"2025-06-14T16:47:43.199945Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.preprocessing import OneHotEncoder, OrdinalEncoder, StandardScaler\nfrom sklearn.metrics import mean_squared_error\n\nfrom xgboost import XGBRegressor\n\n\ntrack_condition = ['Dry', 'Wet']\nWeather = X_train['weather'].unique().tolist()\nTrack = ['Dry','Wet']\n\nordinal_encoder = OrdinalEncoder(categories=[track_condition, Weather, Track])\n\npreprocessor = ColumnTransformer(transformers=[\n    ('oh', OneHotEncoder(handle_unknown='ignore'), one_hot_features),\n    ('ord', ordinal_encoder, ordinal_features),\n    ('scaler',StandardScaler(), numerical_features)\n]\n)\n\nmodel_xgb = Pipeline(steps=[\n    ('preprocess', preprocessor),\n    ('regressor', XGBRegressor(\n        n_estimators=2000,\n        learning_rate=1,\n        max_depth=9,\n        random_state=27\n    ))\n])\n\nmodel_xgb.fit(X_train,y_train)\nval_preds = model_xgb.predict(X_val)\nval_score = mean_squared_error(y_val, val_preds)\nprint(f\"Validation Score of our model: {val_score}\")\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:06:51.753999Z","iopub.execute_input":"2025-06-14T16:06:51.754698Z","iopub.status.idle":"2025-06-14T16:11:04.779741Z","shell.execute_reply.started":"2025-06-14T16:06:51.754667Z","shell.execute_reply":"2025-06-14T16:11:04.778698Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#1.498543550897384e-08","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_preds = model_xgb.predict(X_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T15:42:32.988508Z","iopub.execute_input":"2025-06-14T15:42:32.990621Z","iopub.status.idle":"2025-06-14T15:42:46.560851Z","shell.execute_reply.started":"2025-06-14T15:42:32.990586Z","shell.execute_reply":"2025-06-14T15:42:46.560139Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(type(test_preds))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T15:42:53.369463Z","iopub.execute_input":"2025-06-14T15:42:53.369793Z","iopub.status.idle":"2025-06-14T15:42:53.375607Z","shell.execute_reply.started":"2025-06-14T15:42:53.369769Z","shell.execute_reply":"2025-06-14T15:42:53.374521Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_pred_df = pd.DataFrame(test_preds, columns=['Lap_Time_Seconds'],index=test_data['Unique ID'])\ntest_pred_df.index.name = 'Unique ID'\ntest_pred_df.to_csv('/kaggle/working/submission.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T15:49:33.129661Z","iopub.execute_input":"2025-06-14T15:49:33.129998Z","iopub.status.idle":"2025-06-14T15:49:34.019377Z","shell.execute_reply.started":"2025-06-14T15:49:33.129971Z","shell.execute_reply":"2025-06-14T15:49:34.018232Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install lightgbm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:02:18.073588Z","iopub.execute_input":"2025-06-14T16:02:18.074019Z","iopub.status.idle":"2025-06-14T16:02:26.086457Z","shell.execute_reply.started":"2025-06-14T16:02:18.073990Z","shell.execute_reply":"2025-06-14T16:02:26.083585Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from lightgbm import LGBMRegressor\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.preprocessing import OneHotEncoder, OrdinalEncoder, StandardScaler\nfrom sklearn.metrics import mean_squared_error\n\npreprocessor = ColumnTransformer(transformers=[\n    ('oh', OneHotEncoder(handle_unknown='ignore'), one_hot_features),\n    ('ord', ordinal_encoder, ordinal_features),\n    ('scaler',StandardScaler(), numerical_features)\n]\n)\n\n\nmodel_lgbm = Pipeline(steps=[\n    ('preprocess', preprocessor), \n    ('regressor', LGBMRegressor(\n        n_estimators=1000,\n        learning_rate=1, \n        num_leaves=31,     \n        random_state=27\n    ))\n])\n\n\nmodel_lgbm.fit(X_train, y_train)\n\n\nval_preds_lgbm = model_lgbm.predict(X_val)\nval_score_lgbm = mean_squared_error(y_val, val_preds_lgbm)\nprint(f\"Validation Score of LightGBM model: {val_score_lgbm}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:06:26.262715Z","iopub.execute_input":"2025-06-14T16:06:26.264095Z","iopub.status.idle":"2025-06-14T16:06:40.627935Z","shell.execute_reply.started":"2025-06-14T16:06:26.264056Z","shell.execute_reply":"2025-06-14T16:06:40.626507Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# #Deep NN\n# import tensorflow as tf\n# from tensorflow.keras import layers, models\n\n# X_train_processed = preprocessor.fit_transform(X_train)\n# X_val_processed = preprocessor.transform(X_val)\n\n# model = tf.keras.Sequential([\n#     tf.keras.layers.Input(shape=(X_train_processed.shape[1],)),\n    \n#     tf.keras.layers.Dense(256, activation='relu'),\n#     tf.keras.layers.BatchNormalization(),\n#     tf.keras.layers.Dropout(0.3),\n    \n#     tf.keras.layers.Dense(128, activation='relu'),\n#     tf.keras.layers.BatchNormalization(),\n#     tf.keras.layers.Dropout(0.3),\n\n#     tf.keras.layers.Dense(64, activation='relu'),\n#     tf.keras.layers.Dense(1)\n# ])\n\n# model.compile(\n#     optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),\n#     loss='mse',\n#     metrics=[tf.keras.metrics.RootMeanSquaredError()]\n# )\n\n# callbacks = [\n#     tf.keras.callbacks.EarlyStopping(\n#         monitor='val_loss', \n#         patience=5, \n#         restore_best_weights=True\n#     ),\n#     tf.keras.callbacks.ModelCheckpoint(\n#         filepath='best_model.keras',\n#         monitor='val_loss',\n#         save_best_only=True\n#     )\n# ]\n\n# history = model.fit(\n#     X_train_processed, y_train,\n#     validation_data=(X_val_processed, y_val),\n#     epochs=100,\n#     batch_size=1024,\n#     callbacks=callbacks,\n#     verbose=1\n# )\n\n# # Step 5: Evaluate on validation\n# val_loss, val_rmse = model.evaluate(X_val_processed, y_val)\n# print(f\"Validation RMSE: {val_rmse}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T14:34:04.818050Z","iopub.execute_input":"2025-06-14T14:34:04.818946Z"}},"outputs":[],"execution_count":null}]}