【问题标题】:Logistic regression coefficient meaning逻辑回归系数含义
【发布时间】:2019-06-06 17:12:38
【问题描述】:

出于练习目的,我正在尝试编写自己的逻辑回归器(使用批量/小批量梯度下降)。

我生成了一个具有正态分布输入的随机数据集(见下文),输出为二进制 (0,1)。我手动使用系数作为输入,并希望能够重现它们(参见下面的代码 sn-p)。然而,令我惊讶的是,我自己的代码和 sklearn LogisticRegression 都无法重现实际数字(尽管符号和数量级是一致的)。此外,我的算法产生的系数与 sklearn 产生的系数不同。 我是否误解了逻辑回归的系数?

我将不胜感激任何对此差异的见解。

谢谢!

编辑:我尝试使用 statsmodels Logit 并得到第三组略有不同的系数值

更多可能相关的信息: 我使用几乎相同的代码编写了一个线性回归器,它运行良好,所以我相当有信心这不是代码中的问题。此外,我的回归器在训练集上的表现实际上优于 sklearn 的,并且它们在测试集上具有完全相同的准确度,所以我没有理由相信回归器是错误的。

生成数据集的代码sn-ps:

o1 = 2
o2 = -3
x[:,1]=np.random.rand(size)*2
x[:,2]=np.random.rand(size)*3
y = np.vectorize(sigmoid)(x[:,1]*o1+x[:,2]*o2 + np.random.normal(size=size))

所以可以看出,输入系数为+2和-3(截取0); sklearn 系数为~2.8 和~-4.8; 我的系数是 ~1.7 和 ~-2.6

以及回归量(其中最相关的部分):

for j in range(bin_size):
    xs = x[i]
    y_real = y[i]
    z = np.dot(self.coeff,xs)
    h = sigmoid(z)
    dc+= (h-y_real)*xs
self.coeff-= dc * (learning_rate/n)

【问题讨论】:

  • 我发布问题时大小为 1,000,但我现在尝试了 10,000,得到的结果基本相同。

标签: python machine-learning scikit-learn logistic-regression


【解决方案1】:

拦截学到了什么?这真的不足为奇,因为您的 y 是 3 次多项式,而您的模型只有两个系数,而需要 3 + y 截距来对预测变量的响应变量进行建模。

此外,例如,由于 SGD,值可能会有所不同。

不太确定,但系数可能不同,并为有限的点集返回正确的 y。每个模型的指标是什么?有区别吗?

【讨论】:

  • 学习到的截距大约为 0.1(正负,每次我随机化输入时都有点不同)。我怀疑这是差异的关键,但我不确定。我的 y 有 2 度,x0 等于 1,theta0 设置为 0(我应该提到这一点.. 抱歉)。我尝试了 SGD 和 Batch 并在收敛后得到了大致相同的结果。最后,我使用了 sklearn 和 statsmodels 的所有默认输入,我必须深入挖掘一下,看看这是否是关键。无论如何,谢谢!
  • 您可以尝试使用 np.linalg.inv 的正规方程并查看系数,以确保并排除迭代方法失败。此外检查预测以及是否在 statsmodels 和/或 sklearn 中使用了正则化。
  • 谢谢你的想法,他们确实实现了正则化,但即使我把它关掉,我得到的结果也不一样。我猜你最初的建议是正确的 - = 不同的系数仍然可以返回正确的 y 值。
  • 你可能会在数学 stackexchange 上做得更好,伙计们更注重数学,可能会提供额外的见解。
猜你喜欢
  • 2016-01-02
  • 2019-09-18
  • 2018-12-09
  • 2020-12-22
  • 2015-01-04
  • 2019-10-11
  • 1970-01-01
  • 2020-11-28
  • 2013-01-03
相关资源
最近更新 更多