多变量线性回归详细说明

Tavish Aggarwal.

在前面的帖子中, 简单的线性回归详细说明 我们了解如何将线性回归应用于我们只有一个独立变量的问题陈述。但在实时场景中,将有许多独立变量,这将有助于预测目标变量。在这里,我将使用Sklearn库的Boston DataSet演示。

让我们创建波士顿数据集并将其拆分为培训和测试数据集以进行评估。数据集具有12个独立变量和1个受依赖变量或目标变量。

import pandas as pd
from sklearn.datasets import load_boston

boston = load_boston()
data = pd.DataFrame(boston.data,columns=boston.feature_names)
data['price'] = pd.Series(boston.target)

y = data.pop('price').values
X = data.values

# Splitting dataset into test and train
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.33, random_state = 5)

搭档

我们开始定义线性回归是什么。我们定义了ESS,RSS,TSS,RSE等度量标准,而R平方则帮助我们找到最佳合适的线路并评估模型性能。深度理解后,我们定义了成本函数并使用各种技术来最小化它:

  1. 普通最小二乘 - OLS估计
  2. 均方误差 - MSE

可以用来找到最好的合适线。我们定义了Python函数来计算OLS。此后,我们定义了MSE函数并理解用于最小化MSE的渐变血清的概念。我们讨论了三种不同类型的梯度下降方法:

  1. 批量梯度下降
  2. 随机梯度下降
  3. 迷你批量梯度下降

在理解上述概念的同时,我们还了解了Sklearn封装LinearRegression和SGDregrorlessor,它们分别使用OLS和随机梯度下降方法来找到最佳的合适线。我们已经用一个变量作为一个独立变量讨论了这一点。

多变量线性回归(MLR)

多变量线性回归是我们找到最佳拟合平面而不是线路来解释一个多个独立变量的回归。换句话说,我们可以说多变量线性回归是简单线性回归的扩展。

由等式给出多变量线性回归:

$$ = \ beta_0 + \ beta_1x_1 + \ beta_2x_2 +。 。 。 。 。 + \ beta_nx_n + \ epsilon $$

类似于简单的线性回归(SLR)模型,多变量线性回归(MLR)模型也具有与其相关联的成本函数。我们需要使用梯度下降算法最小化成本函数。成本函数的公式表示为:

$$ j(\ theta_1,\ theta_2,\ theta_3,。。,\ theta_n)= {1 \超过2m} \ sum_ {i = 1} ^ m {(h_ \ theta(x ^ {(i)}) - y ^ {(i)})} ^ 2 $$

正如我们所看到的,成本函数类似于我们在简单的线性回归中讨论的MSE成本函数。在这里,而不是在Theta 1和Theta 2中融合两个系数2.我们必须收敛n + 1系数,其中n表示特征数和截距。多变量线性回归的梯度下降表示为:

$$ \ theta_0 = \ theta_0 - \ alpha {1 \ over m} \ sum_ {i = 1} ^ m {(h_ \ theta(x ^ {(i)}) - y ^ {(i)})}。 x_0 ^ {(i)} $$

$$ \ theta_1 = \ theta_1 - \ alpha {1 \ over m} \ sum_ {i = 1} ^ m {(h_ \ theta(x ^ {(i)}) - y ^ {(i)})}。 x_1 ^ {(i)} $$

$$ \ theta_2 = \ theta_2 - \ alpha {1 \ over m} \ sum_ {i = 1} ^ m {(h_ \ theta(x ^ {(i)}) - y ^ {(i)})}。 x_2 ^ {(i)} $$

等待所有θ。此外,我们在达到收敛之前重复上述步骤。

笔记: 在纸上显示超过2或3个维度的图。在这里,我们需要适合N维平面来找到最佳型号。 

从SLR转移到MLR

我们在上一篇文章中了解了简单的线性回归。让我们看看有什么相同的,并且在SLR移动到MLR时添加了什么并发症。

什么保持不变:

  1. 我们谈到的假设仍然是一样的。即线性,恒定误差方差,独立错误术语,正常错误,无多元素和交易性。
  2. 通过使用梯度下降最小化成本函数来获得回归曲线的系数。

有什么新的:

  1. 该模型现在适合超平面而不是线
  2. 过度装满
  3. 多型子性
  4. 功能选择
  5. 特征缩放

让我们详细讨论从SLR移动到MLR的变化。

从线到超平面

正如我们之前看到的那样,找到最适合我们用于找到解释目标变量的线的模型。但现在我们有多个独立变量,我们需要绘制一个超平面来解释目标变量。超平面在n尺寸空间中绘制,其中n是用于生成模型的独立变量的数量。

过度装满

当我们继续添加独立变量时,模型可能变得过于复杂,并且该模型可能会记住训练数据或样本数据,并且将无法概括测试数据或群体数据集。 

要确定过度装备,我们在测试和培训数据集中找到了模型的准确性。如果测试和培训数据的准确性之间的差异很大,我们可以得出结论,该模型已经过度填写并无法在测试数据集上概括。

让我们使用12个功能创建一个基本的线性回归。

lm = LinearRegression()
lm.fit(X_train, y_train)

我们有一个型号,我们培训了12个功能。让'计算R2分数(因为它解释了模型的强度),用于测试和训练数据集。

y_pred_test = lm.predict(X_test)
y_pred_train = lm.predict(X_train)

print(r2_score(y_test, y_pred_test))
print(r2_score(y_train, y_pred_train))

# Output
0.6955388005506375
0.7551332741779997

从输出中,我们可以观察到训练和测试数据集之间的R2分数的差异约为6%。因此,陈述我们的模型已经学习并无法概括测试数据集。这是因为过度装备而发生。

笔记: 我们应该始终试图找到高精度,保持模型简单,应该能够从业务角度来讲述模型的故事。

多型子性

多色性是指在输入数据集中具有相关预测变量(I.E独立变量)的现象。

简单来说,使用多个独立变量构建的模型可能是相互关联的,这些变量中的一些模型可能是冗余的。有各种方法可以处理多重型性:

  1. 成对相关性
  2. 方差通胀因子

成对相关性

看着不同对独立变量之间的相关性。 Pandas提供DF.corr()函数来找到成对相关性。让我们调查如下所示的示例:

correlation = data.corr()

我们可以绘制可视化值的热图:

plt.figure(figsize=(12,8))
sns.heatmap(correlation, annot=True)
plt.show()

输出:

相关热敷

一旦我们绘制相关性,我们就可以继续并消除高度相关的值。但请注意,需要业务知识,以便我们不会删除可能影响业务的任何功能。

方差通胀因子

有时而不是只有一个变量,独立变量可能取决于其他变量的组合。 VIF计算所有其他独立变量解释的独立变量如何组合除目标变量。

$$ vif_i = {1 \超过1 - r_i ^ 2} $$

要计算用于该功能的R平方值,我们选择要素并将其归因于所有其他自动变量。

我们为VIF值遵循的常见启发式是:

  • >10:应该消除高VIF值和变量。 (因为它表示该列高度相关)
  • >5:可以没问题,但值得检查。 (因为它表示该列适度相关)
  • <5:良好的VIF值。无需消除此变量。 (因为它表示该列几乎没有相关)

让我们看看我们如何使用Python计算VIF:

from statsmodels.stats.outliers_influence import variance_inflation_factor
import pandas as pd

vif = pd.DataFrame()
vif['Features'] = X_train.columns
vif['VIF'] = [variance_inflation_factor(X_train.values, i) for i in range(X_train.shape[1])]
vif['VIF'] = round(vif['VIF'], 2)
vif = vif.sort_values(by = "vif. ", ascending = False)
print(vif)

输出:

vif.

Here in the code shown above, we are calculating VIF for each and every column of the dataset using variance_inflation_factor function.

我们了解多型性和如何在模型中检测到什么。如果我们发现我们在模型中有多种性,我们需要处理它。以下是处理多重型性的方法:

  1. 丢弃变量
  2. 创建一个新变量
  3. 添加交互功能:使用一些原始功能派生的功能
  4. 可变变换:
    • 主成分分析(PCA)
    • 部分最小二乘(PLS)

丢弃变量

丢弃变量是直接的,其中我们从数据集中删除了高度相关的(正相关或负相关的)特征。

创建一个新变量

我们还可以从现有变量创建新的派生变量。例如。考虑一个数据集,其中我们具有高度和重量和重量高度和高度相关的人的身高和体重。

我们创建一个派生的变量BMI,它是来自数据集的权重/高度和删除权重和高度列。

互动项

当一个变量的效果取决于另一变量的值时,发生交互效果。

在更复杂的研究领域,独立变量可能相互互动。交互效果表明第三变量影响独立和相关变量之间的关系。这种类型的效果使模型更加复杂,但如果现实世界的行为行为,将其纳入您的模型至关重要。

分类变量之间或连续变量之间可以存在相互作用。让我们直观地了解它们。

分类变量之间的交互

考虑一种情况,食物的味道取决于食品和调味品的类型。在这里,独立的分类变量是食品和调味品。依赖变量是享受。

满意度=食物*调味品

满意度取决于食物和调味品,所以单独我们无法得出正确的结果。我们可以使用交互绘图弄清楚互动项。

图中的交叉线表明存在相互作用效果,可以使用针对食物*调味品术语的显着的p值来确认。并行线表明没有互动效果。

连续变量之间的相互作用

与分类变量中的交互项类似,我们可以为连续变量生成交互术语。考虑一个方案,我们具有连续独立变量处理时间,温度和压力。依赖变量是产品的强度。

这里,如果我们可以生成一个功能:温度*压力作为交互项,发现该功能具有显着的p值。

这里我们还可以使用交互绘图弄清楚相互作用效果。

笔记: 

  1. 虽然绘图有助于解释交互效果,但使用假设测试来确定效果是否有统计学意义。
  2. 您可以具有更高级的交互。三向交互在这个词中有三个变量,例如食物*调味品* x。然而,这种类型的效果是挑战解释。在实践中,分析师不经常使用它们。 

可变变换

要了解可变变换,请参阅帖子: Python中的尺寸减少技术.

功能选择

这是多个线性回归的关键方面之一。到目前为止,您必须了解为模型选择合适功能的重要性。

有两种方法可以选择模型中的功能。这些都是:

  1. 手动功能消除
  2. 自动化方法
  3. 平衡的方法

手动功能消除 是我们手动消除该功能的方法,以生成模型并提高准确性。我们可以使用以下方法消除特征:

  1. 我们开始所有功能并逐一消除功能。
  2. 我们从一个功能开始,并继续向模型添加新功能

在这里,让我们考虑我们从所有功能开始的第一种方法,消除较差的功能。  

import statsmodels.api as sm

# Step 1: Adding Constant
col = X.columns
X_train_lm = sm.add_constant(X_train[col])

# Step 2
lr = sm.OLS(y_train, X_train_lm).fit()

# Step 3
print(lr.summary())

输出:

OLS概要

如上所述,我们使用的是使用OLS方法来自统计模型而不是来自Sklearn封装的LinearRegression。背后的原因是因为统计模型提供了关于统计报告的更多细节,而不是Sklearn。让我们看看并理解上面的代码。

  1. 第一步是向数据集添加常量或截距。因为默认情况下不包含截距。
  2. 下一步是使用训练数据集训练模型。
  3. 最后,我们可以看到这些功能的统计报告。

笔记: 当我们有较少数量的功能假设10,那么可以手动确认选择功能。但是假设我们有100多个功能,我们可以手动选择功能吗?

自动化方法 是我们使用算法来决定模型考虑哪个功能的方法。有各种技术可用:

  1. 递归特征消除(RFE)
  2. 向前和向后逐步选择
  3. 套索正规化

递归特征消除(RFE)

递归功能消除是基于重复构建模型的想法并选择最佳或最差的表现功能。在使用RFE模型的特征选择期间连续构造,除非所有功能都耗尽。

它是一种贪婪的优化,用于查找最佳性能的功能子集。 RFE算法适用于:

  1. 首先,模型适合所有变量。
  2. 然后它计算变量系数及其重要性。
  3. 它基于模型(在这种情况下的线性回归)中排列变量,然后在每个迭代中删除低排名变量。

如果我们定义要减少它的功能数量,Sklearn会自动执行提到的过程。考虑下面显示的代码演示RFE选择模型的功能:

# Creating sklearn linear regression model on all the features.
lm = LinearRegression()
lm.fit(X_train, y_train)

rfe = RFE(lm, 8)
rfe = rfe.fit(X_train, y_train)

col = X_train.columns[rfe.support_]

X_train_lm = sm.add_constant(X_train[col])
lr = sm.OLS(y_train, X_train_lm).fit()
print(lr.summary())

向前和向后逐步选择

在转发功能选择中:

  1. 我们从空模型开始。 (即模型没有独立变量,我们只是一个拦截和目标变量)
  2. 我们选择了最好的独立变量。 (导致最低的剩余平方和)
  3. 重复,除非我们对结果感到满意。

后向选择与转发选择相反,

  1. 我们从所有变量开始来构建模型。
  2. 删除最低有效变量。
  3. 重复,除非我们对结果感到满意。 (例如,当所有变量具有重要的p值时,我们可能会停止)

到目前为止,您可能已经猜测了RFE是向后选择的类型。

套索正规化

我们在以后学习它。目前,重要的是要知道这也是用于功能选择的技术。

平衡的方法 是手动和自动化方法的组合。在行业中解决有100多个功能的问题设置,我们使用手动和自动功能选择的组合。

特征缩放

特征缩放是将所有独立变量转换为相同规模的技术。 -1至1.它是一个必要的步骤,因为如果特征不在相同的比例上,渐变下降将需要更多时间来找到全局最小值。缩放有助于:

  1. 解释
  2. 梯度下降更快的收敛

有各种方法可用于缩放功能。受欢迎的是:

  1. 标准化 
  2. MinMax缩放或标准化

标准化

标准化将所有数据带入标准正态分布,其平均零和标准偏差1。

 \ [\文本{标准化:$ x $} = {x - 均值(x)\ over sd(x)} \] 

minmax缩放

MinMax缩放或标准化带来了0和1范围内的所有数据。该技术是首选处理异常值。

笔记: 缩放对最佳拟合线没有任何影响。缩放仅影响最佳拟合线的系数。

 \ [\ text {minmax缩放:$ x $} = {x - min(x)\ over max(x) - min(x)} \] 

模型性能

当添加更多变量时,R线将始终增加或保持相同。因为您已经具有先前变量的预测力,所以R线值无法下降。和一个新的变量,无论多么微不足道,都不能降低R角的值。

到目前为止这么好,但我们如何比较两个具有不同功能计数的模型?根据上述声明,R平方只会增加如果我们添加更多功能。因此,而不是计算R平方,我们计算调整的R平方,这是由以下方式表示的:

 \ [\ text {调整后$ r ^ 2 $} = 1 - {{rss /(n - k-1)} \ overs /(n-1)} \] 

或者,它也可以表示为

\ [\文本{调整后$ r ^ 2 $} = 1 - (1 - R ^ 2){(n-1)\ over(n - k - 1)} \] 

其中,n - k-1称为自由度,n表示观察的数量,k表示独立变量的禁止。

笔记:

  1. 随着自由度降低,R平方将仅增加。
  2. 随着k增加,如果我们添加无用的变量,调整的R平方趋于减少。

概括

在这里,我们开始在从SLR转移到MLR时改变了变化。我们讨论过了:

  1. 该模型现在适合超平面而不是线
  2. 过度装满
  3. 多型子性
  4. 功能选择
  5. 特征缩放

我们结束了模型性能并引入调整后的R平方,这是对R平方的改进。

作者信息

Tavish Aggarwal.

网站: http://tavishaggarwal.com

Tavish Aggarwal.是一个数据科学家 在一个海德拉巴工作,具有广泛的经验,在跨电子商务,财务,医疗保健等等不同领域解决现实世界的业务问题。 他对技术充满热情,喜欢在团队中工作。