lin_reg.coef_ 函数在使用 StandardScaler 缩放训练数据时返回过高的系数

Posted

技术标签:

【中文标题】lin_reg.coef_ 函数在使用 StandardScaler 缩放训练数据时返回过高的系数【英文标题】:lin_reg.coef_ function returns coefficients that are too high when using StandardScaler to scale the training data 【发布时间】:2021-11-15 00:48:02 【问题描述】:

我在以下上下文中使用 StandardScalar() 和 lin_reg.coef_ 函数:

for i in range(100):
    
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=i)
    scaler = StandardScaler().fit(x_train)
    x_train = scaler.transform(x_train)
    x_test = scaler.transform(x_test)
    lin_reg = LinearRegression().fit(x_train, y_train)
    
    if i == 0:
        print(lin_reg.coef_)
    if i == 1:
        print(lin_reg.coef_)

这导致以下输出:

代码输出

因此,正如预期的那样,coef_ 函数返回我传递给线性回归的 22 个不同特征的系数。但是,对于第二个输出,一些系数太大(例如 1.61e+14)。我很确定使用 StandardScaler() 进行缩放可以正常工作。但是,如果我在应用 coef_ 函数之前不缩放训练数据,我不会得到这些高系数。我应该提到的一件重要的事情是最后 13 个特征是二元特征,而前 9 个特征是连续的(例如年龄)。我可以想象这个问题在某种程度上与这个事实有关,尽管对于第一个二进制特征,系数是正确计算的(只是最后 12 个二进制特征的系数太大)。

【问题讨论】:

【参考方案1】:

当数据来自高斯分布时,您应该使用标准化。对二进制数据使用 StandardScal() 没有任何意义。

您应该只缩放前 9 个九个变量,然后将它们全部传递到线性回归中。

https://www.atoti.io/when-to-perform-a-feature-scaling/ Avoid scaling binary columns in sci-kit learn StandsardScaler

【讨论】:

以上是关于lin_reg.coef_ 函数在使用 StandardScaler 缩放训练数据时返回过高的系数的主要内容,如果未能解决你的问题,请参考以下文章

Wiremock Stand alone - 如何使用请求数据操作响应

Linux中的两种守护进程stand alone和xinetd

windows server 2016 stand安装oracle12c

Notifications.getExpoPushTokenAsync无法在Stand Alone iOS上运行

ruby Clone Stand产品throght活动

Stand Up Paddle~浆板普及贴