{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":82253,"databundleVersionId":8965849,"sourceType":"competition"}],"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"#### import numpy as np\nimport pandas as pd\nfrom sklearn.experimental import enable_iterative_imputer\nfrom sklearn.impute import IterativeImputer, SimpleImputer\nfrom sklearn.preprocessing import OneHotEncoder, StandardScaler\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.model_selection import train_test_split, RandomizedSearchCV\nfrom xgboost import XGBRegressor, plot_importance\nfrom sklearn.metrics import mean_squared_error\nimport matplotlib.pyplot as plt\nfrom scipy.stats import randint, uniform\n\n# Load and preprocess data\ndef load_data(filepath, dtype_dict, na_values):\n    data = pd.read_csv(filepath, dtype=dtype_dict, low_memory=False, na_values=na_values)\n    # Drop specified columns if they exist\n    columns_to_drop = ['url_x', 'resultId', 'racerId', 'driverId', 'url', 'positionText_x', 'positionOrder', 'statusId', 'driver_code', 'url_y', 'positionText_y']\n    data.drop(columns=[col for col in columns_to_drop if col in data.columns], inplace=True)\n    return data\n\ndef add_features(df):\n    # Driver experience\n    df['driver_experience'] = df['year'] - df.groupby('constructorId')['year'].transform('min')\n    \n    # Average lap time\n    df['avg_lap_time'] = df['timetaken_in_millisec'] / df['laps']\n    \n    # Lap time statistics\n    df['lap_time_std'] = df.groupby('driverId')['timetaken_in_millisec'].transform('std')\n    df['lap_time_max'] = df.groupby('driverId')['timetaken_in_millisec'].transform('max')\n    df['lap_time_median'] = df.groupby('driverId')['timetaken_in_millisec'].transform('median')\n    \n    # Speed metrics\n    df['avg_speed'] = df['max_speed'] / df['laps']\n    df['speed_var'] = df.groupby('driverId')['max_speed'].transform('var')\n    \n    # Grid position changes\n    df['grid_pos_change'] = df['grid'] - df.groupby('driverId')['grid'].transform('mean')\n    \n    # Race duration\n    df['race_duration'] = df['laps'] * df['avg_lap_time']\n    \n    # Race completion rate\n    df['completion_rate'] = df['laps'] / df.groupby('driverId')['laps'].transform('max')\n    \n    # Interaction features\n    df['interaction_grid_laps'] = df['grid'] * df['laps']\n    \n    # Log transformations\n    df['log_avg_lap_time'] = np.log1p(df['avg_lap_time'])\n    df['log_race_duration'] = np.log1p(df['race_duration'])\n    \n    # Date-Time features (Assuming there are date-time fields, if not, this can be skipped)\n    # df['race_month'] = pd.to_datetime(df['date']).dt.month\n    # df['race_day'] = pd.to_datetime(df['date']).dt.day\n    # df['race_hour'] = pd.to_datetime(df['date']).dt.hour\n    \n    return df\n\n# Setup pipeline\ndef get_pipeline(numeric_features, categorical_features):\n    numeric_transformer = Pipeline([\n        ('imputer', IterativeImputer(random_state=0)),\n        ('scaler', StandardScaler())\n    ])\n\n    categorical_transformer = Pipeline([\n        ('imputer', SimpleImputer(strategy='most_frequent')),\n        ('onehot', OneHotEncoder(handle_unknown='ignore'))\n    ])\n\n    preprocessor = ColumnTransformer([\n        ('num', numeric_transformer, numeric_features),\n        ('cat', categorical_transformer, categorical_features)\n    ])\n\n    return Pipeline([\n        ('preprocessor', preprocessor),\n        ('regressor', XGBRegressor(random_state=42, objective='reg:squarederror', n_jobs=-1))\n    ])\n\n# Perform training and evaluation\ndef train_and_evaluate(X_train, y_train, X_val, y_val):\n    param_distributions = {\n        'regressor__n_estimators': randint(100, 200),\n        'regressor__learning_rate': uniform(0.01, 0.1),\n        'regressor__max_depth': randint(3, 10)\n    }\n    search = RandomizedSearchCV(pipeline, param_distributions, n_iter=50, cv=3, n_jobs=-1, scoring='neg_mean_squared_error', random_state=42)\n    search.fit(X_train, y_train)\n\n    best_model = search.best_estimator_\n\n    # Validate the model\n    y_val_pred = best_model.predict(X_val)\n    val_rmse = np.sqrt(mean_squared_error(y_val, y_val_pred))\n    print(f'Validation RMSE: {val_rmse}')\n\n    return best_model\n\n# Plot feature importances\ndef plot_features(model):\n    plt.figure(figsize=(10, 6))\n    plot_importance(model.named_steps['regressor'], max_num_features=10)\n    plt.show()\n\n# Load datasets\ndtype_dict = {\n    'number': 'str',\n    'time_x': 'str',\n    'timetaken_in_millisec': 'float',\n    'fastestLap': 'str',\n    'result_driver_standing': 'str'\n}\nna_values = ['\\\\N']\n\ntrain_df = load_data('/content/train.csv', dtype_dict, na_values)\ntest_df = load_data('/content/test.csv', dtype_dict, na_values)\nvalidation_df = load_data('/content/validation.csv', dtype_dict, na_values)\n\ntrain_df = add_features(train_df)\ntest_df = add_features(test_df)\nvalidation_df = add_features(validation_df)\n\n# Separate features and target for training and validation\nfeatures = ['constructorId', 'grid', 'points', 'laps', 'fastestLap', 'rank',\n            'max_speed', 'year', 'round', 'circuitId', 'driver_experience', 'avg_lap_time',\n            'lap_time_std', 'lap_time_max', 'lap_time_median', 'avg_speed', 'speed_var', 'grid_pos_change',\n            'race_duration', 'completion_rate', 'interaction_grid_laps', 'log_avg_lap_time', 'log_race_duration']\nX_train = train_df[features]\ny_train = train_df['position_x'].astype(float)\n\nX_val = validation_df[features]\ny_val = validation_df['position_x'].astype(float)\n\n# Impute missing values in the target variable\ny_train.fillna(y_train.median(), inplace=True)\ny_val.fillna(y_val.median(), inplace=True)\n\n# Define numerical and categorical features\nnumeric_features = ['grid', 'points', 'laps', 'rank', 'max_speed', 'year', 'round', 'driver_experience', 'avg_lap_time',\n                    'lap_time_std', 'lap_time_max', 'lap_time_median', 'avg_speed', 'speed_var', 'grid_pos_change',\n                    'race_duration', 'completion_rate', 'interaction_grid_laps', 'log_avg_lap_time', 'log_race_duration']\ncategorical_features = ['constructorId', 'fastestLap', 'circuitId']\n\n# Get the pipeline\npipeline = get_pipeline(numeric_features, categorical_features)\nbest_model = train_and_evaluate(X_train, y_train, X_val, y_val)\n\n# Plot feature importance\nplot_features(best_model)\n\n# Prepare test data\nX_test = test_df[features]\ny_test_pred = best_model.predict(X_test)\ny_test_pred = np.round(y_test_pred).astype(int)  # Convert predictions to integer\n\n# Generate submission file\nsubmission = pd.DataFrame({\n    'Position': y_test_pred,\n    'Driver Standings': test_df['result_driver_standing']\n})\nsubmission.to_csv('/content/train.csv/submission.csv', index=False)\nprint(\"Submission file created successfully.\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-06-29T06:28:45.848692Z","iopub.execute_input":"2024-06-29T06:28:45.849206Z","iopub.status.idle":"2024-06-29T06:28:46.835682Z","shell.execute_reply.started":"2024-06-29T06:28:45.849173Z","shell.execute_reply":"2024-06-29T06:28:46.834007Z"}}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}