为什么Python中的逻辑回归实现不正确?
我已经用Python实现了逻辑回归。我认为代码中有一些bug。我无法获得测试集的正确精度。 代码如下:为什么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+
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
。