使用SGD实现带L2正则化的逻辑回归:不使用sklearn

import math
from math import log10
import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn import linear_model
from sklearn.model_selection import train_test_split
def sigmoid(w,x,b):
    return(1/(1+math.exp(-(np.dot(x,w)+b))))
def l2_regularizer(w):
    l2_reg_sum=0.0
    for i in range(len(w)):
        l2_reg_sum+=(w[i]**2)
    return l2_reg_sum
def compute_log_loss(X_train,y_train,w,b,alpha):
    loss=0.0
    X_train=np.clip(X_train, alpha, 1-alpha)
    for i in range(N):
        loss+= ((y_train[i]*log10(sigmoid(w,X_train[i],b)))+((1-y_train[i])*log10(1-sigmoid(w,X_train[i],b))))
        #loss =-1*np.mean(actual*np.log(predicted)+(1-actual))*np.log(1-predicted)
        #loss=-1*np.mean(y_train*np.log(sigmoid(w,X_proba,b))+(1-y_train))*np.log(1-sigmoid(w,X_proba,b))
    loss=((-1/N)*loss)
    return loss
X, y = make_classification(n_samples=50000, n_features=15, n_informative=10, n_redundant=5,
                       n_classes=2, weights=[0.7], class_sep=0.7, random_state=15)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=15)
w = np.zeros_like(X_train[0])
b = 0
eta0  = 0.0001
alpha = 0.0001
N = len(X_train)
n_epochs = 3
W=[]
B=[]
W.append(w)
B.append(b)
loss_list=[]
log_loss_train=0.0
log_loss_train=compute_log_loss(X_train,y_train,w,b,alpha)
loss_list.append(log_loss_train)
print(loss_list)
for epoch in range(1,n_epochs):
    grad_loss=0.0
    grad_intercept=0.0
    for i in range(N):
        first_term_grad_loss=((1-((alpha*eta0)/N))*W[epoch-1])
        second_term_grad_loss=((eta0*X_train[i])*(y_train[i]-sigmoid(W[epoch-1],X_train[i],B[epoch-1])))
        grad_loss+=(first_term_grad_loss+second_term_grad_loss)
        first_term_grad_intercept=B[epoch-1]
        second_term_grad_intercept=(eta0*(y_train[i]-sigmoid(W[epoch-1],X_train[i],B[epoch-1])))
        grad_intercept+=(first_term_grad_intercept+second_term_grad_intercept)
    B.append(grad_intercept)
    W.append(grad_loss)
    log_loss_train=0.0
    log_loss_train=compute_log_loss(X_train,y_train,W[epoch],B[epoch],alpha)
    loss_list.append(log_loss_train)
    print(loss_list)

我在计算Sigmoid时遇到了数学范围错误,我无法理解如何处理这个问题。Sigmoid计算抛出错误可能是由于某些大数计算引起的。

文件 “C:\Users\SUMO.spyder-py3-dev\temp.py”, 第12行,在sigmoid函数中 return(1/(1+math.exp(-(np.dot(x,w)+b)))) 引发了溢出错误:数学范围错误。


回答:

首先,你需要确定你的假设是正的还是负的。然后分别处理正假设和负假设的问题,如下所示。

def sigmoid(w,x,b):
    hypothesis = np.dot(x,w)+b
    if hypothesis < 0:
        return (1 - 1/(1+math.exp(hypothesis)))
    return (1/(1+math.exp(-hypothesis)))

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注