Skip to content

Linear Modeling Extentions


📲 **Function Calls & Imports

# 📦 Imports
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
from sklearn.linear_model import Ridge, Lasso, ElasticNet
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error

#OLS
# 📦 Import
from linear_modeling_extensions import ols_regression_runner

# Train/test already split
model = ols_regression_runner(X_train, y_train, X_test, y_test, robust=True, robust_type='HC3')

#Ridge
# 📦 Import
from linear_modeling_extensions import ridge_regression_runner

# Train/test already split
ridge_model = ridge_regression_runner(X_train, y_train, X_test, y_test, alpha=1.0)

#Lasso
# 📦 Import
from linear_modeling_extensions import lasso_regression_runner

# Train/test already split
lasso_model = lasso_regression_runner(X_train, y_train, X_test, y_test, alpha=0.5)

#Elastic Net
# 📦 Import
from linear_modeling_extensions import elasticnet_regression_runner

# Train/test already split
elasticnet_model = elasticnet_regression_runner(X_train, y_train, X_test, y_test, alpha=1.0, l1_ratio=0.5)

# Polynomial 
# 📦 Import
from linear_modeling_extensions import polynomial_regression_runner

# Assuming X_train, y_train, X_test, y_test already created:
poly_model = polynomial_regression_runner(X_train, y_train, X_test, y_test, degree=2)

📈 OLS Modeling with Optional Robust Standard Errors Runner

# 📈 OLS Modeling with Optional Robust Standard Errors Runner
def ols_regression_runner(X_train, y_train, X_test, y_test, robust=False, robust_type='HC1'):
    """
    Run OLS regression with optional robust standard errors.

    Args:
        X_train (DataFrame): Training features.
        y_train (Series): Training target.
        X_test (DataFrame): Testing features.
        y_test (Series): Testing target.
        robust (bool): If True, use robust standard errors (HC1, HC3, etc).
        robust_type (str): Robust covariance type ('HC1', 'HC2', 'HC3').

    Returns:
        model (RegressionResultsWrapper): Fitted statsmodels model.
    """

    # Add constant to X (for intercept)
    X_train_sm = sm.add_constant(X_train)
    X_test_sm = sm.add_constant(X_test)

    # Fit model
    model = sm.OLS(y_train, X_train_sm).fit()

    # Apply robust if needed
    if robust:
        model = model.get_robustcov_results(cov_type=robust_type)

    # Predict on Test
    y_pred = model.predict(X_test_sm)

    # Evaluation
    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    rmse = np.sqrt(mean_squared_error(y_test, y_pred))

    print("\n📈 Model Performance on Test Set:")
    print(f"🔵 R² Score: {r2:.4f}")
    print(f"🟠 MAE: {mae:.4f}")
    print(f"🟣 RMSE: {rmse:.4f}")
    print("-" * 50)

    # Summary
    print("\n📋 Model Summary:")
    print(model.summary())

    return model


📈 Ridge Regression Runner

# 📈 Ridge Regression Runner

from sklearn.linear_model import Ridge
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
import numpy as np

def ridge_regression_runner(X_train, y_train, X_test, y_test, alpha=1.0):
    """
    Fit Ridge Regression model and evaluate on test data.

    Args:
        X_train (DataFrame): Training features.
        y_train (Series): Training target.
        X_test (DataFrame): Test features.
        y_test (Series): Test target.
        alpha (float): Regularization strength.

    Returns:
        model (Ridge): Fitted Ridge model.
    """
    model = Ridge(alpha=alpha)
    model.fit(X_train, y_train)

    y_pred = model.predict(X_test)

    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    rmse = np.sqrt(mean_squared_error(y_test, y_pred))

    print("\n📈 Ridge Regression Performance:")
    print(f"🔵 R² Score: {r2:.4f}")
    print(f"🟠 MAE: {mae:.4f}")
    print(f"🟣 RMSE: {rmse:.4f}")
    print("-" * 50)

    return model

📈 # lasso_regression_runner  — L1 Regularization

# 📈 Lasso Regression Runner

from sklearn.linear_model import Lasso
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
import numpy as np

def lasso_regression_runner(X_train, y_train, X_test, y_test, alpha=1.0):
    """
    Fit Lasso Regression model and evaluate on test data.

    Args:
        X_train (DataFrame): Training features.
        y_train (Series): Training target.
        X_test (DataFrame): Test features.
        y_test (Series): Test target.
        alpha (float): Regularization strength (L1 penalty).

    Returns:
        model (Lasso): Fitted Lasso model.
    """
    model = Lasso(alpha=alpha, max_iter=10000)  # add high max_iter to avoid convergence warnings
    model.fit(X_train, y_train)

    y_pred = model.predict(X_test)

    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    rmse = np.sqrt(mean_squared_error(y_test, y_pred))

    print("\n📈 Lasso Regression Performance:")
    print(f"🔵 R² Score: {r2:.4f}")
    print(f"🟠 MAE: {mae:.4f}")
    print(f"🟣 RMSE: {rmse:.4f}")
    print("-" * 50)

    return model

📈 elasticnet_regression_runner — Mix of Lasso and Ridge (L1 + L2 Regularization)

# 📈 ElasticNet Regression Runner

from sklearn.linear_model import ElasticNet
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
import numpy as np

def elasticnet_regression_runner(X_train, y_train, X_test, y_test, alpha=1.0, l1_ratio=0.5):
    """
    Fit ElasticNet Regression model and evaluate on test data.

    Args:
        X_train (DataFrame): Training features.
        y_train (Series): Training target.
        X_test (DataFrame): Test features.
        y_test (Series): Test target.
        alpha (float): Overall regularization strength.
        l1_ratio (float): Mix between Lasso (1.0) and Ridge (0.0).

    Returns:
        model (ElasticNet): Fitted ElasticNet model.
    """
    model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, max_iter=10000)
    model.fit(X_train, y_train)

    y_pred = model.predict(X_test)

    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    rmse = np.sqrt(mean_squared_error(y_test, y_pred))

    print("\n📈 ElasticNet Regression Performance:")
    print(f"🔵 R² Score: {r2:.4f}")
    print(f"🟠 MAE: {mae:.4f}")
    print(f"🟣 RMSE: {rmse:.4f}")
    print("-" * 50)

    return model

📈 Polynomial Regression Runner

# 📈 Polynomial Regression Runner
def polynomial_regression_runner(X_train, y_train, X_test, y_test, degree=2):
    """
    Fit Polynomial Regression model and evaluate on test data.

    Args:
        X_train (DataFrame): Training features.
        y_train (Series): Training target.
        X_test (DataFrame): Test features.
        y_test (Series): Test target.
        degree (int): Degree of polynomial transformation.

    Returns:
        model (LinearRegression): Fitted polynomial regression model.
    """
    # Expand features to polynomial terms
    poly = PolynomialFeatures(degree=degree)
    X_train_poly = poly.fit_transform(X_train)
    X_test_poly = poly.transform(X_test)

    # Fit a simple Linear Regression on expanded features
    model = LinearRegression()
    model.fit(X_train_poly, y_train)

    # Predict
    y_pred = model.predict(X_test_poly)

    # Evaluate
    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    rmse = np.sqrt(mean_squared_error(y_test, y_pred))

    print("\n📈 Polynomial Regression Performance:")
    print(f"🔵 Degree: {degree}")
    print(f"🔵 R² Score: {r2:.4f}")
    print(f"🟠 MAE: {mae:.4f}")
    print(f"🟣 RMSE: {rmse:.4f}")
    print("-" * 50)

    return model