{"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","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.8.19"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":84896,"databundleVersionId":10305135,"sourceType":"competition"}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"id":"d363b02a-183d-41bc-8e77-ac0e7f5ba60f","cell_type":"markdown","source":"Optimal Preprocessing","metadata":{}},{"id":"cbfe461a-21f4-43b4-94f0-0b59d0553ba2","cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport time\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.preprocessing import StandardScaler, MinMaxScaler, MaxAbsScaler, RobustScaler, OneHotEncoder, OrdinalEncoder\nfrom sklearn.base import BaseEstimator, TransformerMixin\nimport matplotlib.pyplot as plt","metadata":{},"outputs":[],"execution_count":null},{"id":"b8e0cdda-4e1d-42a6-b54a-22f7ca0dd251","cell_type":"code","source":"def frequency_encode(data, columns):\n    freq_encoders = {}\n    for col in columns:\n        freq_map = data[col].value_counts(normalize=True).to_dict()\n        data[col] = data[col].map(freq_map)\n        freq_encoders[col] = freq_map\n    return data, freq_encoders","metadata":{},"outputs":[],"execution_count":null},{"id":"32fcda0d-eccd-4b96-b1c8-f408cbdc7089","cell_type":"code","source":"# Load dataset\ndef load_data(file_path, target_column):\n    data = pd.read_csv(file_path)\n    X = data.drop(columns=[target_column], errors='ignore')\n    y = data[target_column] if target_column in data.columns else None\n    return X, y\n\n# File path and target\ntrain_file_path = \"/kaggle/input/playground-series-s4e12/train.csv\"  \ntarget = 'Premium Amount'\n\nX, y = load_data(train_file_path, target)\n\n# Identify numerical and categorical features\nnumerical_features = X.select_dtypes(include=['int64', 'float64']).columns.tolist()\ncategorical_features = X.select_dtypes(include=['object']).columns.tolist()\n\nprint(f\"Numerical Features: {numerical_features}\")\nprint(f\"Categorical Features: {categorical_features}\")","metadata":{},"outputs":[],"execution_count":null},{"id":"15642bba-5a1c-4b98-b025-6ce1571e62f6","cell_type":"code","source":"# Define preprocessing methods\nnumerical_imputation_methods = {\n    'mean': SimpleImputer(strategy='mean'),\n    'median': SimpleImputer(strategy='median'),\n    'constant': SimpleImputer(strategy='constant', fill_value=0)\n}\n\ncategorical_imputation_methods = {\n    'most_frequent': SimpleImputer(strategy='most_frequent'),\n    'constant': SimpleImputer(strategy='constant', fill_value='Missing')\n}\n\nscaling_methods = {\n    'standard': StandardScaler(),\n    'minmax': MinMaxScaler(),\n    'maxabs': MaxAbsScaler(),\n    'robust': RobustScaler()\n}\n\n# Split categorical features\nlow_cardinality_features = [col for col in categorical_features if X[col].nunique() <= 10]\nhigh_cardinality_features = [col for col in categorical_features if X[col].nunique() > 10]\nordinal_features = []  # Update this list if you find ordinal features in EDA","metadata":{},"outputs":[],"execution_count":null},{"id":"2de2739c-c671-4892-a633-b2b121a5d618","cell_type":"code","source":"def get_preprocessor(num_imp, cat_imp, scaler):\n    # Define transformers\n    numerical_transformer = Pipeline(steps=[\n        ('imputer', num_imp),\n        ('scaler', scaler)\n    ])\n    \n    low_cardinality_transformer = Pipeline(steps=[\n        ('imputer', cat_imp),\n        ('encoder', OneHotEncoder(handle_unknown='ignore', sparse_output=False))\n    ])\n    \n    high_cardinality_transformer = Pipeline(steps=[\n        ('imputer', cat_imp),\n        ('encoder', OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1))\n    ])\n    \n    # Combine transformers\n    preprocessor = ColumnTransformer(\n        transformers=[\n            ('num', numerical_transformer, numerical_features),\n            ('low_card', low_cardinality_transformer, low_cardinality_features),\n            ('high_card', high_cardinality_transformer, high_cardinality_features)\n        ]\n    )\n    return preprocessor","metadata":{},"outputs":[],"execution_count":null},{"id":"9dca959c-3160-45b9-ad7f-d4ef6672887f","cell_type":"code","source":"def evaluate_combination(X, y, num_imp, cat_imp, scaler, random_state=42):\n    # Split data\n    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=random_state)\n    \n    # Get preprocessor\n    preprocessor = get_preprocessor(num_imp, cat_imp, scaler)\n    \n    # Define pipeline\n    model = RandomForestRegressor(n_estimators=50, max_depth=10, random_state=random_state)\n    pipeline = Pipeline(steps=[\n        ('preprocessor', preprocessor),\n        ('model', model)\n    ])\n    \n    # Fit and evaluate\n    pipeline.fit(X_train, y_train)\n    score = pipeline.score(X_test, y_test)\n    \n    # Feature importances\n    feature_names = (\n        numerical_features +\n        list(pipeline.named_steps['preprocessor'].named_transformers_['low_card']['encoder'].get_feature_names_out(low_cardinality_features)) +\n        high_cardinality_features\n    )\n    feature_importances = pd.DataFrame({\n        'Feature': feature_names,\n        'Importance': pipeline.named_steps['model'].feature_importances_\n    }).sort_values(by='Importance', ascending=False)\n    \n    return score, feature_importances","metadata":{},"outputs":[],"execution_count":null},{"id":"62abc241-1467-4e05-b8b6-bb83fc1e5b8d","cell_type":"code","source":"results = []\nstart_time = time.time()\n\nfor num_imp_key, num_imp in numerical_imputation_methods.items():\n    for cat_imp_key, cat_imp in categorical_imputation_methods.items():\n        for scale_key, scaler in scaling_methods.items():\n            print(f\"Evaluating: num_imp={num_imp_key}, cat_imp={cat_imp_key}, scaler={scale_key}\")\n            score, feature_importances = evaluate_combination(X, y, num_imp, cat_imp, scaler)\n            results.append({\n                'num_imp': num_imp_key,\n                'cat_imp': cat_imp_key,\n                'scaler': scale_key,\n                'score': score,\n                'feature_importances': feature_importances\n            })\n\nprint(f\"Total Evaluation Time: {time.time() - start_time:.2f} seconds\")","metadata":{},"outputs":[],"execution_count":null},{"id":"03d65c45-20bd-431e-ac4b-f8ac9bb0fad2","cell_type":"code","source":"# Find best result\nbest_result = max(results, key=lambda x: x['score'])\n\n# Display best configuration\nprint(\"Best Configuration:\")\nprint(f\"Numerical Imputation: {best_result['num_imp']}\")\nprint(f\"Categorical Imputation: {best_result['cat_imp']}\")\nprint(f\"Scaling Method: {best_result['scaler']}\")\nprint(f\"R^2 Score: {best_result['score']}\")\n\n# Plot feature importances\nfeature_importances = best_result['feature_importances']\nplt.figure(figsize=(12, 8))\nplt.barh(feature_importances['Feature'], feature_importances['Importance'])\nplt.title('Feature Importances (Best Configuration)')\nplt.gca().invert_yaxis()\nplt.xlabel('Importance')\nplt.ylabel('Features')\nplt.show()","metadata":{},"outputs":[],"execution_count":null},{"id":"858c9c93-c99d-4377-aa04-323871837bf3","cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null}]}