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

您所在的位置:网站首页 逐步回归spss为什么只出来一个模型 深入理解逐步回归分析:用Python构建最优回归模型的逐步特征选择

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

2024-07-16 05:24| 来源: 网络整理| 查看: 265

目录 写在开头1. 背景知识2. 构建产品销售数据集3. 逐步回归分析实现4. 结果解释5. 代码优化和自定义6.实际场景应用7. 应用注意事项8. 总结写在最后

写在开头

线性回归模型在预测问题中广泛应用,但选择恰当的特征对模型性能至关重要。逐步回归分析是一种强大的特征选择方法,本文将深入介绍如何使用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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3