{"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-14T16:08:01.407508Z","iopub.execute_input":"2025-06-14T16:08:01.407765Z","iopub.status.idle":"2025-06-14T16:08:03.057555Z","shell.execute_reply.started":"2025-06-14T16:08:01.407741Z","shell.execute_reply":"2025-06-14T16:08:03.056871Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import joblib\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.metrics import mean_absolute_error, r2_score, mean_squared_error\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import OneHotEncoder\nimport category_encoders as ce\nfrom lightgbm import LGBMRegressor, early_stopping, log_evaluation\nfrom xgboost import XGBRegressor, callback\nfrom sklearn.metrics import mean_squared_error","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:08:06.473690Z","iopub.execute_input":"2025-06-14T16:08:06.474362Z","iopub.status.idle":"2025-06-14T16:08:12.596870Z","shell.execute_reply.started":"2025-06-14T16:08:06.474320Z","shell.execute_reply":"2025-06-14T16:08:12.596310Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv('/kaggle/input/burnout-datathon-ieeecsmuj/train.csv')\nval_df = pd.read_csv('/kaggle/input/burnout-datathon-ieeecsmuj/val.csv')\ntest_df = pd.read_csv('/kaggle/input/burnout-datathon-ieeecsmuj/test.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:08:12.597882Z","iopub.execute_input":"2025-06-14T16:08:12.598416Z","iopub.status.idle":"2025-06-14T16:08:31.687761Z","shell.execute_reply.started":"2025-06-14T16:08:12.598396Z","shell.execute_reply":"2025-06-14T16:08:31.686915Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for df in [train_df, val_df, test_df]:\n    df['Penalty_Seconds'] = df['Penalty'].map({\n        '+3s': 3,\n        '+5s': 5,\n        'Ride Through': 20,\n        'DNS': 0,\n        'DNF': 0\n    }).fillna(0)\n\nfor df in [train_df, val_df, test_df]:\n    df['Tire_Combo'] = df['Tire_Compound_Front'] + '_' + df['Tire_Compound_Rear']\n    df['Temperature_Diff'] = df['Track_Temperature_Celsius'] - df['Ambient_Temperature_Celsius']\n\ntarget = 'Lap_Time_Seconds'\nfeatures = [\n    'Circuit_Length_km', 'Avg_Speed_kmh', 'Corners_per_Lap',\n    'Tire_Degradation_Factor_per_Lap', 'Pit_Stop_Duration_Seconds',\n    'Ambient_Temperature_Celsius', 'Track_Temperature_Celsius', 'Penalty_Seconds',\n    'Temperature_Diff', 'Track_Condition', 'Tire_Compound_Front',\n    'Tire_Compound_Rear', 'Tire_Combo', 'Session', 'circuit_name'\n]\n\nnumerical_features = [\n    'Circuit_Length_km', 'Avg_Speed_kmh', 'Corners_per_Lap',\n    'Tire_Degradation_Factor_per_Lap', 'Pit_Stop_Duration_Seconds',\n    'Ambient_Temperature_Celsius', 'Track_Temperature_Celsius', 'Penalty_Seconds',\n    'Temperature_Diff'\n]\nlow_cardinality_categorical = [\n    'Track_Condition', 'Tire_Compound_Front', 'Tire_Compound_Rear',\n    'Tire_Combo', 'Session'\n]\nhigh_cardinality_categorical = ['circuit_name']\n\nfor df in [train_df, val_df, test_df]:\n    for col in numerical_features:\n        df[col] = df[col].astype('float32')\n    if target in df.columns:\n        df[target] = df[target].astype('float32')\n\nX_train = train_df[features]\ny_train = train_df[target]\nX_val = val_df[features]\ny_val = val_df[target]\nX_test = test_df[features]\n\nnumerical_transformer = Pipeline(steps=[\n    ('imputer', SimpleImputer(strategy='median')),\n    ('scaler', StandardScaler())\n])\n\nlow_cardinality_transformer = Pipeline(steps=[\n    ('imputer', SimpleImputer(strategy='constant', fill_value='Unknown')),\n    ('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=True))\n])\n\nhigh_cardinality_transformer = Pipeline(steps=[\n    ('imputer', SimpleImputer(strategy='constant', fill_value='Unknown')),\n    ('target', ce.TargetEncoder())\n])\n\npreprocessor = ColumnTransformer(\n    transformers=[\n        ('num', numerical_transformer, numerical_features),\n        ('low_cat', low_cardinality_transformer, low_cardinality_categorical),\n        ('high_cat', high_cardinality_transformer, high_cardinality_categorical)\n    ])\n\nX_train_transformed = preprocessor.fit_transform(X_train, y_train)\nX_val_transformed = preprocessor.transform(X_val)\nX_test_transformed = preprocessor.transform(X_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:08:31.688646Z","iopub.execute_input":"2025-06-14T16:08:31.688938Z","iopub.status.idle":"2025-06-14T16:08:41.795917Z","shell.execute_reply.started":"2025-06-14T16:08:31.688889Z","shell.execute_reply":"2025-06-14T16:08:41.795327Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"xgb_model = XGBRegressor(\n    n_estimators=10000,\n    learning_rate=1,\n    objective='reg:squarederror',\n    tree_method='gpu_hist',              # use 'gpu_hist' if you have a GPU\n    random_state=42,\n    verbosity=0                      # use 0 to suppress log duplication\n)\n\n# Fit the model with early stopping and log evaluation every 20 rounds\nxgb_model.fit(\n    X_train_transformed, y_train,\n    eval_set=[(X_val_transformed, y_val)],\n    eval_metric='rmse',\n    callbacks=[\n        callback.EarlyStopping(rounds=100, save_best=True, metric_name='rmse'),\n    ]\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:21:09.096385Z","iopub.execute_input":"2025-06-14T16:21:09.096649Z","execution_failed":"2025-06-14T17:09:38.385Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = Pipeline(steps=[\n    ('preprocessor', preprocessor),\n    ('regressor', xgb_model)\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:17:24.803152Z","iopub.execute_input":"2025-06-14T16:17:24.803680Z","iopub.status.idle":"2025-06-14T16:17:24.807151Z","shell.execute_reply.started":"2025-06-14T16:17:24.803657Z","shell.execute_reply":"2025-06-14T16:17:24.806343Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_val_pred = model.predict(X_val)\nmean_squared_error(y_val, y_val_pred)\njoblib.dump(xgb_model, 'lgbm_model1_0.6.pkl')\ny_test_val = model.predict(X_test)\nresults_df = test_df[['Unique ID']].copy()\nresults_df['Lap_Time_Seconds'] = y_test_val \nresults_df.to_csv('submission1.csv', index=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:18:00.272889Z","iopub.execute_input":"2025-06-14T16:18:00.273525Z","iopub.status.idle":"2025-06-14T16:18:05.555964Z","shell.execute_reply.started":"2025-06-14T16:18:00.273500Z","shell.execute_reply":"2025-06-14T16:18:05.554787Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_val_pred.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:18:11.063692Z","iopub.execute_input":"2025-06-14T16:18:11.064252Z","iopub.status.idle":"2025-06-14T16:18:11.068714Z","shell.execute_reply.started":"2025-06-14T16:18:11.064230Z","shell.execute_reply":"2025-06-14T16:18:11.068063Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"results_df.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-14T16:18:12.145827Z","iopub.execute_input":"2025-06-14T16:18:12.146094Z","iopub.status.idle":"2025-06-14T16:18:12.150917Z","shell.execute_reply.started":"2025-06-14T16:18:12.146077Z","shell.execute_reply":"2025-06-14T16:18:12.150339Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}