未记录事实核验 · 状态:维护中

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适合学习回归原理、合成数据建模、正则化调参与模型比较,不是经真实电商数据验证的预测方案。regularization_comparison仍在交叉验证前对整个训练集拟合标准化器,验证折参与了预处理参数估计;多项式度数及电商最佳模型使用名为测试集的数据选型,选型后的分数与残差不能视为独立的最终泛化评估。真实销售预测需结合时间顺序及预测时可获得的特征设计验证。OLS逆矩阵表达式要求设计矩阵满列秩;电商案例的系数排序基于标准化特征,不代表业务因果影响。MAPE在目标值含零时返回NaN,R²可能为负,这两项已在正文正确处理。本次仅作结构审阅,未执行代码或开展外部事实核验。

回归算法技术详解

abstract 本章概览

  • 线性回归数学原理:最小二乘法和梯度下降
  • 多项式回归:非线性关系建模技术
  • 正则化方法:Ridge、Lasso、ElasticNet详解
  • 逻辑回归:分类问题的概率建模
  • 高级算法:SVR和树回归简介
  • 模型评估:MSE、MAE、R²指标体系
  • 业务案例:电商销售预测完整实现

回归算法基础

回归算法是监督学习的核心技术,用于预测连续数值型目标变量。其数学表达为:

y = f(X) + ε

其中:

  • y:目标变量(连续值)
  • X:特征矩阵
  • f(X):回归函数
  • ε:随机误差项

核心算法分类

线性回归族:

  • 简单线性回归:单特征线性关系
  • 多元线性回归:多特征线性组合
  • 多项式回归:非线性关系建模

正则化回归:

  • Ridge回归:L2正则化
  • Lasso回归:L1正则化
  • ElasticNet:L1+L2正则化

高级回归:

  • 逻辑回归:概率分类模型
  • 支持向量回归:SVM扩展
  • 树回归:决策树预测
# 核心库导入
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet, LogisticRegression
from sklearn.svm import SVR
from sklearn.tree import DecisionTreeRegressor
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

线性回归数学原理

最小二乘法(OLS)

线性回归的核心是找到最优参数β,使预测误差最小化:

目标函数:

min J(β) = Σᵢ(yᵢ - ŷᵢ)² = ||y - Xβ||²

闭式解:

β = (XᵀX)⁻¹Xᵀy

梯度下降解:

βₜ₊₁ = βₜ - α∇J(βₜ)

简单线性回归实现

def linear_regression_from_scratch():
    """从零实现线性回归"""
    # 生成数据
    np.random.seed(42)
    X = np.random.randn(100, 1)
    y = 2 * X.ravel() + 1 + 0.1 * np.random.randn(100)
    
    # 添加偏置项
    X_bias = np.c_[np.ones(X.shape[0]), X]
    
    # 最小二乘解
    beta_ols = np.linalg.inv(X_bias.T @ X_bias) @ X_bias.T @ y
    
    # 梯度下降解
    def gradient_descent(X, y, lr=0.01, epochs=1000):
        m, n = X.shape
        beta = np.zeros(n)
        
        for _ in range(epochs):
            y_pred = X @ beta
            gradient = (2/m) * X.T @ (y_pred - y)
            beta -= lr * gradient
        
        return beta
    
    beta_gd = gradient_descent(X_bias, y)
    
    print(f"最小二乘解: β₀={beta_ols[0]:.3f}, β₁={beta_ols[1]:.3f}")
    print(f"梯度下降解: β₀={beta_gd[0]:.3f}, β₁={beta_gd[1]:.3f}")
    print(f"真实参数: β₀=1.000, β₁=2.000")
    
    return X, y, beta_ols

# scikit-learn实现对比
def sklearn_linear_regression():
    """使用sklearn的线性回归"""
    X, y, beta_true = linear_regression_from_scratch()
    
    # sklearn模型
    model = LinearRegression()
    model.fit(X, y)
    
    # 预测和评估
    y_pred = model.predict(X)
    
    print(f"\nSklearn结果:")
    print(f"截距: {model.intercept_:.3f}")
    print(f"系数: {model.coef_[0]:.3f}")
    print(f"R²: {r2_score(y, y_pred):.3f}")
    print(f"MSE: {mean_squared_error(y, y_pred):.3f}")
    
    return model

多元线性回归

多元线性回归扩展到多个特征: y = β₀ + β₁x₁ + β₂x₂ + ... + βₚxₚ + ε

矩阵形式:

y = Xβ + ε

其中X为特征矩阵,β为参数向量。

def multiple_regression_analysis():
    """多元线性回归分析"""
    # 生成合成数据
    np.random.seed(42)
    n_samples, n_features = 1000, 5
    
    # 特征矩阵(带相关性)
    X = np.random.randn(n_samples, n_features)
    # 引入特征相关性
    X[:, 1] += 0.5 * X[:, 0]  # x1和x0相关
    
    # 真实系数
    true_coef = np.array([2, -1, 0.5, 0, -1.5])
    
    # 目标变量
    y = X @ true_coef + 0.1 * np.random.randn(n_samples)
    
    # 数据分割
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42
    )
    
    # 特征标准化
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    
    # 训练模型
    model = LinearRegression()
    model.fit(X_train_scaled, y_train)
    
    # 预测
    y_pred = model.predict(X_test_scaled)
    
    # 多重共线性检验(方差膨胀因子)
    from statsmodels.stats.outliers_influence import variance_inflation_factor
    
    vif_data = pd.DataFrame()
    vif_data["Feature"] = [f"X{i}" for i in range(n_features)]
    vif_data["VIF"] = [variance_inflation_factor(X_train_scaled, i) 
                       for i in range(n_features)]
    
    print("多重共线性检验 (VIF > 5表示存在共线性):")
    print(vif_data)
    
    # 模型评估
    print(f"\n模型性能:")
    print(f"R²: {r2_score(y_test, y_pred):.4f}")
    print(f"MSE: {mean_squared_error(y_test, y_pred):.4f}")
    
    # 系数对比
    coef_comparison = pd.DataFrame({
        'True_Coef': true_coef,
        'Estimated_Coef': model.coef_ / scaler.scale_,
        'Difference': np.abs(true_coef - model.coef_ / scaler.scale_)
    })
    print("\n系数估计对比:")
    print(coef_comparison)
    
    return model, X_test_scaled, y_test

多项式回归

非线性关系建模

多项式回归通过特征变换处理非线性关系: y = β₀ + β₁x + β₂x² + ... + βᵈxᵈ + ε

特征变换:

X = [1, x, x², x³, ..., xᵈ]
def polynomial_regression_analysis():
    """多项式回归完整分析"""
    # 生成非线性数据
    np.random.seed(42)
    x = np.linspace(-2, 2, 100)
    # 真实函数: y = 0.5x³ - 2x² + x + 1
    y_true = 0.5 * x**3 - 2 * x**2 + x + 1
    y = y_true + 0.3 * np.random.randn(len(x))
    
    X = x.reshape(-1, 1)
    
    # 数据分割
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42
    )
    
    # 不同多项式度数的偏差-方差权衡
    degrees = range(1, 16)
    train_scores = []
    val_scores = []
    
    for degree in degrees:
        # 多项式特征变换
        poly = PolynomialFeatures(degree=degree)
        X_poly_train = poly.fit_transform(X_train)
        X_poly_test = poly.transform(X_test)
        
        # 训练模型
        model = LinearRegression()
        model.fit(X_poly_train, y_train)
        
        # 计算训练和验证分数
        train_score = model.score(X_poly_train, y_train)
        val_score = model.score(X_poly_test, y_test)
        
        train_scores.append(train_score)
        val_scores.append(val_score)
    
    # 找到最优度数
    optimal_degree = degrees[np.argmax(val_scores)]
    
    print(f"最优多项式度数: {optimal_degree}")
    print(f"最佳验证分数: {max(val_scores):.4f}")
    
    # 可视化偏差-方差权衡
    plt.figure(figsize=(10, 6))
    plt.plot(degrees, train_scores, 'b-', label='训练分数', marker='o')
    plt.plot(degrees, val_scores, 'r-', label='验证分数', marker='s')
    plt.axvline(optimal_degree, color='g', linestyle='--', 
                label=f'最优度数={optimal_degree}')
    plt.xlabel('多项式度数')
    plt.ylabel('R² 分数')
    plt.legend()
    plt.title('多项式回归:偏差-方差权衡')
    plt.grid(True, alpha=0.3)
    plt.show()
    
    return optimal_degree, X, y

正则化回归技术

正则化通过在损失函数中添加惩罚项来防止过拟合:

Ridge回归(L2正则化)

目标函数:

J(β) = ||y - Xβ||² + α||β||²₂

闭式解:

β = (XᵀX + αI)⁻¹Xᵀy

Lasso回归(L1正则化)

目标函数:

J(β) = ||y - Xβ||² + α||β||₁

L1正则化具有特征选择能力,能将不重要特征的系数置零。

ElasticNet(L1+L2正则化)

目标函数:

J(β) = ||y - Xβ||² + α₁||β||₁ + α₂||β||²₂
def regularization_comparison():
    """正则化方法对比分析"""
    from sklearn.linear_model import ElasticNet
    from sklearn.model_selection import GridSearchCV
    
    # 生成高维稀疏数据
    np.random.seed(42)
    n_samples, n_features = 100, 50
    
    # 只有前5个特征有用
    X = np.random.randn(n_samples, n_features)
    true_coef = np.zeros(n_features)
    true_coef[:5] = [2, -1.5, 1, 0.5, -2]
    
    y = X @ true_coef + 0.1 * np.random.randn(n_samples)
    
    # 数据分割
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.3, random_state=42
    )
    
    # 标准化
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    
    # 超参数网格搜索
    alphas = np.logspace(-3, 1, 20)
    
    models = {
        'Ridge': GridSearchCV(Ridge(), {'alpha': alphas}, cv=5),
        'Lasso': GridSearchCV(Lasso(), {'alpha': alphas}, cv=5),
        'ElasticNet': GridSearchCV(ElasticNet(), 
                                  {'alpha': alphas, 'l1_ratio': [0.1, 0.5, 0.9]}, 
                                  cv=5)
    }
    
    results = {}
    
    for name, model in models.items():
        # 训练和预测
        model.fit(X_train_scaled, y_train)
        y_pred = model.predict(X_test_scaled)
        
        # 性能指标
        r2 = r2_score(y_test, y_pred)
        mse = mean_squared_error(y_test, y_pred)
        
        # 系数分析
        coef = model.best_estimator_.coef_ / scaler.scale_
        n_selected = np.sum(np.abs(coef) > 1e-5)
        
        results[name] = {
            'best_params': model.best_params_,
            'r2': r2,
            'mse': mse,
            'n_selected': n_selected,
            'coef': coef
        }
        
        print(f"{name}:")
        print(f"  最佳参数: {model.best_params_}")
        print(f"  R²: {r2:.4f}")
        print(f"  MSE: {mse:.4f}")
        print(f"  选择特征数: {n_selected}")
    
    # 可视化系数路径
    plt.figure(figsize=(15, 5))
    
    for i, (name, result) in enumerate(results.items()):
        plt.subplot(1, 3, i+1)
        
        # 显示前10个特征的系数
        coef_data = result['coef'][:10]
        true_coef_data = true_coef[:10]
        
        x = np.arange(10)
        plt.bar(x - 0.2, true_coef_data, 0.4, label='真实系数', alpha=0.7)
        plt.bar(x + 0.2, coef_data, 0.4, label='估计系数', alpha=0.7)
        
        plt.xlabel('特征索引')
        plt.ylabel('系数值')
        plt.title(f'{name} 系数对比')
        plt.legend()
        plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()
    
    return results

逻辑回归

虽然名为"回归",逻辑回归实际上是分类算法,但其技术原理与线性回归密切相关。

数学原理

Sigmoid函数:

σ(z) = 1 / (1 + e⁻ᶻ)

概率建模:

P(y=1|x) = σ(β₀ + β₁x₁ + ... + βₚxₚ)

对数似然损失:

J(β) = -Σ[yᵢlog(pᵢ) + (1-yᵢ)log(1-pᵢ)]
def logistic_regression_demo():
    """逻辑回归演示"""
    from sklearn.datasets import make_classification
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import accuracy_score, classification_report
    
    # 生成分类数据
    X, y = make_classification(n_samples=1000, n_features=2, 
                             n_redundant=0, n_informative=2,
                             random_state=42)
    
    # 数据分割
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.3, random_state=42
    )
    
    # 标准化
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    
    # 逻辑回归模型
    log_reg = LogisticRegression(random_state=42)
    log_reg.fit(X_train_scaled, y_train)
    
    # 预测
    y_pred = log_reg.predict(X_test_scaled)
    y_prob = log_reg.predict_proba(X_test_scaled)
    
    # 评估
    accuracy = accuracy_score(y_test, y_pred)
    print(f"逻辑回归准确率: {accuracy:.4f}")
    print("\n分类报告:")
    print(classification_report(y_test, y_pred))
    
    # 决策边界可视化
    plt.figure(figsize=(12, 4))
    
    # 原始数据分布
    plt.subplot(1, 2, 1)
    plt.scatter(X[y==0, 0], X[y==0, 1], c='red', alpha=0.6, label='类别 0')
    plt.scatter(X[y==1, 0], X[y==1, 1], c='blue', alpha=0.6, label='类别 1')
    plt.xlabel('特征 1')
    plt.ylabel('特征 2')
    plt.title('原始数据分布')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    # 决策边界
    plt.subplot(1, 2, 2)
    h = 0.02
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                        np.arange(y_min, y_max, h))
    
    mesh_points = np.c_[xx.ravel(), yy.ravel()]
    mesh_scaled = scaler.transform(mesh_points)
    Z = log_reg.predict_proba(mesh_scaled)[:, 1]
    Z = Z.reshape(xx.shape)
    
    plt.contourf(xx, yy, Z, levels=50, alpha=0.3, cmap='RdYlBu')
    plt.scatter(X[y==0, 0], X[y==0, 1], c='red', alpha=0.8, label='类别 0')
    plt.scatter(X[y==1, 0], X[y==1, 1], c='blue', alpha=0.8, label='类别 1')
    plt.xlabel('特征 1')
    plt.ylabel('特征 2')
    plt.title('逻辑回归决策边界')
    plt.legend()
    
    plt.tight_layout()
    plt.show()
    
    return log_reg, X_test_scaled, y_test

高级回归算法简介

支持向量回归(SVR)

def svr_demo():
    """支持向量回归演示"""
    from sklearn.svm import SVR
    
    # 生成非线性数据
    np.random.seed(42)
    X = np.sort(5 * np.random.rand(100, 1), axis=0)
    y = np.sin(X).ravel() + 0.1 * np.random.randn(100)
    
    # SVR模型(不同核函数)
    svr_models = {
        'Linear': SVR(kernel='linear', C=1.0),
        'RBF': SVR(kernel='rbf', C=1.0, gamma=0.1),
        'Polynomial': SVR(kernel='poly', C=1.0, degree=3)
    }
    
    plt.figure(figsize=(15, 5))
    
    for i, (name, model) in enumerate(svr_models.items()):
        model.fit(X, y)
        y_pred = model.predict(X)
        
        plt.subplot(1, 3, i+1)
        plt.scatter(X, y, alpha=0.6, label='数据')
        plt.plot(X, y_pred, color='red', linewidth=2, label=f'SVR-{name}')
        plt.xlabel('X')
        plt.ylabel('Y')
        plt.title(f'SVR - {name} 核')
        plt.legend()
        plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()

决策树回归

def tree_regression_demo():
    """决策树回归演示"""
    from sklearn.tree import DecisionTreeRegressor
    
    # 使用之前的数据
    X, y = polynomial_regression_analysis()[1:]
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42
    )
    
    # 不同深度的决策树
    depths = [2, 5, 10, None]
    
    plt.figure(figsize=(15, 4))
    
    for i, depth in enumerate(depths):
        tree_reg = DecisionTreeRegressor(max_depth=depth, random_state=42)
        tree_reg.fit(X_train, y_train)
        
        # 预测
        X_plot = np.linspace(X.min(), X.max(), 300).reshape(-1, 1)
        y_plot_pred = tree_reg.predict(X_plot)
        
        plt.subplot(1, 4, i+1)
        plt.scatter(X, y, alpha=0.6, s=20, label='数据')
        plt.plot(X_plot, y_plot_pred, color='red', linewidth=2, 
                label=f'深度={depth}')
        plt.xlabel('X')
        plt.ylabel('Y')
        plt.title(f'决策树回归 (深度={depth})')
        plt.legend()
        plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()

模型评估指标详解

回归指标体系

def comprehensive_regression_metrics():
    """回归评估指标详解"""
    
    def calculate_metrics(y_true, y_pred):
        """计算所有回归指标"""
        # 基本指标
        mse = mean_squared_error(y_true, y_pred)
        rmse = np.sqrt(mse)
        mae = mean_absolute_error(y_true, y_pred)
        r2 = r2_score(y_true, y_pred)
        
        # 高级指标
        def mean_absolute_percentage_error(y_true, y_pred):
            y_true = np.asarray(y_true)
            y_pred = np.asarray(y_pred)
            if np.any(y_true == 0):
                return np.nan  # 含零目标值时不报告常规定义的MAPE
            return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
        
        def adjusted_r2(y_true, y_pred, n_features):
            n = len(y_true)
            adj_r2 = 1 - (1 - r2) * (n - 1) / (n - n_features - 1)
            return adj_r2
        
        mape = mean_absolute_percentage_error(y_true, y_pred)
        
        return {
            'MSE': mse,
            'RMSE': rmse,
            'MAE': mae,
            'R²': r2,
            'MAPE': mape
        }
    
    # 指标解释
    print("回归评估指标解释:")
    print("\n1. MSE (均方误差):")
    print("   - 公式: MSE = Σ(yᵢ - ŷᵢ)² / n")
    print("   - 特点: 对大误差敏感,单位是目标变量的平方")
    
    print("\n2. RMSE (均方根误差):")
    print("   - 公式: RMSE = √MSE")
    print("   - 特点: 与目标变量同单位,便于理解")
    
    print("\n3. MAE (平均绝对误差):")
    print("   - 公式: MAE = Σ|yᵢ - ŷᵢ| / n")
    print("   - 特点: 对异常值鲁棒,线性惩罚")
    
    print("\n4. R² (决定系数):")
    print("   - 公式: R² = 1 - SS_res/SS_tot")
    print("   - 特点: 非常数目标下通常不超过1,也可能为负;同一评估集上越接近1越好")
    
    print("\n5. MAPE (平均绝对百分比误差):")
    print("   - 公式: MAPE = (1/n)Σ(|yᵢ - ŷᵢ|/|yᵢ|) × 100%,要求所有yᵢ非零")
    print("   - 特点: 百分比形式,便于跨项目对比")
    
    return calculate_metrics

业务案例:电商销售预测

def ecommerce_sales_prediction():
    """电商销售预测完整案例"""
    
    # 模拟电商销售数据
    np.random.seed(42)
    n_samples = 1000
    
    # 特征工程
    data = {
        'price': np.random.uniform(10, 100, n_samples),
        'discount_rate': np.random.uniform(0, 0.5, n_samples),
        'review_score': np.random.uniform(1, 5, n_samples),
        'competitor_price': np.random.uniform(10, 120, n_samples),
        'season': np.random.choice([0, 1, 2, 3], n_samples),  # 春夏秋冬
        'marketing_spend': np.random.uniform(100, 1000, n_samples),
        'inventory_level': np.random.uniform(0, 100, n_samples)
    }
    
    df = pd.DataFrame(data)
    
    # 构造目标变量(销售量)
    # 销售量受价格、折扣、评分等因素影响
    sales = (
        -0.5 * df['price'] +
        300 * df['discount_rate'] +
        50 * df['review_score'] +
        0.3 * df['marketing_spend'] +
        -0.2 * df['competitor_price'] +
        20 * (df['season'] == 3) +  # 冬季销售更好
        np.random.normal(0, 20, n_samples)
    )
    
    # 将模拟销售量截断为非负数,允许为零
    df['sales'] = np.maximum(sales, 0)
    
    print("电商销售数据概览:")
    print(df.describe())
    
    # 特征工程
    # 1. 价格竞争力指标
    df['price_competitiveness'] = df['competitor_price'] / df['price']
    
    # 2. 营销效率
    df['marketing_efficiency'] = df['marketing_spend'] / df['price']
    
    # 3. 季节性处理(独热编码)
    season_dummies = pd.get_dummies(df['season'], prefix='season')
    df = pd.concat([df, season_dummies], axis=1)
    df.drop('season', axis=1, inplace=True)
    
    # 数据分割
    X = df.drop('sales', axis=1)
    y = df['sales']
    
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42
    )
    
    # 特征标准化
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    
    # 模型对比
    models = {
        'Linear': LinearRegression(),
        'Ridge': Ridge(alpha=1.0),
        'Lasso': Lasso(alpha=0.1),
        'ElasticNet': ElasticNet(alpha=0.1, l1_ratio=0.5),
        'SVR': SVR(kernel='rbf', C=1.0, gamma=0.1)
    }
    
    results = {}
    calc_metrics = comprehensive_regression_metrics()
    
    for name, model in models.items():
        # 训练
        model.fit(X_train_scaled, y_train)
        
        # 预测
        y_pred = model.predict(X_test_scaled)
        
        # 评估
        metrics = calc_metrics(y_test, y_pred)
        results[name] = {
            'model': model,
            'predictions': y_pred,
            'metrics': metrics
        }
        
        print(f"\n{name} 模型结果:")
        for metric_name, value in metrics.items():
            print(f"  {metric_name}: {value:.4f}")
    
    # 特征重要性分析(针对线性模型)
    linear_model = results['Linear']['model']
    feature_importance = pd.DataFrame({
        'feature': X.columns,
        'coefficient': linear_model.coef_,
        'abs_coefficient': np.abs(linear_model.coef_)
    }).sort_values('abs_coefficient', ascending=False)
    
    print("\n特征重要性排序:")
    print(feature_importance)
    
    # 可视化模型对比
    plt.figure(figsize=(15, 10))
    
    # 1. 预测vs实际
    plt.subplot(2, 3, 1)
    for name, result in results.items():
        if name in ['Linear', 'Ridge', 'Lasso']:
            plt.scatter(y_test, result['predictions'], alpha=0.6, label=name)
    
    plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--')
    plt.xlabel('实际销售量')
    plt.ylabel('预测销售量')
    plt.title('预测vs实际销售量')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    # 2. 模型性能对比
    plt.subplot(2, 3, 2)
    model_names = list(results.keys())
    r2_scores = [results[name]['metrics']['R²'] for name in model_names]
    
    plt.bar(model_names, r2_scores)
    plt.xlabel('模型')
    plt.ylabel('R² Score')
    plt.title('模型R²对比')
    plt.xticks(rotation=45)
    plt.grid(True, alpha=0.3)
    
    # 3. 特征重要性
    plt.subplot(2, 3, 3)
    top_features = feature_importance.head(8)
    plt.barh(top_features['feature'], top_features['abs_coefficient'])
    plt.xlabel('系数绝对值')
    plt.title('特征重要性')
    plt.grid(True, alpha=0.3)
    
    # 4. 残差分析
    plt.subplot(2, 3, 4)
    best_model = max(results.items(), key=lambda x: x[1]['metrics']['R²'])
    residuals = y_test - best_model[1]['predictions']
    plt.scatter(best_model[1]['predictions'], residuals, alpha=0.6)
    plt.axhline(y=0, color='red', linestyle='--')
    plt.xlabel('预测值')
    plt.ylabel('残差')
    plt.title(f'{best_model[0]} 残差图')
    plt.grid(True, alpha=0.3)
    
    # 5. 误差分布
    plt.subplot(2, 3, 5)
    plt.hist(residuals, bins=20, alpha=0.7, edgecolor='black')
    plt.xlabel('残差')
    plt.ylabel('频率')
    plt.title('残差分布')
    plt.grid(True, alpha=0.3)
    
    # 6. 业务洞察
    plt.subplot(2, 3, 6)
    # 价格vs销售量关系
    plt.scatter(df['price'], df['sales'], alpha=0.6, c=df['discount_rate'], 
                cmap='viridis')
    plt.colorbar(label='折扣率')
    plt.xlabel('价格')
    plt.ylabel('销售量')
    plt.title('价格-销售量关系(颜色表示折扣率)')
    plt.grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()
    
    return results, df

最佳实践与总结

模型选择策略

  1. 线性回归:数据量大、特征与目标呈线性关系
  2. Ridge回归:存在多重共线性、需要保留所有特征
  3. Lasso回归:需要特征选择、追求模型可解释性
  4. ElasticNet:兼顾特征选择和共线性处理
  5. SVR:非线性关系复杂、对异常值有要求
  6. 树回归:特征交互复杂、可解释性要求不高

实践建议

  1. 数据预处理:特征标准化、异常值处理、缺失值填充
  2. 特征工程:多项式特征、交互特征、领域知识特征
  3. 模型验证:交叉验证、时间序列分割、偏差-方差分析
  4. 超参数调优:网格搜索、贝叶斯优化、随机搜索
  5. 模型诊断:残差分析、Cook距离、影响力分析

相关链接:

标签:#回归算法 #线性回归 #正则化 #机器学习 #Python #预测建模 #业务分析