深入理解逐步回归分析:用Python构建最优回归模型的逐步特征选择

写在开头

线性回归模型在预测问题中广泛应用,但选择恰当的特征对模型性能至关重要。逐步回归分析是一种强大的特征选择方法,本文将深入介绍如何使用Python中的statsmodels库实现逐步回归分析,以构建最优的线性回归模型。

1. 背景知识

线性回归是一种广泛用于建模和预测的统计技术,它建立了自变量与因变量之间的线性关系。然而,在实际问题中,我们常常面临众多特征,而不是所有特征都对预测结果有显著影响。这就引入了特征选择的概念,即选择对模型性能最有贡献的特征,以简化模型并提高泛化能力。

逐步回归分析是一种通过逐步选择特征来优化模型的方法。它通过反复添加或删除特征,每次选择对模型性能改善最显著的特征,以构建一个更精确的回归模型。逐步回归在面对高维数据集时尤为有用,能够在不丧失模型解释性的前提下提高预测准确性。

逐步回归分析的优势包括:

  • 特征选择: 有效地筛选掉对模型贡献较小的特征,提高模型的简洁性。
  • 解释性强: 与其他特征选择方法相比,逐步回归保留了模型的解释性,使得结果更容易理解。
  • 泛化性能: 通过逐步选择最相关的特征,提高模型在新数据上的泛化性能。

逐步回归的适用场景包括但不限于:

  • 特征维度较高,需要降低模型复杂度。
  • 希望保留模型的可解释性。
  • 对模型性能有一定要求,同时要避免过拟合。

在接下来的部分,我们将通过实际代码演示如何使用Python中的statsmodels库进行逐步回归分析,构建最优的线性回归模型。

2. 构建产品销售数据集

假设我们是一家在线零售商,想要深入了解影响产品销售额的因素,以优化我们的营销策略。我们选择了以下几个关键自变量:

  • 广告费用(Advertising_Cost): 我们在各种渠道上的广告投入,包括社交媒体和其他在线平台。
  • 社交媒体宣传投入(Social_Media_Expense): 我们在社交媒体上的宣传和广告支出。
  • 产品价格(Product_Price): 我们的产品定价,可能会影响销售量。
  • 季节性因素(Seasonality_Factor): 季节变化对销售的影响,考虑到一些产品在特定季节可能更受欢迎。
  • 员工满意度(employee_satisfaction ): 猜测员工满意度可能会影响到销售额。
  • 天气情况(Monthly_Weather_Index): 设想每个月的天气情况可能会影响到产品的销售。

构建产品销售数据的代码如下:

import pandas as pd
import numpy as np

# 构建测试数据集
np.random.seed(12)
num_products = 150
advertising_cost = np.random.uniform(500, 5000, num_products)
social_media_expense = np.random.uniform(100, 1000, num_products)
product_price = np.random.uniform(20, 200, num_products)
seasonality_factor = np.random.normal(1, 0.2, num_products)

# 增加两个与销售额无关的变量
employee_satisfaction = np.random.uniform(1, 5, num_products)
monthly_weather_index = np.random.uniform(-10, 10, num_products)

# 生成销售额,考虑以上因素和噪声
sales_revenue = 1000 * advertising_cost + 500 * social_media_expense - 10 * product_price + 200 * seasonality_factor + np.random.normal(0, 5000, num_products)

# 创建数据框
df_sales = pd.DataFrame({
    'Advertising_Cost': advertising_cost,
    'Social_Media_Expense': social_media_expense,
    'Product_Price': product_price,
    'Seasonality_Factor': seasonality_factor,
    'Employee_Satisfaction': employee_satisfaction,
    'Monthly_Weather_Index': monthly_weather_index,
    'Sales_Revenue': sales_revenue
})

# 打印前几行数据
print(df_sales.head())


3. 逐步回归分析实现

当执行逐步回归分析时,我们可以使用statsmodels库中的OLS类,并在每一步中根据最大p值排除变量。以下是具体的Python代码:

import statsmodels.api as sm
import pandas as pd



# 定义自变量和因变量
X = df_sales[['Advertising_Cost', 'Social_Media_Expense', 'Product_Price', 'Seasonality_Factor', 'Employee_Satisfaction', 'Monthly_Weather_Index']]
y = df_sales['Sales_Revenue']

# 初始化模型,包含常数项
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()

# 打印初始模型的摘要
print("初始模型:")
print(model.summary())

# 逐步回归分析
while True:
    # 获取当前模型的最大p值
    max_pvalue = model.pvalues[1:].idxmax()
    max_pvalue_value = model.pvalues[1:].max()

    # 如果最大p值大于阈值(例如,0.05),则去除该特征
    if max_pvalue_value > 0.05 and max_pvalue != 'const':
        X = X.drop(max_pvalue, axis=1)
        model = sm.OLS(y, X).fit()
        print(f"去除特征 '{max_pvalue}', 当前模型:")
        print(model.summary())
    else:
        break

# 打印最终逐步回归分析的结果
print("最终模型:")
print(model.summary())

这段代码中,我们首先准备了自变量X和因变量y。然后,我们使用add_constant函数添加了截距项,并初始化了一个线性回归模型。在逐步回归分析中,我们循环遍历模型的p值,每次去除具有最大p值的变量,直到所有变量的p值都小于设定的阈值(例如,0.05)为止。最终,我们打印了逐步回归分析的结果摘要。

4. 结果解释

通过运行3中的代码,分析逐步回归分析的结果,包括模型统计信息和特征的重要性。得出结论如下:
初始模型:

  • 初始模型包含了所有自变量,R-squared接近1,表明模型对目标变量的解释力很高。
  • p-value 较低,说明模型的参数估计是显著的。
  • AIC 和 BIC 值较高,但在逐步回归中主要用于比较模型。

去除 ‘Monthly_Weather_Index’ 特征后的模型:

  • 去除了 ‘Monthly_Weather_Index’ 特征,模型参数更新。
  • R-squared 基本保持不变,说明模型整体解释力并没有显著变化。

继续去除 ‘Seasonality_Factor’ 特征后的模型:

  • ‘Seasonality_Factor’ 特征被去除,模型再次更新。
  • R-squared 稍有下降,但变化不大。

继续去除 ‘Employee_Satisfaction’ 特征后的模型:

  • ‘Employee_Satisfaction’ 特征被去除,模型再次更新。
  • R-squared 稍有下降,但变化不大。

继续去除 ‘Product_Price’ 特征后的模型:

  • ‘Product_Price’ 特征被去除,模型再次更新。
  • R-squared 保持稳定。

最终模型:

  • ‘Employee_Satisfaction’ 和 ‘Product_Price’ 特征被逐步去除,最终保留 ‘Advertising_Cost’ 和 ‘Social_Media_Expense’。
  • 最终模型的 R-squared 保持很高,模型对目标变量的解释力依然很强。

总体来说,逐步回归过程中模型逐步去除对目标变量影响较小的特征,以达到简化模型结构和提高解释力的目的。最终模型保留的特征是 ‘Advertising_Cost’ 和 ‘Social_Media_Expense’,它们对 ‘Sales_Revenue’ 的影响被认为是显著的。

5. 代码优化和自定义

我们可以对3中的代码进行优化,以便我们观察模型在拟合过程中的问题,下面是具体的代码:

import statsmodels.api as sm
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

def stepwise_regression(X_train, y_train, X_test, y_test, threshold=0.05):
    models_info = []  # 用于存储每个模型的信息
    best_model = None
    best_aic = float('inf')  # 初始化最佳AIC为正无穷
    best_bic = float('inf')  # 初始化最佳BIC为正无穷
    best_features = None
    
    while True:
        # 添加截距项
        X_train = sm.add_constant(X_train)
        X_test = sm.add_constant(X_test)
        
        # 初始化模型
        model = sm.OLS(y_train, X_train).fit()
        models_info.append({
            'Features': X_train.columns[1:],
            'R-squared': model.rsquared,
            'AIC': model.aic,
            'BIC': model.bic,
            'MSE': mean_squared_error(y_test, model.predict(X_test))
        })
        
        # 获取当前模型的AIC和BIC
        current_aic = model.aic
        current_bic = model.bic
        
        # 如果当前模型的AIC或BIC更优,则更新最佳模型和特征
        if current_aic < best_aic and current_bic < best_bic:
            best_aic = current_aic
            best_bic = current_bic
            best_model = model
            best_features = X_train.columns[1:]
        
        # 获取当前模型的最大p值
        max_pvalue = model.pvalues[1:].idxmax()
        max_pvalue_value = model.pvalues[1:].max()

        # 如果最大p值大于阈值,去除该特征
        if max_pvalue_value > threshold:
            X_train = X_train.drop(max_pvalue, axis=1)
            X_test = X_test.drop(max_pvalue, axis=1)
        else:
            break
    
    return {
        'Best_Model': best_model,
        'Best_Features': best_features,
        'Models_Info': pd.DataFrame(models_info)
    }

# 准备数据
X = df_sales[['Advertising_Cost', 'Social_Media_Expense', 'Product_Price', 'Seasonality_Factor', 'Employee_Satisfaction', 'Monthly_Weather_Index']]
y = df_sales['Sales_Revenue']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 进行逐步回归分析
result = stepwise_regression(X_train, y_train, X_test, y_test)

# 获取最终模型在训练集上的效果
final_train_model = sm.OLS(y_train, sm.add_constant(X_train)).fit()
final_train_r_squared = final_train_model.rsquared
final_train_aic = final_train_model.aic
final_train_bic = final_train_model.bic

# 打印最终模型效果
print("Best Final Model - AIC:", result['Best_Model'].aic, "BIC:", result['Best_Model'].bic)
print("Best Features:", result['Best_Features'])
print("\nFinal Model on Training Set - R-squared:", final_train_r_squared, "AIC:", final_train_aic, "BIC:", final_train_bic)

# 打印模型剔除过程中的关键参数数据
print("\nModels Information:")
print(result['Models_Info'])

6.实际场景应用

我们通过逐步回归选择了两个最具影响力的特征,即 ‘Advertising_Cost’ 和 ‘Social_Media_Expense’,并建立了一个简化的线性回归模型。这个模型可以用来预测销售收入(‘Sales_Revenue’)。

模型结论:

  • 我们的最终模型的方程式为:
    S a l e s _ R e v e n u e = 136.91 + 999.94 × A d v e r t i s i n g _ C o s t + 501.43 × S o c i a l _ M e d i a _ E x p e n s e Sales\_Revenue = 136.91 + 999.94 \times Advertising\_Cost + 501.43 \times Social\_Media\_Expense Sales_Revenue=136.91+999.94×Advertising_Cost+501.43×Social_Media_Expense

应用场景:

  • 广告费用优化:

    • 模型表明,广告费用对销售收入有显著的正向影响。在实际运营中,公司可以通过调整广告预算来优化销售收入。通过增加广告投入,公司可能能够实现更高的销售收入。
  • 社交媒体费用管理:

    • 社交媒体费用也是一个重要的因素。模型表明,增加社交媒体费用对销售收入有正向影响。公司可以在社交媒体平台上的推广和广告上进行更多投资,以提高销售收入。
  • 成本效益分析:

    • 在预测销售收入时,公司可以进行成本效益分析。通过比较广告费用和社交媒体费用的投入与实际销售收入的关系,公司可以确定最有效的营销策略。
  • 决策简化:

    • 通过仅保留两个最具影响力的特征,模型的复杂性大大降低。这使得决策过程更为简单,而且更容易理解和解释。

需要注意的是,模型的实际效果可能受到多种因素的影响,例如数据质量、模型假设的满足程度等。在实际应用中,建议对模型的结果进行进一步验证和监控。

7. 应用注意事项

  • 数据质量:

    • 确保数据的质量对于建立准确的模型至关重要。进行数据清洗,处理缺失值、异常值,并验证数据的完整性,以确保模型训练和预测的可靠性。
  • 模型假设:

    • 线性回归模型有一些基本假设,包括线性关系、独立性、常态性、同方差性等。在应用模型之前,需要验证这些假设是否得到满足,以确保模型的有效性和可靠性。
  • 数据稳定性:

    • 在实际应用中,数据的分布可能会发生变化。确保模型在不同时间段内的数据稳定性,或者根据实际情况考虑模型的滚动更新,以适应变化的数据分布。
  • 预测时段:

    • 考虑模型的预测时段,因为模型的性能可能在不同时间段内有所不同。进行交叉验证,评估模型在不同时期的表现,以了解其稳定性和一致性。
  • 绩效度量:

    • 选择适当的绩效度量以评估模型的效果。不同的业务场景可能需要不同的度量指标,因此理解每个度量的含义,并选择最符合业务需求的指标。
  • 决策制定:

    • 模型的输出是决策的参考,而不是唯一的依据。在制定决策时,需要考虑模型预测与实际业务背景的结合,以及其他可能影响决策的因素。
  • 模型更新:

    • 市场和业务环境可能会发生变化,因此定期审查和更新模型是必要的。过时的模型可能无法适应新的数据模式和趋势,影响模型的准确性。

8. 总结

模型简化:
逐步回归通过逐步去除不显著的特征,生成一个更简化的模型。这降低了过拟合的风险,提高了模型的泛化能力。

解释性:
最终模型的特征较少,更容易理解和解释。这对于向非专业人士传达模型的结果和洞察非常有帮助。

实际应用:
模型的应用需要与实际业务情境结合。确保模型输出对业务决策有实际的启示和帮助,同时了解模型的局限性。

持续监控:
建立模型监控机制,定期评估模型的性能和准确性。如果模型的预测性能下降或业务环境发生变化,及时调整和更新模型。

业务价值:
最终模型的成功不仅仅在于其预测准确性,还取决于其对业务目标的贡献。模型应该对业务决策有实际价值,支持业务目标的实现。

写在最后

通过这篇博客,读者将深入了解逐步回归的原理、实现和应用。每一步都经过仔细解释,代码示例和图表的加入使得内容更加生动易懂。希望本文能够帮助读者在实际问题中应用逐步回归分析,提升建模效果。

  • 58
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theskylife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值