【问题标题】:Computing SGD classifier with logloss & L2 regularization without using sklearn and I am not able to compute loss & getting error in loss calculation在不使用 sklearn 的情况下使用 logloss 和 L2 正则化计算 SGD 分类器,我无法计算损失并在损失计算中出错
【发布时间】:2021-05-19 09:36:47
【问题描述】:
def logloss(y_true,y_pred):                                     # compute log-loss                      
    log_loss = (-y_true * math.log(y_pred, 10) - (1 - y_true) * math.log(1 - y_pred,10)).mean()
    return log_loss
def grader_logloss(true,pred):                 # comparing log-loss using assert
    loss = logloss(true,pred)
    assert(loss == 0.07644900402910389)
    return True
true = [1,1,0,1,0]
pred = [0.9,0.8,0.1,0.8,0.2]
grader_logloss(true,pred)

我遇到的错误

 ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-110-edd7da954047> in <module>
          5 true = [1,1,0,1,0]
          6 pred = [0.9,0.8,0.1,0.8,0.2]
    ----> 7 grader_logloss(true,pred)

    <ipython-input-110-edd7da954047> in grader_logloss(true, pred)
          1 def grader_logloss(true,pred):
    ----> 2     loss = logloss(true,pred)
          3     assert(loss == 0.07644900402910389)
          4     return True
          5 true = [1,1,0,1,0]

    <ipython-input-109-b96b3bba92ed> in logloss(y_true, y_pred)
          2     '''In this function, we will compute log loss '''
          3     n = len(y_true)
    ----> 4     log_loss = (-y_true * math.log(y_pred, 10) - (1 - y_true) * math.log(1 - y_pred,10)).mean()
          5     return log_loss

    TypeError: bad operand type for unary -: 'list'

我无法获取操作数类型。我已经搜索过,但无法清楚地看到它。

预期结果是

True

计算梯度

def gradient_dw(x,y,w,b,alpha,N):
    '''In this function, we will compute the gardient w.r.to w '''
    dw = x*(y - sigmoid(np.dot(w.T,x) + b)) - ((alpha*x)/N)
    return dw

计算梯度并进行比较

def grader_dw(x,y,w,b,alpha,N):
    grad_dw=gradient_dw(x,y,w,b,alpha,N)
    assert(grad_dw==2.613689585)
    return True
grad_x=np.array([-2.07864835,  3.31604252, -0.79104357, -3.87045546, -1.14783286,
       -2.81434437, -0.86771071, -0.04073287,  0.84827878,  1.99451725,
        3.67152472,  0.01451875,  2.01062888,  0.07373904, -5.54586092])
grad_y=0
grad_w,grad_b = initialize_weights(grad_x)
alpha=0.0001
N=len(X_train)
grader_dw(grad_x,grad_y,grad_w,grad_b,alpha,N)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-152-b22fd39ec68a> in <module>
     10 alpha=0.0001
     11 N=len(X_train)
---> 12 grader_dw(grad_x,grad_y,grad_w,grad_b,alpha,N)

<ipython-input-152-b22fd39ec68a> in grader_dw(x, y, w, b, alpha, N)
      1 def grader_dw(x,y,w,b,alpha,N):
      2     grad_dw=gradient_dw(x,y,w,b,alpha,N)
----> 3     assert(grad_dw==2.613689585)
      4     return True
      5 grad_x=np.array([-2.07864835,  3.31604252, -0.79104357, -3.87045546, -1.14783286,

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我不知道我的梯度评估在哪里不正确,以及为什么即使我尝试了 a.any() 或 a.all(),assert 函数也会失败

【问题讨论】:

  • 尝试使用 numpy 数组而不是列表。错误提到您不能使用“-”来否定列表
  • 感谢您的帮助。我已经编辑了代码以获得进一步的帮助。我想知道我的梯度评估是否正确。还有我在断言函数中遇到的错误,即使我尝试过 a.any(), a.all()

标签: python logistic-regression


【解决方案1】:

使用numpy.array 存储您的truepred,并稍微调整您的代码 使用numpy 中定义的操作。由于python中普通的list不支持-*+等逐元素操作,所以没有mean方法。

import numpy as np
def logloss(y_true,y_pred):                                     # compute log-loss                      
    log_loss = (-y_true * np.log10(y_pred) - (1 - y_true) * np.log10(1 - y_pred)).mean()
    return log_loss
def grader_logloss(true,pred):                 # comparing log-loss using assert
    loss = logloss(true,pred)
    assert(loss == 0.07644900402910389)
    return True
true = np.array([1,1,0,1,0])
pred = np.array([0.9,0.8,0.1,0.8,0.2])
grader_logloss(true,pred)

新问题的更新: 我假设你的dw 是一个标量,因为你有grad_dw==2.613689585。然后,在您的 gradient_dw 函数中,更改这一行:

dw = x*(y - sigmoid(np.dot(w.T,x) + b)) - ((alpha*x)/N)

到这一行

dw = (x*(y - sigmoid(np.dot(w.T,x) + b)) - ((alpha*x))).sum() / N

此外,您应该使用assert grad_dw==2.613689585 而不是assert (grad_dw==2.613689585)

【讨论】:

  • 感谢您的帮助。我再次编辑了这个问题,你能帮我解决我收到的错误代码的后面部分吗?阿祖乌
  • @maddy 编辑了您问题的答案。
  • 感谢您的回复,但使用您的“dw”代码给我错误:AssertionError - @Azuuu
  • 由于不了解函数initialize_weightsdetail,所以无法查看返回的实际值。我建议你检查logloss的逻辑。祝你好运! @maddy
  • 好的,谢谢,我纠正了我的错误。再次感谢您的帮助@Azuuu
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 2018-07-06
  • 1970-01-01
  • 2018-03-20
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多