本篇介绍AI&Python多元线性回归的应用。
历史目录索引
一.AI&Python基础语法
1️⃣AI&Python数据类型(上)
2️⃣AI&Python数据类型(下)
3️⃣AI&Python逻辑判断与循环
4️⃣AI&Python函数的应用
5️⃣AI&Python面向对象的编程
二.AI&Python金融数据统计分析
AI&Python多元线性回归
多元线性回归(Multiple Linear Regression,MLR)是一种统计技术,用于分析一个因变量(目标变量或响应变量)与两个或更多个自变量(预测变量或解释变量)之间的关系。它扩展了简单线性回归模型,后者只考虑一个自变量。在多元线性回归中会有多个解释变量:
其中,解释变量之间不能存在太强的线性相关关系(一般ρ<0.7),其他条件与一元线性回归类似。多元线性回归的基本假设也与一元线性回归相似,但还有一些额外的考虑:
①线性关系:每个自变量和因变量之间存在线性关系;
②独立性:观测值之间是独立的;
③正态性:对于给定的自变量组合,因变量的残差应呈正态分布;
④同方差性:对于所有的自变量组合,残差的方差保持恒定;
⑤无多重共线性:自变量之间不应高度相关。如果两个或多个自变量之间存在强相关性,则可能会导致估计的回归系数不稳定,难以准确地评估每个自变量对因变量的独立影响;
⑥无自相关性:在时间序列数据中,残差应该没有自相关性,即一个残差不应该能够预测另一个残差。
除了与一元线性回归类似的效果评估指标:决定系数R2、调整的R2、t检验、F检验与残差分析外,还需要考虑AIC(Akaike Information Criterion,赤池信息准则)和BIC(Bayesian Information Criterion,贝叶斯信息准则)模型评估指标,以及考虑多重共线性的问题。
(1)AIC与BIC准则
AIC和BIC是两种广泛使用的统计模型选择标准,用于在一组候选模型中挑选最优模型。它们通过平衡模型拟合度与复杂度来避免过拟合,并为不同模型提供了一个比较的基础。
在实际应用中,如果目标是最小化预测误差并且样本量不是特别大,AIC可能是更好的选择;如果更看重模型的简化和避免过拟合,尤其是在大数据集上,那么BIC可能更适合。有时候也会同时使用两者,并根据具体情况做出最终决定。
(2)多重共线性
多重共线性是指在多元线性回归分析中,两个或多个预测变量(自变量)之间存在高度相关性的情况。这种相关性会导致模型难以精确估计每个自变量对响应变量(因变量)的独立影响,使得回归系数变得不稳定且难以解释,同时可能夸大了标准误差,降低了统计检验的有效性。简而言之,多重共线性会削弱回归模型的可靠性和准确性。多重共线性的识别与检验通常有以下方法:
①相关系数矩阵:计算自变量之间的皮尔逊或斯皮尔曼相关系数,绝对值大于0.7的高相关系数可能提示存在多重共线性。
②方差膨胀因子(VIF):VIF衡量一个自变量与其他所有自变量之间线性关系的程度。一般VIF值越大则共线性问题越明显,通常以10作为判断边界。当VIF<10不存在多重共线性;当10<=VIF<100,存在较强的多重共线性;当VIF>=100,存在严重多重共线性。
③特征根和条件指数:通过分析设计矩阵的特征值来评估多重共线性的严重程度,较高的条件指数(通常超过30)可能指示了多重共线性问题。
多重共线性的解决通常有以下方法:
①增大样本量:增加观测数据的数量可以提高估计的精度,并有助于减少参数估计的方差。更多的数据点可能使得模型能够更好地分辨出自变量之间的独立贡献,从而减轻多重共线性的影响。
②岭回归(Ridge Regression):岭回归是一种带有L2正则化的回归形式,它在损失函数中加入了一个惩罚项,用来缩小回归系数的值。通过这种方式,它可以有效地减小由多重共线性引起的过拟合问题,并提供更加稳定的系数估计。
③逐步回归(Stepwise Regression):逐步回归是一种自动选择变量的方法,它可以通过向前选择、向后消除或两者结合的方式,在每一步添加或移除一个变量,以优化模型性能。这可以帮助排除那些引起共线性的冗余变量。
④主成分回归(Principal Component Regression,PCR):主成分回归首先应用主成分分析(PCA)将原始变量转换成一组新的、不相关的变量(即主成分),然后用这些主成分作为新特征来进行回归分析。这种方法能有效降低维度并缓解多重共线性的问题。
⑤变量标准化(Standardization of Variables):对自变量进行标准化处理(如z-score标准化),可以使不同尺度上的变量具有可比性,并且对于某些算法来说,它还可以改善数值稳定性。虽然标准化本身不会直接解决多重共线性问题,但它可以辅助其他技术更好地工作,例如当与岭回归一起使用时,标准化确保了所有变量受到相同的正则化强度影响。
【实例6】实例数据同上篇Excel数据集regression_data.xlsx信息,请根据该Excel中工作表<Sheet1>提供的100家公司20X4年的营业收入、研发人数、研发支出与广告支出的数据,做多元线性回归分析。
【分析解答】先以营业收入为因变量,研发人数、研发支出、广告支出作为自变量进行多元线性回归。将前述基础数据和需求描述提交至通义灵码,并经过多轮迭代优化代码。最终优化完成后的代码如下:
import pandas as pdimport statsmodels.api as smregression_test = pd.read_excel('D:/AIpython/regression_data.xlsx','Sheet1', header=0, index_col=0)more_regression=sm.OLS(regression_test['营业收入(万元)'],sm.add_constant(regression_test[['研发人数(人)','研发支出(万元)','广告支出(万元)']]))result1=more_regression.fit()result1.summary()print(result1.summary())
输出结果:
使用通义灵码解释上面的回归输出结果:
接着,我们检测多重共线性,看看该模型是否可进行改进。这里使用方差膨胀因子来对多重共线性进行检验。具体通义灵码生成的的代码如下:
from statsmodels.stats.outliers_influence import variance_inflation_factorexog=more_regression.exog#回归模型中自变量exog_names=more_regression.exog_names#自变量名称vif=[]for i in range(exog.shape[1]-1): vif.append(variance_inflation_factor(exog,i+1)) print(f'{exog_names[i+1]}的方差膨胀因子VIF={vif[i]}')
如果对上述代码的含义不太了解的话,我们也可以使用通义灵码解释代码。输出结果:
使用通义灵码解释上面的回归输出结果:
根据上述分析结果,我们发现研发人数、研发支出等自变量存在较高的多重共线性。接下来使用逐步回归剔除变量解决多重共线性。
print('不剔除变量')print('aic:',round(result1.aic,2),'bic:',round(result1.bic,2),'ADJR2:',round(result1.rsquared_adj,4),'Pvalue:',round(result1.f_pvalue))#剔除研发支出model2=sm.OLS(regression_test['营业收入(万元)'],sm.add_constant(regression_test[['研发人数(人)','广告支出(万元)']]))result2=model2.fit()result2.summary()#print(result2.summary())print('剔除研发支出')print('aic:',round(result2.aic,2),'bic:',round(result2.bic,2),'ADJR2:',round(result2.rsquared_adj,4),'Pvalue:',round(result2.f_pvalue))#剔除研发人数model3=sm.OLS(regression_test['营业收入(万元)'],sm.add_constant(regression_test[['研发支出(万元)','广告支出(万元)']]))result3=model3.fit()result3.summary()#print(result3.summary())print('剔除研发人数')print('aic:',round(result3.aic,2),'bic:',round(result3.bic,2),'ADJR2:',round(result3.rsquared_adj,4),'Pvalue:',round(result3.f_pvalue,2))#剔除广告支出model4=sm.OLS(regression_test['营业收入(万元)'],sm.add_constant(regression_test[['研发人数(人)','研发支出(万元)']]))result4=model4.fit()result4.summary()#print(result4.summary())print('剔除广告支出')print('aic:',round(result4.aic,2),'bic:',round(result4.bic,2), 'ADJR2:',round(result4.rsquared_adj,4),'Pvalue:',round(result4.f_pvalue,2))#剔除研发支出、广告支出model5=sm.OLS(regression_test['营业收入(万元)'],sm.add_constant(regression_test[['研发人数(人)']]))result5=model5.fit()result5.summary()#print(result5.summary())print('剔除研发支出、广告支出')print('aic:',round(result5.aic,2),'bic:',round(result5.bic,2),'ADJR2:',round(result5.rsquared_adj,4),'Pvalue:',round(result5.f_pvalue,2))#剔除研发人数、广告支出model6=sm.OLS(regression_test['营业收入(万元)'],sm.add_constant(regression_test[['研发支出(万元)']]))result6=model6.fit()result6.summary()#print(result6.summary())print('剔除研发人数、广告支出')print('aic:',round(result6.aic,2),'bic:',round(result6.bic,2), 'ADJR2:',round(result6.rsquared_adj,4),'Pvalue:',round(result6.f_pvalue,2))#剔除研发人数、研发支出model7=sm.OLS(regression_test['营业收入(万元)'],sm.add_constant(regression_test[['广告支出(万元)']]))result7=model7.fit()result7.summary()#print(result7.summary())print('剔除研发人数、研发支出')print('aic:',round(result7.aic,2),'bic:',round(result7.bic,2), 'ADJR2:',round(result7.rsquared_adj,4),'Pvalue:',round(result7.f_pvalue,2))
输出结果:
选中输出结果,使用通义灵码解释上面的模型参数评估结果。
除了逐步回归剔除变量来分析模型结果外,我们也可以采用逐步回归增加变量解决多重共线性。
import itertoolsfeatures = ['研发人数(人)', '研发支出(万元)', '广告支出(万元)']combinations = [list(x) for x in itertools.chain.from_iterable(itertools.combinations(features, r) for r in range(1, len(features) + 1))]for i in combinations: modeli=sm.OLS(regression_test['营业收入(万元)'],sm.add_constant(regression_test[i])) resulti = modeli.fit() print(50*'-') print('自变量:',i) sta_index=pd.DataFrame({'AIC':round(resulti.aic,4), 'BIC':round(resulti.bic,4), 'Adj R2':round(resulti.rsquared_adj,4), 'P value':round(resulti.f_pvalue,4)},index=['统计指标']) print(sta_index)
使用通义灵码分析这段代码与代码输出的结果如下。
由上述分析可以看出,无论是使用逐步回归增加变量还是步回归剔除变量,最终推荐选择的模型均是仅包含“研发人数”的回归模型。