【机器学习】(基础篇四) —— 回归分析

回归分析

线性回归是回归任务,输入是带有标签的数据,根据数据关系,拟合出一个函数,并利用该函数进行预测等操作。回归分析不止有线性关系,还包括了非线性相关关系等。

变量间的关系

变量间的关系有很多种,我们使用相关系数来作为两个或多个变量之间线性关联强度和方向的统计量。它通常用来评估一个变量的变化是否以及多大程度上能够预测另一个变量的变化,使得我们能够了解这两个变量之间的相关性是正的、负的还是没有明显的线性关系。

相关系数r

最常用的类型是皮尔逊相关系数(Pearson correlation coefficient),通常用小写字母r表示。皮尔逊相关系数的计算公式为:

ρ X , Y = r = Cov ( X , Y ) σ X σ Y \rho_{X, Y} = r = \frac{\text{Cov}(X, Y)}{\sigma_X \sigma_Y} ρX,Y=r=σXσYCov(X,Y)

r = n ∑ x y − ( ∑ x ) ( ∑ y ) ( n ∑ x 2 − ( ∑ x ) 2 ) ( n ∑ y 2 − ( ∑ y ) 2 ) r = \frac{n\sum xy - (\sum x)(\sum y)}{\sqrt{(n\sum x^2 - (\sum x)^2)(n\sum y^2 - (\sum y)^2)}} r=(nx2(x)2)(ny2(y)2) nxy(x)(y)

皮尔逊相关系数的取值范围是 -1 到 +1,其取值的含义为:

  • 当 r>0 时,表示两个变量之间存在正相关关系,即一个变量增加时,另一个变量也增加,r=1时为完全正相关,即一个变量增加时,另一个变量按固定比例增加。
  • 当 r<0 时,表示两个变量之间存在负相关关系,即一个变量增加时,另一个变量减少,当 r=−1 时,表示完全负相关,即一个变量增加时,另一个变量按固定比例减少。
  • 当 r=0 时,表示两个变量之间无线性相关,但这并不意味着它们之间不存在任何其他形式的相关性(例如非线性相关)。

【代码示例】使用python实现计算相关系数

# 计算相关系数
import numpy as np
def pearson(x,y):   # 皮尔逊相关系数
    x_mean = np.mean(x)
    y_mean = np.mean(y)
    numerator = np.sum((x-x_mean)*(y-y_mean))
    denominator = np.sqrt(np.sum((x-x_mean)**2)*np.sum((y-y_mean)**2))
    return numerator/denominator
x = np.array([1,2,3,4,5])
y = np.array([5,4,3,2,1])
print(pearson(x,y))

运行结果:

-1.0

相关关系

不同的相关关系表现如下:

在这里插入图片描述

单变量线性回归

它探讨的是一个自变量(也称为解释变量或预测变量)与一个因变量(也称为响应变量或预测目标)之间的线性关系。一元线性回归的基本模型定义为:

y = β 0 + β 1 x + ε y=\beta_0+\beta_1x+\varepsilon y=β0+β1x+ε

误差项ε是随机变量反映了除 x 和 y 之间的线性关系之外的随机因素对 y 的影响,是不能由 x 和 y 之间的线性关系所解释的变异性。

假定误差项ε是一个期望值为0的随机变量,即E(ε)=0。对于一个给定的 x 值,y 的期望值为E (y ) =β0+ β1x

我们的目标是根据训练样本得到最合适的参数β0和β1,让所有训练样本点到拟合直线函数的距离最小,使用的方法是最小二乘法

最小二乘法(Ordinary Least Squares, OLS):让实际值和估计值(拟合函数)之间的距离总和最小为要求得到估计参数,为了方便及不让正负符号抵消,使用残差平方和表示距离,即

M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \mathrm{MSE}=\frac1n\sum_{i=1}^n(y_i-\hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

在单变量线性回归中,因为这个函数是在凸优化问题,局部最小值都是全局最小值,通过微分并令其等于零来找到极小值点就是全局最小值点。对于一元线性回归问题,可以直接推导出闭式解:

β 1 ^ = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 \hat{\beta_1}=\frac{\sum_{i=1}^n(x_i-\bar{x})(y_i-\bar{y})}{\sum_{i=1}^n(x_i-\bar{x})^2} β1^=i=1n(xixˉ)2i=1n(xixˉ)(yiyˉ)

然后,利用估计出的β1计算出β0

β 0 ^ = y ˉ − β 1 ^ x ˉ \hat{\beta_0}=\bar{y}-\hat{\beta_1}\bar{x} β0^=yˉβ1^xˉ

【示例】使用sklearn实现单变量的线性回归并且进行可视化展示

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# Step 1: Generate some sample data
X = np.random.randint(0,10,(100,1))
y = 2 * X + 1 + np.random.randint(0,10,(100,1))
# print(y)

# Step 2: Split the dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# print()

# Step 3: Create a linear regression model
model = LinearRegression()

# Step 4: Train the model using the training sets
model.fit(X_train, y_train)

# Step 5: Make predictions using the testing set
y_pred = model.predict(X_test)
# print(x,y_pred)

# Step 6: The coefficients系数
print('系数', model.coef_)
print("截距:",model.intercept_)
# MSE: mean squared error
print("MSE: %.2f" % mean_squared_error(y_test, y_pred))
# The coefficient of determination: 1 is perfect prediction
print('r2分数: %.2f' % r2_score(y_test, y_pred))

# Step 7: Plot outputs
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)

plt.show()

运行结果:

在这里插入图片描述

拟合优度与检验

在得到一个模型结果之后,我们需要一些方法或者指标来判断这个模型是否有效,即得到的模型是否能够有效的反映训练样本所表达的关系。

要检验样本和估计值之间的关系,我们经常会使用距离来进行衡量,如果所有的训练样本点到估计值的距离都很小,我们就可以说这个拟合的模型结果很好。

在这里插入图片描述

在这里插入图片描述

回归平方和: S S R = ∑ ( y ^ i − y ˉ ) 2 SSR=\sum(\hat{y}_i-\bar{y})^2 SSR=(y^iyˉ)2

SSR反映了回归模型对数据的解释能力,SSR越大,说明模型能够解释更多的数据变异。当模型完美拟合数据时,SSR等于SST(总平方和),而SSE(残差平方和)则为0。

残差平方和: S S E = ∑ ( y i − y ^ i ) 2 SSE=\sum(y_i-\hat{y}_i)^2 SSE=(yiy^i)2

SSE越小,说明模型的预测值与实际观测值越接近,模型的拟合效果越好。在上一小节的最小二乘法中,目标就是找到使SSE最小化的模型参数。

总平方和: S S T = ∑ ( y i − y ˉ ) 2 = S S R + S S E SST=\sum(y_i-\bar{y})^2 = SSR + SSE SST=(yiyˉ)2=SSR+SSE

SST它衡量了观测值与其平均值之间的差异的平方和,提供了因变量总变异性的一个度量。残差平方和(SSE)代表了模型未能解释的变异部分,回归平方和(SSR)则表示了模型成功解释的变异部分。

判定系数R^2: R 2 = 1 − S S E S S T R^2=1-\frac{SSE}{SST} R2=1SSTSSE

是在回归分析中衡量模型拟合优度的一个统计量。它表示模型解释的变异占总变异的比例,取值范围从0到1。一个较高的 R^2 值表明模型对数据的解释能力较好,反之则较差。

均方误差MSE: M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \mathrm{MSE}=\frac1n\sum_{i=1}^n(y_i-\hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

用于评估预测值与真实值之间的差异。在回归分析中,MSE用来衡量模型预测的准确性。它是预测值与实际观测值之差的平方的平均值。

判定系数等于相关系数的平方,即R2=(*r*)2

F统计量:(F-statistic)是在统计学中用于检验模型中一个或多个参数是否显著影响响应变量的重要工具,特别是在ANOVA(Analysis of Variance,方差分析)和线性回归分析中。F统计量是通过对模型误差的变异性和总变异性的比率进行比较来计算的,它可以用来评估模型的整体适配度以及模型中的单个预测因子是否对响应变量有显著影响。

  • F统计量的值越大,说明模型解释的变异程度相对于未解释的变异程度越大,这通常表明模型对数据的解释能力较强,模型整体上是显著的。
  • F统计量的P值:在进行假设检验时,我们通常会计算F统计量的P值。如果P值小于预设的显著性水平(如0.05),则拒绝原假设,认为至少有一个预测因子对响应变量有显著影响。

上述的很多参数中,常用的只有判定系数R2,其余的定义都是为了最终计算出这个值,只需要掌握这个的计算即可。使用sklear包中提供的工具即可实现计算R2,因为底层设计的数据计算比较多,手写容易出错,所以在这里我也直接调用相关方法。

【示例】使用sklearn计算r2指标

# 计算R^2和F统计量
# 导入相关工具
from sklearn.metrics import r2_score
# 传入标签值和估计值进行计算
r2 = r2_score(y, y_predict)
print(f"R² Score: {r2}")

输出结果:

R² Score: 0.7272727272727273

多变量线性回归

多元线性回归(Multiple Linear Regression)用于研究一个因变量(dependent variable)与两个或更多个自变量(independent variables)之间的线性关系。相比于一元线性回归,多元线性回归模型允许考虑多个影响因素,这些因素共同作用于预测目标变量。多元线性回归可以写成如下形式:

y = β 0 + β 1 x 1 + β 2 x 2 + . . . + β p x p + ϵ y=\beta_0+\beta_1x_1+\beta_2x_2+...+\beta_px_p+\epsilon y=β0+β1x1+β2x2+...+βpxp+ϵ

利用最小二乘法的思想,对各个参数求偏导,令其等于0,得出估计参数值

使用skelearn实现多变量线性回归和上面单变量的用法相同,都是使用LinearRegression,不同的就是此时传入的x变成了多个维度的数组,以此来表示多个变量。在实际应用中,多个变量通常不会继续使用线性回归,而是使用非线性回归进行更贴切的拟合。

多重共线性

多重共线性(Multicollinearity)是指在多元线性回归分析中,两个或多个自变量之间存在高度相关(线性关系),以至于难以准确估计各自对因变量的影响程度的现象。换句话说,模型中的某些自变量可以相当好地通过其他自变量进行预测,导致回归系数的估计值不稳定,误差增大,甚至出现不合理的符号和大小。

应对多重共线性的策略包括:

  • 删除相关性强的自变量:如果分析的目的不是预测而是解释变量之间的关系,可以选择保留其中一个具有经济或科学意义的自变量,删除与其他自变量高度相关的变量。
  • 变量变换:通过变量组合、主成分分析(PCA)、因子分析等方法重新构造变量,消除共线性。
  • 岭回归(Ridge Regression)套索回归(Lasso Regression):这类惩罚回归方法可以在一定程度上缓解多重共线性问题,通过引入正则化项来约束回归系数的大小。
  • 增加样本量:在某种程度上,增加样本量可以改善参数估计的稳定性,但并不能从根本上解决多重共线性问题。
  • 逐步回归法:通过逐步选择变量进入或退出模型,筛选出最具解释力且不严重共线的变量组合。

多项式回归

多项式回归(Polynomial Regression)是一种特殊的线性回归模型,它用于拟合数据点之间的非线性关系。在多项式回归中,我们将自变量通过一个或多个幂次项进行转换,形成新的预测变量,然后用这些新的预测变量与因变量建立线性关系。

例如,在一元多项式回归中,如果只有一个自变量 x,我们可以将其转换为更高次幂的项,如 x2、x3 等,形成如下的模型:

y = β 0 + β 1 x + β 2 x 2 + β 3 x 3 + … + ϵ y=\beta_0+\beta_1x+\beta_2x^2+\beta_3x^3+\ldots+\epsilon y=β0+β1x+β2x2+β3x3++ϵ

在多元多项式回归中,可以对多个自变量都进行多项式转换,例如:

y = β 0 + β 1 x + β 2 x 2 + β 3 x 3 + … + ϵ y=\beta_0+\beta_1x+\beta_2x^2+\beta_3x^3+\ldots+\epsilon y=β0+β1x+β2x2+β3x3++ϵ

这个模型的目标函数依然是通过最小化残差平方和来估计参数

进行多项式回归分析,首先要确定多项式的次数。次数的确定一般是根据经验和实验。

【代码示例】实现线性回归和多项式回归的比较

# 线性回归和多项式回归比较
import numpy as np
import matplotlib.pyplot as plt

x = np.random.uniform(-3,3,size = 100) # 在-3,3中间生成100个随机数
X = x.reshape(-1,1)  # 将列表变为矩阵, -1 表示自动计算这一维度的大小,以保持原数组所有元素不变,变为一列的矩阵
y = 0.5*x**2 + x + 2 + np.random.normal(0,1,size = 100) # 在数据中引入随机噪声

# 线性回归
from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(X,y)
y_predict = lin_reg.predict(X)
plt.rcParams['font.family'] = ['SimHei'] # 设置图中所有字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 设置坐标轴数据的符号显示为兼容模式
plt.title('线性回归')
plt.scatter(x,y)
plt.plot(x,y_predict,color='r')
plt.show()

# 多项式回归
from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree=2)  # 设置多项式的次数
poly.fit(X)
x2 = poly.transform(X)

# 下面的步骤和线性回归一致
lin_reg2 = LinearRegression()
lin_reg2.fit(x2, y)
y_predict2 = lin_reg2.predict(x2)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict2[np.argsort(x)],color = 'r')
plt.title('多项式回归')

运行结果:

在这里插入图片描述

岭回归

岭回归(Ridge Regression)是一种用于解决多重共线性问题以及防止过拟合的线性模型技术。它通过对最小二乘估计加上一个正则化项来修正模型参数的估计,从而减小了某些极端情况下的系数估计值,提高了模型的稳定性和泛化能力。岭回归的求解步骤如下:

  1. 模型形式: 岭回归的目标函数是在最小二乘损失函数的基础上加入L2范数惩罚项(所有参数的平方和):

    L ( a ) = 1 2 N ∑ i = 1 N ( y i − ( a 0 + a 1 x i 1 + a 2 x i 2 + ⋯ + a p x i p ) ) 2 + λ ∑ j = 1 p a j 2 L(a)=\frac1{2N}\sum_{i=1}^N(y_i-(a_0+a_1x_{i1}+a_2x_{i2}+\cdots+a_px_{ip}))^2+\lambda\sum_{j=1}^pa_j^2 L(a)=2N1i=1N(yi(a0+a1xi1+a2xi2++apxip))2+λj=1paj2

    也可写为为 Minimize β ∣ ∣ y − X β ∣ ∣ 2 2 + λ ∣ ∣ β ∣ ∣ 2 2 \text{Minimize}_\beta||y-X\beta||_2^2+\lambda||\beta||_2^2 Minimizeβ∣∣y22+λ∣∣β22

    其中,y 是因变量向量,X 是包含所有特征(包括截距项)的设计矩阵,β 是回归系数向量,而 λ 是正则化强度参数,控制着模型对复杂度的惩罚程度。

  2. 选择正则化参数 λ

    • 交叉验证(多次实验):通过分割训练数据集为若干子集并计算不同 λ 下的交叉验证误差,选择使得验证误差最小的那个 λ。
    • 通过轮廓线(L-curve)、网格搜索或其他启发式方法寻找最优的 λ 值。

通过梯度下降法或其变种(如随机梯度下降、小批量梯度下降等)来计算参数。对于每个参数计算梯度,然后进行参数更新,达到满意的状态。

这里用的是批量梯度下降法,如果使用随机梯度下降或小批量梯度下降,只需将全体样本N替换为随机选取的一个或一小批样本即可。

岭回归主要适用于过拟合严重或各变量之间存在多重共线性的情况,它可以解决特征数量比样本量多的问题,另外,岭回归作为一种缩减算法可以判断哪些特征重要或者不重要,有点类似于降维,缩减算法可以看作是对一个模型增加偏差的同时减少方差。但是岭回归方程的R2会稍低于普通回归分析,但回归系数的显著性往往明显高于普通回归。

【代码示例】python实现岭回归

# 岭回归
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge

# 数据
data=[
[0.07,3.12],[0.41,3.82],[0.99,4.55],[0.73,4.25],[0.98,4.56],
[0.55,3.92],[0.34,3.53],[0.03,3.15],[0.13,3.11],[0.13,3.15],
[0.31,3.47],[0.65,4.12],[0.73,4.28],[0.23,3.48],[0.96,4.65],
[0.62,3.95],[0.36,3.51],[0.15,3.12],[0.63,4.09],[0.23,3.46],
[0.08,3.22],[0.06,3.19],[0.92,4.63],[0.71,4.29],[0.01,3.08],
[0.34,3.45],[0.04,3.16],[0.21,3.36],[0.61,3.99],[0.54,3.89] ]
dataMat = np.array(data) # 将列表转换为二维矩阵
# 生成x和y
x = dataMat[:,0:1]
y = dataMat[:,1]
model = Ridge(alpha=0.5) # alpha为参数更新时的学习率
model.fit(x,y)
print("系数矩阵:",model.coef_)
print("线性回归模型:\n",model)
predicted = model.predict(x)
plt.scatter(x,y,marker='o')
plt.plot(x,predicted,color = 'r')
plt.xlabel('x')
plt.ylabel('y')
plt.show

运行结果:

系数矩阵: [1.40203058]
线性回归模型:
 Ridge(alpha=0.5)

在这里插入图片描述

【代码示例】使用交叉验证得到最佳的学习率alpha

# 岭回归交叉验证
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import RidgeCV

# 数据
data=[
[0.07,3.12],[0.41,3.82],[0.99,4.55],[0.73,4.25],[0.98,4.56],
[0.55,3.92],[0.34,3.53],[0.03,3.15],[0.13,3.11],[0.13,3.15],
[0.31,3.47],[0.65,4.12],[0.73,4.28],[0.23,3.48],[0.96,4.65],
[0.62,3.95],[0.36,3.51],[0.15,3.12],[0.63,4.09],[0.23,3.46],
[0.08,3.22],[0.06,3.19],[0.92,4.63],[0.71,4.29],[0.01,3.08],
[0.34,3.45],[0.04,3.16],[0.21,3.36],[0.61,3.99],[0.54,3.89] ]
dataMat = np.array(data) # 将列表转换为二维矩阵
# 生成x和y
x = dataMat[:,0:1]
y = dataMat[:,1]
model = RidgeCV([0.1,0.5,1.0,10.0]) # 多个alpha交叉验证
model.fit(x,y)
print("效果最佳的alpha = ",model.alpha_)

运行结果:

效果最佳的alpha =  0.1

套索回归

Lasso回归(Least Absolute Shrinkage and Selection Operator,最小绝对收缩和选择算子)是一种正则化线性回归方法,由Robert Tibshirani于1996年提出,旨在解决多重共线性问题、变量选择以及防止过拟合

在Lasso回归中,目标函数在线性回归的基础上加上一个L1正则项(所有参数的绝对值之和),变为:

min ⁡ β 1 2 n ∑ i = 1 n ( y i − β 0 − ∑ j = 1 p β j x i j ) 2 + λ ∑ j = 1 p ∣ β j ∣ \begin{aligned}\min_\beta\frac{1}{2n}\sum_{i=1}^n(y_i-\beta_0-\sum_{j=1}^p\beta_jx_{ij})^2+\lambda\sum_{j=1}^p|\beta_j|\end{aligned} βmin2n1i=1n(yiβ0j=1pβjxij)2+λj=1pβj

Lasso回归的特点:

  • 特征选择:由于L1惩罚项的作用,Lasso回归会将一些不重要的特征的系数压缩至零,从而实现特征选择。
  • 稀疏解:Lasso回归产生的解是稀疏的,即大多数特征的权重会被设为零,这有助于解释和理解模型。
  • 正则化:通过调节 λ 参数,可以控制模型的复杂度。当 λ=0时,回归就退化为普通的线性回归。当 λ 很大时,所有参数都会被压缩至零。
  • 防止过拟合:由于包含了正则化项,Lasso回归在面对多重共线性或数据维度很高的情况下,比普通的线性回归更不容易过拟合。
  • 计算复杂性:虽然Lasso回归的优化问题是非光滑的(因为L1惩罚项是非光滑的),但可以通过坐标下降、最小角度回归(LARS)等算法高效地求解。

【代码示例】使用sklearn实现Lasso回归

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 设置随机数种子以便结果可复现
np.random.seed(0)

# 使用make_regression生成数据集
X, y = make_regression(n_samples=100, n_features=1, noise=10)

# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# 创建Lasso回归模型实例
lasso = Lasso(alpha=0.1)

# 拟合模型
lasso.fit(X_train, y_train)

# 预测测试集
y_pred = lasso.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")

# 可视化
plt.scatter(X_test, y_test, color='blue', label='Actual data')
plt.plot(X_test, y_pred, color='red', linewidth=2, label='Lasso regression')
plt.legend()
plt.title('Lasso Regression')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

运行结果:

在这里插入图片描述

套索回归 vs 岭回归

岭回归无法剔除变量,而Lasso(Least Absolute Shrinkage and Selection Operator)回归模型,将惩罚项由L2范数变为L1范数,可以将一些不重要的回归系数缩减为0,达到剔除变量的目的。

在实践中,岭回归(Ridge)和lasso我们首选岭回归。不过如果特征数过多,但是其中只有几个特征是重要的,则选择lasso效果会更好。同时,lasso由于其模型更加便于理解(因为它只选择一部分输入特征),所以有时候用lasso回归效果也不理想。

当然,如果我们能够将两者进行优势互补,则会达到更佳的效果,在scikit-earn中提过了ElasticNet类,就是结合了这两种回归的惩罚项。在实践中效果会更好,不过需要同时调节L1和L2正则化参数。

逐步回归

在建立回归模型时,对自变量进行筛选,可以有效解决过拟合和多重共线性问题。

选择自变量的原则是对统计量进行显著性检验:将一个或一个以上的自变量引入到回归模型中时,是否使得目标函数(残差平方和,SSE)显著地减少。如果增加一个自变量使SSE的减少是显著的,则说明有必要将这个自变量引入回归模型,否则,就没有必要将这个自变量引入回归模型。确定引入自变量是否使SSE有显著减少的方法,就是使用F统计量的值作为一个标准,以此来确定是在模型中增加一个自变量,还是从模型中剔除一个自变量。残差平方和(SSE)越小越好,F统计量越大越好

变量选择的方法主要有:向前选择、向后剔除、逐步回归、最优子集等

向前选择

从模型中没有自变量开始

对k个自变量分别拟合对因变量的一元线性回归模型,共有k个,然后找出F统计量的值最高的模型及其自变量,并将其首先引入模型

分别拟合引入模型外的k-1个自变量的线性回归模型

如此反复进行,直至模型外的自变量均无统计显著性为止

向后剔除

先对因变量拟合包括所有k个自变量的回归模型。然后考察p(p<k)个去掉一个自变量的模型(这些模型中每一个都有的k-1个自变量),使模型的SSE值减小最少的自变量被挑选出来并从模型中剔除

考察p-1个再去掉一个自变量的模型(这些模型中在每一个都有k-2个的自变量),使模型的SSE值减小最少的自变量被挑选出来并从模型中剔除

如此反复进行,一直将自变量从模型中剔除,直至剔除一个自变量不会使SSE显著减小为止

逐步回归

将向前选择和向后剔除两种方法结合起来筛选自变量

在增加了一个自变量后,它会对模型中所有的变量进行考察,看看有没有可能剔除某个自变量。如果在增加了一个自变量后,前面增加的某个自变量对模型的贡献变得不显著,这个变量就会被剔除

按照方法不停地增加变量并考虑剔除以前增加的变量的可能性,直至增加变量已经不能导致SSE显著减少

在前面步骤中增加的自变量在后面的步骤中有可能被剔除,而在前面步骤中剔除的自变量在后面的步骤中也可能重新进入到模型中

【代码示例】一家大型商业银行在多个地区设有分行,近年来,该银行的贷款额平稳增长,但不良贷款额也有较大比例的提高,这给银行业务的发展带来较大压力。为弄清楚不良贷款形成的原因,管理者希望利用银行业务的有关数据做些定量分析,以便找出控制不良贷款的办法。

试建立不良贷款(y)与贷款余额(x1)、累计应收贷款(x2)、贷款项目个数(x3)和固定资产投资额(x4)的线性回归方程,并解释各回归系数的含义

在这里插入图片描述

逐步回归法进行回归预测

import toad
import pandas as pd
from statsmodels.formula.api import ols  # 最小二乘法
example1 = pd.read_excel(r"C:\Users\13563\Desktop\商业银行不良贷款数据.xlsx")
example1.columns=['分行编号','不良贷款','贷款余额','累计应收贷款','贷款项目个数','固定资产投资额']
final_data = toad.selection.stepwise(  # 逐步进行特征选择
example1.iloc[:,1:],
target = '不良贷款',
estimator='ols', # 指定了使用普通最小二乘法(Ordinary Least Squares, OLS)
direction = 'both',  # forward/backward
criterion = 'aic' # 使用的模型选择标准是赤池信息准则(Akaike Information Criterion, AIC),用于衡量模型拟合优度和复杂度之间的平衡。
)
final_data # 结果自动剔除了影响最小的‘贷款项目个数’

运行结果:

在这里插入图片描述

使用向前选择和向后选择只需要将direction置为forward和backward即可

剔除了‘贷款项目个数’因素的影响后,对剩余的特征进行分析

import pandas as pd
from statsmodels.formula.api import ols
example1 = pd.read_excel(r"C:\Users\13563\Desktop\商业银行不良贷款数据.xlsx")
example1.columns=['分行编号','不良贷款','贷款余额','累计应收贷款','贷款项目个数','固定资产投资额']
mymodel1 = ols("不良贷款~贷款余额+固定资产投资额+累计应收贷款",data=example1).fit() # 不良贷款是因变量,后面是自变量
print(mymodel1.summary())

运行结果:
在这里插入图片描述

分析上述总结,r2为0.797,但是‘固定资产’和‘累计应收贷款’的P值统计量都大于0.05,可以分别删除两个变量再进行比较,最后得出结论是应该继续剔除‘累计应收贷款’项

import pandas as pd
from statsmodels.formula.api import ols
example1 = pd.read_excel(r"C:\Users\13563\Desktop\商业银行不良贷款数据.xlsx")
example1.columns=['分行编号','不良贷款','贷款余额','累计应收贷款','贷款项目个数','固定资产投资额']
mymodel1 = ols("不良贷款~贷款余额+固定资产投资额",data=example1).fit()
print(mymodel1.summary())

运行结果:

在这里插入图片描述

此时的r2有所降低,但是各个特征的P值统计量结果更显著。

  • 27
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值