【问题标题】:Batch Gradient Descent for Logistic Regression逻辑回归的批量梯度下降
【发布时间】:2015-07-15 12:44:48
【问题描述】:

我一直在学习 Andrew Ng CSC229 机器学习课程,现在正在学习逻辑回归。目标是最大化对数似然函数并找到最佳的 theta 值。讲义的链接是:[http://cs229.stanford.edu/notes/cs229-notes1.ps][1] -pages 16-19。现在下面的代码显示在课程主页上(虽然在 matlab 中——我将其转换为 python)。

我将其应用于包含 100 个训练示例的数据集(Coursera 主页上提供的机器学习入门课程的数据集)。该数据有两个特征,即两次考试的两个分数。如果学生被录取,则输出为 1,如果学生没有被录取,则输出为 0。已经显示了下面的所有代码。下面的代码使似然函数收敛到大约 -62 的最大值。 theta 的对应值为 [-0.05560301 0.01081111 0.00088362]。当我测试像 [1, 30.28671077, 43.89499752] 之类的训练示例时,使用这些值应该给出值 0 作为输出,我得到 0.576,这对我来说毫无意义。如果我用输入 [1, 10, 10] 测试假设函数,我会得到 0.515,这又是没有意义的。这些值应对应于较低的概率。这让我很困惑。

import numpy as np
import sig as s

def batchlogreg(X, y):
   max_iterations = 800
   alpha = 0.00001

   (m,n) = np.shape(X)

   X = np.insert(X, 0, 1, 1) 
   theta = np.array([0] * (n+1), 'float')
   ll = np.array([0] * max_iterations, 'float')

   for i in range(max_iterations):
       hx = s.sigmoid(np.dot(X, theta))
       d = y - hx
       theta = theta + alpha*np.dot(np.transpose(X),d)
       ll[i] = sum(y * np.log(hx) + (1-y) * np.log(1- hx))

   return (theta, ll)

【问题讨论】:

  • 链接失效。此外,您应该在问题中真正发布相关文本,而不是仅仅提供链接。
  • 抱歉这里是一个工作版本cs229.stanford.edu/notes/cs229-notes1.ps
  • 你尝试过更大的学习率(alpha)吗?它通常不会那么小,因此您可能没有正确训练模型。试试0.1, 0.001等等。

标签: python machine-learning


【解决方案1】:

注意sigmoid函数有:

sig(0) = 0.5
sig(x > 0) > 0.5
sig(x < 0) < 0.5

由于您得到了高于0.5 的所有概率,这表明您永远不会将X * theta 设为负数,或者您会这样做,但您的学习率太小而无足轻重。

for i in range(max_iterations):
    hx = s.sigmoid(np.dot(X, theta)) # this will probably be > 0.5 initially
    d = y - hx # then this will be "very" negative when y is 0
    theta = theta + alpha*np.dot(np.transpose(X),d) # (1)
    ll[i] = sum(y * np.log(hx) + (1-y) * np.log(1- hx))

问题很可能出在(1)。点积将是非常负面的,但您的alpha 非常小并且会抵消它的影响。所以theta 永远不会减少到足以正确处理0 的正确分类标签。

由于相同的原因,正实例只能勉强正确分类:您的算法在您的迭代次数和学习率下没有发现合理的假设。

可能的解决方案:增加alpha和/或迭代次数,或者使用momentum

【讨论】:

  • 所以我实际上花了很多时间来研究 alpha 值和迭代次数。基本上在 alpha = 0.1 时,我获得了对数似然函数的所有 nan 值。在 alpha = 0.01 时,我得到一些 nan 值,否则不会收敛到最大值。在 alpha = 0.001 时几乎相同。在 alpha = 0.0001 时,似乎收敛到 -784 和 -478,并且还产生了一些 nan 值。但仍然不稳定。将 alpha 降低到显示的值最终不会产生 nan 值并稳定收敛到 -62。
  • 而且为更大的 alpha 产生的 theta 给我的逻辑函数输出非常糟糕。一切都是 0。虽然值停留在 0.5 和 0.77 之间,但当前使用的 alpha 最终给了我一个稳定的输出。
  • 您可以尝试为您的数组使用 float64 吗?另外,在它起作用之前不要接受它。
  • 不幸的是,我将数组值更改为“float64”并没有太大变化。我将区间 0.5 - 0.77 中的值映射到 0 - 10,对于假设 > 0.58,它应该给出 1 的标签。它似乎很好地预测了所有的例子。否则,我真的不知道还有什么问题。方程式似乎都是正确的。我已经尝试更改 alpha 和迭代次数 --- 这是我找到的最好的结果。
【解决方案2】:

听起来您可能会将概率与分配混淆。

概率将是介于 0.0 和 1.0 之间的实数。标签将是一个整数(0 或 1)。逻辑回归是一个模型,它提供给定输入特征的标签为 1 的概率。要获得标签值,您需要使用该概率做出决定。一个简单的决策规则是,如果概率小于 0.5,则标签为 0,如果概率大于或等于 0.5,则标签为 1。

因此,对于您给出的示例,决策都将为 1(这意味着模型对于第一个应该为 0 的示例是错误的)。

【讨论】:

  • 是的,我知道假设将输出学生在给定特定输入向量的情况下获得录取的概率。尽管做出以下决定是否合理,例如概率是否小于 0.6,而不是对应于 0。否则它对应于 1。那么这在很大程度上是合理的。但不是那么直观,因为您会期望诸如 [1, 95, 96] 之类的高分给出 0.9 的概率,而不是我得到的 0.77。
  • 更具体地说,我获得的任意输入的概率范围在 0.5 到 0.77 之间。这是正常的还是奇怪的事情?
  • 嗯,好的。所以,简短的回答是“我不知道”。长答案是,您的概率不必经过很好的校准,决策规则仍然是好的。只要高分考试(通常)导致更高的录取概率,您仍然可以在两件事之间做出决定,即使差异不是那么大。
【解决方案3】:

我也遇到了同样的问题,找到了原因。

首先对 X 进行归一化或设置一个可缩放的截距,例如 50。

否则成本函数的轮廓太“窄”。大的 alpha 会使其过冲,而小的 alpha 则无法进行。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 2021-01-23
    • 2014-03-21
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 2015-05-03
    相关资源
    最近更新 更多