# Complex demo: Load Boston dataset, clean, feature engineer, train regression, evaluate, visualize
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt

def advanced_regression_demo():
    # Load and clean
    boston = load_boston()
    df = pd.DataFrame(boston.data, columns=boston.feature_names)
    df['Target'] = boston.target
    df = df.fillna(df.mean())
    # Feature engineering
    df['CRIM_RM'] = df['CRIM'] * df['RM']
    # Split
    X = df.drop('Target', axis=1)
    y = df['Target']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    # Train
    model = LinearRegression()
    model.fit(X_train, y_train)
    # Predict and evaluate
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    print(f"Mean Squared Error: {mse:.2f}")
    # Visualize
    plt.scatter(y_test, y_pred, c='blue', alpha=0.5)
    plt.xlabel('True Values')
    plt.ylabel('Predictions')
    plt.title('AI Regression Demo: Boston Housing')
    plt.annotate('Best Fit', xy=(y_test.mean(), y_pred.mean()), xytext=(y_test.mean() + 1, y_pred.mean() + 1), arrowprops=dict(facecolor='black', shrink=0.05))
    plt.show()

advanced_regression_demo()