# Complex demo: Load California Housing, split, regress, evaluate with MSE/R2, visualize residuals
import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import numpy as np

def advanced_regression_eval():
    # Load and prep
    housing = fetch_california_housing()
    df = pd.DataFrame(housing.data, columns=housing.feature_names)
    df['Target'] = housing.target
    X = df.drop('Target', axis=1)
    y = df['Target']
    # Split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
    # Train and predict
    model = LinearRegression()
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    # Evaluate with multiple metrics
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    print(f"Mean Squared Error: {mse:.2f}")
    print(f"R2 Score: {r2:.2f}")
    # Visualize residuals
    residuals = y_test - y_pred
    plt.scatter(y_test, residuals, c='red', alpha=0.5)
    plt.axhline(0, color='black', linestyle='--')
    plt.xlabel('True Values')
    plt.ylabel('Residuals')
    plt.title('Residuals Plot for California Housing Regression')
    plt.annotate('Low Residual', xy=(y_test.mean(), 0), xytext=(y_test.mean() + 0.5, 0.5), arrowprops=dict(facecolor='black', shrink=0.05))
    plt.show()

advanced_regression_eval()