标准化和归一化如何影响线性模型的系数?

数据挖掘 线性回归 特征缩放 解释 岭回归 套索
2022-02-16 10:05:57

创建线性模型的一个好处是您可以查看模型学习并解释它们的系数。例如,您可以查看哪些特征具有最强的预测能力,哪些没有。

如果我们在拟合模型之前对所有特征进行归一化(将所有特征缩放到 0-1)与标准化(减去均值并除以标准差)它们,那么特征可解释性如何改变。

我在其他地方读到过,“如果你规范化你的特征,你会失去特征的可解释性”,但找不到原因的解释。如果这是真的,你能解释一下吗?

这是我建立的两个多元线性回归模型的系数的两个屏幕截图。它使用 Gapminder 2008 数据和每个国家的统计数据来预测其生育率。

首先,我使用 StandardScaler 缩放特征。在第二个中,我使用了 MinMaxScaler。Region_ 特征是分类的,是一次性编码的,没有缩放。

不仅系数会根据不同的缩放比例发生变化,而且它们的排序(重要吗?)也发生了变化!为什么会这样?这是什么意思?

使用 StandardScaler 进行预处理的线性模型系数

使用 MinMaxScaler 进行预处理的线性模型系数

2个回答

当你有一个线性回归(没有任何缩放,只是简单的数字)并且你有一个具有一个解释变量和系数的模型时xβ0=0,那么你基本上有一个(估计的)函数:β1=1

y=0+1x.

这告诉您,当上升(下降)一个单位时,上升(下降)一个单位。在这种情况下,它只是一个斜率为 1 的线性函数。xy

现在,当您缩放(普通数字)时,例如:x

scale(c(1,2,3,4,5))
           [,1]
[1,] -1.2649111
[2,] -0.6324555
[3,]  0.0000000
[4,]  0.6324555
[5,]  1.2649111

您本质上具有不同的单位或不同的比例(均值= 0,sd = 1)。

然而,OLS 的工作方式是一样的,它仍然告诉你“如果上升(下降)一个单位,将改变个单位。所以在这种情况下(给定不同的比例),会有所不同。xyβ1xβ1

这里的解释是“如果变化一个标准差……”。当您有多个具有不同单位的时,这非常方便。当你标准化所有不同的单位时,你就可以使它们在某种程度上具有可比性。即你的回归的系数将在变量对的影响有多强方面是可比较的。这有时称为Beta 系数或标准化系数xxβy

当你正常化时会发生非常相似的事情。在这种情况下,您还将更改 x 的比例,测量方式xx

另请参阅此讲义

我相信随着缩放,系数。以相同的级别进行缩放,即 Std。标准化的偏差时间和标准化的(最大-最小)时间

如果我们单独查看所有特征,我们基本上是在移动它,然后将其缩小一个常数,但不变。y

因此,如果我们在二维空间中成像一条线,我们将保持不变并将挤压一个常数(假设它 =)。 这意味着(假设 Coeff. = Slope = = dy/dx), 斜率也将增加相同的数量,即倍。(因为dx 已除以常数()但 dy 相同,所以即斜率 = * old_slope(即缩放前的斜率)我们可以在这段代码片段中观察到两个系数都在标准偏差和 (Max - Min) 分别与未缩放系数的比值yxC

tanθ
CCtanθC

import sys;import os;import pandas as pd, numpy as np
os.environ['KAGGLE_USERNAME'] = "10xAI" 
os.environ['KAGGLE_KEY'] = "<<Your Key>>" 

import kaggle
!kaggle datasets download -d camnugent/california-housing-prices

dataset = pd.read_csv("/content/california-housing-prices.zip")
y = dataset.pop('median_house_value')
x = dataset.iloc[:,:4]
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x,y)
old_coef = model.coef_  

x_s = (x-x.mean())/x.std()
model.fit(x_s,y)
std_coef = model.coef_  

print("###Ratio of Scaled Coeff and Std. Deviation times Standardized Coeff")
print(std_coef/(old_coef*x.std()))

x_n = (x-x.min())/(x.max()-x.min())
model.fit(x_n,y)
nor_coef = model.coef_  

print("###Ratio of Scaled Coeff and (Max - Min) times Normalized Coeff")
print(nor_coef/(old_coef*(x.max()-x.min())))

在此处输入图像描述

因此,您可以从标准化和归一化系数计算未缩放的系数。

关于重要性

顺序(因为它是排序值)可能会改变,因为标准偏差将不等于 (Max - Min)

但这不应该影响重要性。重要性应该在原始数据空间中衡量或者单位应该是标准偏差(如 Peter 所解释的)或(Max - Min),但这对每个用户来说可能不是很直观。