使用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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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