为什么Python中的逻辑回归实现不正确?

为什么Python中的逻辑回归实现不正确?,python,machine-learning,logistic-regression,Python,Machine Learning,Logistic Regression,我已经用Python实现了逻辑回归。我认为代码中有一些bug。我无法获得测试集的正确精度。 代码如下: from __future__ import division import numpy as np from math import * import os, sys class LogisticRegressionModel: def __init__(self, n): self.n = n self.theta = np.zeros((n+

我已经用Python实现了逻辑回归。我认为代码中有一些bug。我无法获得测试集的正确精度。 代码如下:

from __future__ import division
import numpy as np
from math import *
import os, sys


class LogisticRegressionModel:

    def __init__(self, n):
        self.n = n
        self.theta = np.zeros((n+1, 1))
        print(self.theta)


    def SGD(self, trainingSet, epochs, minibatchsize, eta):
        m = len(trainingSet)
        for epoch in range(epochs):
            derSum = np.zeros(self.theta.shape)
            for xi, yi in trainingSet:
                xi = np.concatenate(([[1]], xi), axis=0)
                #print(xi)
                hi = self.sigmoid(np.dot(np.transpose(self.theta), xi))
                derSum = derSum + (hi-yi)*xi

            self.theta = self.theta - eta/m*derSum

            print(self.cost(trainingSet))


    def cost(self, dataset):
        totCost=0
        for xi, yi in dataset:
            xi = np.concatenate(([[1]], xi), axis=0)
            hi = self.sigmoid(np.dot(np.transpose(self.theta), xi))
            totCost += -1*(yi*log(hi)+(1-yi)*log(1-hi))

        return totCost/len(dataset)



    def sigmoid(self, z):
        return 1.0/(1.0+np.exp(-1*z))


    def evaluate(self, testSet):
        mtest = len(testSet)
        count=0
        for xi, yi in testSet:
            xi = np.concatenate(([[1]], xi), axis=0)
            hi = self.sigmoid(np.dot(self.theta.transpose(), xi))
            #print(str(hi[0, 0])+" "+str(yi))
            if hi>=0.5:
                hi=1
            else:
                hi=0
            if yi==hi:
                count+=1
        print(count/mtest*100)

LR是一个两类分类器。数据集有一个线性决策边界,我使用倍频程对其进行了测试,准确率超过95%。但上述实施方案的成功率约为60%。我还试着改变学习速度和其他事情。但那没用

假设您的训练数据是一个包含像
([feature1,…,featuren],label)
这样的配对的列表,下面的代码对我来说似乎很好。这是对您的代码的修改,只是我在适当的地方以数组的形式放置了一些东西:

from __future__ import division
import numpy as np

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

def log_loss(y,ypred):
    return -(y*np.log(ypred) + (1-y)*np.log(1-ypred)).mean()

class LogisticRegressionModel:

    def __init__(self, n):
        self.n = n
        self.theta = np.zeros((1,n+1))
        print(self.theta)


    def SGD(self, trainingSet, epochs, minibatchsize, eta):
        m = len(trainingSet)
        X = np.ones((self.n+1,m))
        Y = np.zeros((1,m))

        for i, (xi, yi) in enumerate(trainingSet):
            X[1:,i] = xi
            Y[:,i] = yi

        for epoch in xrange(epochs):
            H = sigmoid(self.theta.dot(X))
            derSum = (H-Y).dot(X.T)

            self.theta -= eta * derSum/m

            print(log_loss(Y,H))


    def evaluate(self, testSet):
        mtest = len(testSet)
        X = np.ones((self.n+1,mtest))
        Y = np.zeros((1,mtest))
        for i, (xi, yi) in enumerate(testSet):
            X[1:,i] = xi
            Y[:,i] = yi

        H = sigmoid(self.theta.dot(X))
        H = (H >= 0.5)
        print((H == Y).mean() * 100)

我不确定你的代码中有什么问题,因为这应该与你的代码相同(除了重复加载数据的地方)。

在你使用的
sigmoid
方法中
math.exp
。您是否100%确定您不是有意使用
numpy.exp
?与
日志相同
。顺便说一句:
sigmoid
不依赖于
self
,因此它应该是
staticmethod
或该类之外的简单函数。。。除此之外,我想我帮不了你。是的,因为它是一个二进制分类器,输出假设是一个实数。不管怎样,我在问题中对它进行了修改,还尝试了np.exp,但仍然没有;t work..我不确定这是否是您要查找的,但当我遇到类似问题时,结果是我将大值传递给
sigmoid
函数。任何大于
36
的Sigmoid值,我认为都是
1