{"metadata":{"colab":{"provenance":[]},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.13"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":82253,"databundleVersionId":8965849,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"### Necessary Imports","metadata":{"id":"n_jTQZUjupBr"}},{"cell_type":"code","source":"import pandas as pd\nimport lightgbm as lgb\nfrom sklearn.metrics import mean_squared_error, r2_score\nfrom sklearn.svm import SVR\nimport numpy as np\nimport seaborn as sns\nimport matplotlib.pyplot as plt","metadata":{"id":"Q45fntoo5P_p"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Importing Data","metadata":{"id":"LjY3MaeguuT5"}},{"cell_type":"code","source":"traindf=pd.read_csv(\"./data/train.csv\")","metadata":{"id":"NaHaOEUQ73tR"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"testdf = pd.read_csv(\"./data/test.csv\")","metadata":{"id":"hXRmm8Wau-20"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validationdf = pd.read_csv(\"./data/validation.csv\")","metadata":{"id":"ho5sn8LcvCCT"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Data Cleaning","metadata":{"id":"eecnuqj3vFXN"}},{"cell_type":"code","source":"traindf.replace('\\\\N', None, inplace=True)\n\n# dropping values that are not neeeded\ndf=traindf.drop(['time_x', 'timetaken_in_millisec', 'fastestLap', 'rank', 'fastestLapTime', 'max_speed', 'time_y', 'url_x', 'fp1_date', 'fp1_time', 'fp2_date'\n            , 'fp2_time', 'fp3_date', 'fp3_time', 'quali_date', 'quali_time', 'sprint_date', 'sprint_time', 'driver_num', 'driver_code', 'url_y'\n             ,\"number\", \"position_x\", 'nationality_y', 'url', 'status', 'positionText_y', 'constructorRef', 'forename', 'surname', 'driverRef', 'positionText_x', 'nationality'], axis=1)\n\n\n#converting the dob and date column into years to determine the age of the driver\ndf['dob'] = pd.to_datetime(df['dob'])\ndf['date'] = pd.to_datetime(df['date'])\ndf['time_difference'] = df['date'] - df['dob']\ndf['years'] = (df['time_difference'].dt.days / 365.25).astype(int)\n\ndf = df.drop(['dob', 'date', 'time_difference'], axis=1)\n\n# using frequency encoding for grand_prix and company\nfrequency_grand_prix = df['grand_prix'].value_counts(normalize=True)\ndf['grand_prix_encoded'] = df['grand_prix'].map(frequency_grand_prix)\n\nfrequency_company = df['company'].value_counts(normalize=True)\ndf['company_encoded'] = df['company'].map(frequency_company)\n\ndf = df.drop(['grand_prix', 'company'], axis=1)\n","metadata":{"id":"KsIfb6utu2_O"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"testdf.replace('\\\\N', None, inplace=True)\n\n# dropping values that are not neeeded\ndf1=testdf.drop(['time_x', 'timetaken_in_millisec', 'fastestLap', 'rank', 'fastestLapTime', 'max_speed', 'time_y', 'url_x', 'fp1_date', 'fp1_time', 'fp2_date'\n            , 'fp2_time', 'fp3_date', 'fp3_time', 'quali_date', 'quali_time', 'sprint_date', 'sprint_time', 'driver_num', 'driver_code', 'url_y'\n             ,\"number\", \"position_x\", 'nationality_y', 'url', 'status', 'constructorRef', 'forename', 'surname', 'driverRef', 'positionText_x', 'nationality'], axis=1)\n\n\n#converting the dob and date column into years to determine the age of the driver\ndf1['dob'] = pd.to_datetime(df1['dob'])\ndf1['date'] = pd.to_datetime(df1['date'])\ndf1['time_difference'] = df1['date'] - df1['dob']\ndf1['years'] = (df1['time_difference'].dt.days / 365.25).astype(int)\n\ndf1 = df1.drop(['dob', 'date', 'time_difference'], axis=1)\n\n# using frequency encoding for grand_prix and company\nfrequency_grand_prix = df1['grand_prix'].value_counts(normalize=True)\ndf1['grand_prix_encoded'] = df1['grand_prix'].map(frequency_grand_prix)\n\nfrequency_company = df1['company'].value_counts(normalize=True)\ndf1['company_encoded'] = df1['company'].map(frequency_company)\n\ndf1 = df1.drop(['grand_prix', 'company'], axis=1)\n","metadata":{"id":"PZA_Bx27vHxe"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validationdf.replace('\\\\N', None, inplace=True)\n\n# dropping values that are not neeeded\ndf2=validationdf.drop(['time_x', 'timetaken_in_millisec', 'fastestLap', 'rank', 'fastestLapTime', 'max_speed', 'time_y', 'url_x', 'fp1_date', 'fp1_time', 'fp2_date'\n            , 'fp2_time', 'fp3_date', 'fp3_time', 'quali_date', 'quali_time', 'sprint_date', 'sprint_time', 'driver_num', 'driver_code', 'url_y'\n             ,\"number\", \"position_x\", 'nationality_y', 'url', 'status', 'positionText_y', 'constructorRef', 'forename', 'surname', 'driverRef', 'positionText_x', 'nationality'], axis=1)\n\n\n#converting the dob and date column into years to determine the age of the driver\ndf2['dob'] = pd.to_datetime(df2['dob'])\ndf2['date'] = pd.to_datetime(df2['date'])\ndf2['time_difference'] = df2['date'] - df2['dob']\ndf2['years'] = (df2['time_difference'].dt.days / 365.25).astype(int)\n\ndf2 = df2.drop(['dob', 'date', 'time_difference'], axis=1)\n\n# using frequency encoding for grand_prix and company\nfrequency_grand_prix = df2['grand_prix'].value_counts(normalize=True)\ndf2['grand_prix_encoded'] = df2['grand_prix'].map(frequency_grand_prix)\n\nfrequency_company = df2['company'].value_counts(normalize=True)\ndf2['company_encoded'] = df2['company'].map(frequency_company)\n\ndf2 = df2.drop(['grand_prix', 'company'], axis=1)\n","metadata":{"id":"hMYbR1lvvW9f"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Heatmaps","metadata":{}},{"cell_type":"code","source":"corr_matrix = df.corr()\n\nmask = np.triu(np.ones_like(corr_matrix, dtype=bool))\nf, ax = plt.subplots(figsize=(20, 20))\n\ncmap = sns.diverging_palette(230, 20, as_cmap=True)\nsns.heatmap(corr_matrix, mask=mask, cmap=cmap, vmax=.3, center=0,square=True, linewidths=.5, cbar_kws={\"shrink\": .5}, annot_kws={\"fontsize\": 12})\n\nax.axvline(x=20, ymin=0, ymax=1, color='black', linewidth=2)\nax.axhline(y=20, xmin=0, xmax=1, color='black', linewidth=2)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Since `grand_prix_encoded` isn't helping much here as a feature, we will drop it.","metadata":{}},{"cell_type":"code","source":"df = df.drop(['grand_prix_encoded'], axis=1)\ndf1 = df1.drop(['grand_prix_encoded'], axis=1)\ndf2 = df2.drop(['grand_prix_encoded'], axis=1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Training Parameters","metadata":{"id":"DDNFdkTIvkl0"}},{"cell_type":"code","source":"params = {\n    'objective': 'regression',\n    'metric': 'rmse',\n    'num_leaves': 80,\n    'learning_rate': 0.1,\n    'feature_fraction': 0.9,\n    'bagging_fraction': 0.8,\n    'bagging_freq': 5,\n    'device': 'gpu'\n}","metadata":{"id":"qxB7FeOPvgUB"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = df.drop(columns=['position'])\ny_train = df['position']\n\nX_test = df2.drop(columns=['position'])\ny_test = df2['position']\n\npredictkardo = df1\npredictkardo","metadata":{"id":"6d6Ao8aIvpVD"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Dataset Training","metadata":{"id":"OZQF9F3EvwPr"}},{"cell_type":"code","source":"train_data = lgb.Dataset(X_train, label=y_train)\ntest_data = lgb.Dataset(X_test, label=y_test, reference=train_data)\n\n# Train the model\nnum_round = 3000\nbst = lgb.train(params, train_data, num_round, valid_sets=[test_data])","metadata":{"id":"cvMDU53NvuTN"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Model Prediction","metadata":{"id":"3apzHaDlvzLi"}},{"cell_type":"code","source":"# Predict on the test set\n# y_pred = bst.predict(predictkardo, num_iteration=bst.best_iteration)\n\n# Predict on the validation set\ny_pred = bst.predict(X_test, num_iteration=bst.best_iteration)","metadata":{"id":"ec_Hdb1rv1hc"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Validation Dataset evaluation","metadata":{"id":"WmobRGDrwCtQ"}},{"cell_type":"code","source":"# Evaluate the model for validation set\nrmse = mean_squared_error(y_test, y_pred, squared=False)\nr2 = r2_score(y_test, y_pred)\nprint(f'RMSE: {rmse}')\nprint(f'R²: {r2}')","metadata":{"id":"IZGuJVeSwG2V"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Saving model and submission.csv","metadata":{"id":"WXcFWOIswRW6"}},{"cell_type":"code","source":"# Optionally, save the model\n# bst.save_model('lightgbm_model.txt')\n\n# Print sample predictions\npredictions_df = predictkardo.copy()\n# predictions_df['actual_position'] = y_test\npredictions_df['position'] = y_pred\n# predictions_df\nsubmissions = predictions_df[['position', 'result_driver_standing']]\nprint(submissions)\nsubmissions.to_csv('submission.csv', index=False)\n# predictions_df","metadata":{"id":"CYdmwZW9wWDz"},"execution_count":null,"outputs":[]}]}