微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Huber回归器返回系数的符号不一致

如何解决Huber回归器返回系数的符号不一致

我一直在尝试在时间序列上执行Huber回归(sklearn.linear_model)。 我遇到了一个奇怪的现象:尽管数字不断变化,但有时它返回的负系数很小,有时为正。

例如:

HuberRegressor(epsilon=1.35,max_iter=10000).fit(X=np.arange(12).reshape(-1,1),y=pd.Series([0,1])).coef_

array([3.1380359e-08])

HuberRegressor(epsilon=1.35,2])).coef_

array([-2.20536164e-10])

HuberRegressor(epsilon=1.35,max_iter=10000000).fit(X=np.arange(12).reshape(-1,5])).coef_

array([7.63157014e-07])

HuberRegressor(epsilon=1.35,248])).coef_

array([-4.49809127e-07])

因此,我所做的只是提高上一个观察值(1、2、5、248),但是系数的符号改变了。 由于这是Huber回归,因此将1,3,5,248都识别为离群值,因为所有其他均为零。我应该在模型中找出一些不同的东西吗?

解决方法

TL; DR

在调整示例以重现错误时,我感觉到这是由于浮点运算错误引起的,因为您正在使用带浮点运算的数值算法来评估空斜率。

浮点运算错误

如果使用实数执行计算,得到错误的符号可能很奇怪,但这是浮点数的常见现象。

让您的MCVE适应:

import numpy as np
from sklearn import linear_model 

u = 1
c = []
x = np.arange(12).reshape(-1,1)
for k in [0,1,2,5,25,100,200,500,1000]:
    y = np.array([u]*(len(x)-1)+[k])
    m = linear_model.HuberRegressor(tol=1e-16).fit(X=x,y=y)
    c.append(m.coef_[0])

[-5.923749784709837e-09,-4.9322755264475916e-11,2.5190368660836694e-10,8.3699110105873e-07,-4.3671163925160265e-10,1.2964166828133428e-08,1.5063190859596705e-06,1.5063100994140354e-06,1.5063152932632047e-06]

我承认这种情况下返回的大多数数字通常太大而不能视为零,但我仍然怀疑这种情况,因为更改tol开关确实会影响结果并更改为非空斜率确实返回了预期的结果。

工作用例

我们可以更改数据以评估单一斜率,我们得到以下结果:

c = []
x = np.arange(12).reshape(-1,1000]:
    y = np.array(list(x[:-1])+[k])
    m = linear_model.HuberRegressor(tol=1e-16).fit(X=x,y=y)
    c.append(m.coef_[0])

[0.9999999423436053,0.9999991468916037,0.9999999916835522,0.9999999916837012,1.0000000059171992,1.000000006233575,1.000000006237059,1.000002303772441,1.0000023037721706]

现在信息在设备下方或上方,这是预期的结果。

我的直觉是:您执行的测试给出了奇怪的结果,因为它位于机器精度(可接受的零值)和算法精度具有相同幅度的边界处,因此是不好的信号。当系数的值明显大于算法精度时,该现象消失。

这是浮点运算的常见问题,需要开发人员设计stable和精确的算法,这是一项复杂的任务。涵盖其中许多方面的一个很好的参考是:

N。 J. Higham。数值算法的准确性和稳定性。社会 美国宾夕法尼亚州费城工业与应用数学专业第二名 版,2002年。ISBN0-89871-521-0

我的建议:您可能会在sklearn上发表一个问题来强调此观察,他们可能会在其单元测试套件中添加新的测试来应对这种特定的用例,并为您提供更多有关正在发生的情况的见解在引擎盖下。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。