如何在python中添加L1规范化?

时间:2018-02-14 08:34:49

标签: python machine-learning logistic-regression regularized

我正在尝试从头开始编写逻辑回归。在我的代码中,我认为我的成本导数是我的正则化,但我的任务是添加L1norm正则化。你如何在python中添加它?是否应该在我定义成本衍生物的地方添加?我们赞赏任何正确方向的帮助。

def Sigmoid(z):
    return 1/(1 + np.exp(-z))

def Hypothesis(theta, X):   
    return Sigmoid(X @ theta)

def Cost_Function(X,Y,theta,m):
    hi = Hypothesis(theta, X)
    _y = Y.reshape(-1, 1)
    J = 1/float(m) * np.sum(-_y * np.log(hi) - (1-_y) * np.log(1-hi))
    return J

def Cost_Function_Derivative(X,Y,theta,m,alpha):
    hi = Hypothesis(theta,X)
    _y = Y.reshape(-1, 1)
    J = alpha/float(m) * X.T @ (hi - _y)
    return J

def Gradient_Descent(X,Y,theta,m,alpha):
    new_theta = theta - Cost_Function_Derivative(X,Y,theta,m,alpha)
    return new_theta

def Accuracy(theta):
    correct = 0
    length = len(X_test)
    prediction = (Hypothesis(theta, X_test) > 0.5) 
    _y = Y_test.reshape(-1, 1)
    correct = prediction == _y
    my_accuracy = (np.sum(correct) / length)*100
    print ('LR Accuracy: ', my_accuracy, "%")

def Logistic_Regression(X,Y,alpha,theta,num_iters):
    m = len(Y)
    for x in range(num_iters):
        new_theta = Gradient_Descent(X,Y,theta,m,alpha)
        theta = new_theta
        if x % 100 == 0:
            print #('theta: ', theta)    
            print #('cost: ', Cost_Function(X,Y,theta,m))
    Accuracy(theta)
ep = .012 
initial_theta = np.random.rand(X_train.shape[1],1) * 2 * ep - ep
alpha = 0.5
iterations = 10000
Logistic_Regression(X_train,Y_train,alpha,initial_theta,iterations)

1 个答案:

答案 0 :(得分:2)

正则化为成本函数添加了一个术语,以便在最小化成本和最小化模型参数之间进行折衷,以减少过度拟合。您可以通过为正则化术语添加标量e来控制您想要达到的妥协程度。

所以只需将theta的L1范数添加到原始成本函数中:

J = J + e * np.sum(abs(theta))

由于此术语已添加到成本函数中,因此在计算成本函数的梯度时应考虑该术语。

这很简单,因为和的导数是导数的总和。所以现在只需要弄清楚术语sum(abs(theta))的衍生物是什么。由于它是一个线性项,因此导数是常数。如果theta> = 0,则= 1,如果θ<0,则为-1。 0(注意在0处存在数学不确定性,但我们并不关心它)。

所以在函数Cost_Function_Derivative中我们添加:

J = J + alpha * e * (theta >= 0).astype(float)