我正在python中用梯度下降从头开始实现逻辑回归。我正在研究乳腺癌数据集。在计算成本时,我只得到了nan值。我试图标准化我的数据,并试图降低我的alpha值,但没有效果。尽管如此,我得到了95.8%的准确率。有点不对劲。下面是我的一些代码:
def hypothesis(b,X):
z= np.dot(X,b)
#print(z)
return sigmoid(z)
def sigmoid(z):
return 1/(1+np.exp(-1*z))
def FindCost(h,y):
r = y.shape[0]
cost = np.sum(y*np.log(h)+(1-y)*np.log(1-h))/r
#print(cost)
return cost*-1
def gradient_descent(X,y,alpha,epoch):
r = X.shape[0]
c = X.shape[1]
theta = np.ones((c,1))
min_cost=None
min_theta=[]
Cost_list=[]
for i in range(epoch):
h = hypothesis(theta,X)
grad = np.dot(X.T,(h-y))
theta = theta - alpha*grad
cost = FindCost(h,y)
Cost_list.append(cost)
if min_cost is None or min_cost>cost:
min_cost=cost
min_theta=list(theta)
return min_theta,Cost_list
def calAccuracy(theta,X,y):
h = hypothesis(theta,X)
correct=0
for i in range(y.shape[0]):
if h[i]>=0.5:
if y[i]==1: correct+=1
print("predicted: ",1,end='\t\t')
elif h[i]<0.5:
if y[i]==0: correct+=1
print("predicted: ",0,end='\t\t')
print("actual: ",y[i])
return correct*100/y.shape[0]
alpha = 0.01
epoch = 1000
theta,cost = gradient_descent(x_train,y_train,alpha,epoch)
accuracy = calAccuracy(theta,x_test,y_test)
print(f"the accuracy of the model: {accuracy} %")
Output:
the accuracy of the model: 95.8041958041958 %
数据集的标准化:
for i in range(x_train.shape[1]):
x_train[i] = (x_train[i]-np.mean(x_train[i]))/np.std(x_train[i])
x_test[i] = (x_test[i]-np.mean(x_test[i]))/np.std(x_test[i])
数据集看起来像这样:图像
在标准化数据集后,我将一列(第一列)连接到我的x_序列和x_测试。
x train data:
[[ 1.00000000e+00 -6.51198873e-01 -5.29762615e-01 4.19236602e-02
1.91948751e+00 -7.80449683e-01]
[ 1.00000000e+00 -6.85821055e-01 -4.00751146e-01 -3.29500919e-02
1.92747771e+00 -8.07955419e-01]
[ 1.00000000e+00 -6.76114725e-01 -4.04963490e-01 -6.16161982e-02
1.93556890e+00 -7.92874483e-01]
y train data:
[[1.]
[1.]
[1.]
x test data:
[[ 1.00000000e+00 -5.63066669e-01 -5.36144255e-01 -2.71074811e-01
1.98575469e+00 -6.15468953e-01]
[ 1.00000000e+00 -5.57037602e-01 -5.57366708e-01 -2.60414280e-01
1.98474749e+00 -6.09928901e-01]
[ 1.00000000e+00 -5.56192661e-01 -5.57892986e-01 -2.62657675e-01
1.98504143e+00 -6.08298112e-01]
y test data:
[[0.]
[1.]
[0.]
我在这里做错了什么?如何防止nan值出现?另外,如果我的成本函数给了我nan值,我怎么能得到这么高的精度呢?
另外,我最初在数据集中没有空值,并将数据集转换为numpy数组。
所以问题是:
for i in range(x_train.shape[1]):
x_train[i] = (x_train[i]-np.mean(x_train[i]))/np.std(x_train[i])
x_test[i] = (x_test[i]-np.mean(x_test[i]))/np.std(x_test[i])
未按功能/列进行标准化。您应该改为使用此选项:
for i in range(x_train.shape[1]):
x_train[:,i] = (x_train[:,i]-np.mean(x_train,axis=1))/np.std(x_train,axis=1)
x_test[:,i] = (x_test[:,i]-np.mean(x_test,axis=1))/np.std(x_test,axis=1)
这将给出准确的成本值:95.8041958041958%
Logistic回归是一种回归模型,其中响应变量(因变量)具有分类值,例如True/False或0/1。 它实际上基于将其与预测变量相关联的数学方程来测量二元响应的概率作为响应变量的值。 逻辑回归的一般数学方程是 - y = 1/(1+e^-(a+b1x1+b2x2+b3x3+...)) 以下是所用参数的说明 - y是响应变量。 x是预测变量。 a和b是数值常数的系数。 用于创建回归模型的函数是
逻辑回归是一个分类算法,它可以处理二元分类以及多元分类。虽然它名字里面有“回归”两个字,却不是一个回归算法。那为什么有“回归”这个误导性的词呢?个人认为,虽然逻辑回归是分类模型,但是它的原理里面却残留着回归模型的影子,本文对逻辑回归原理做一个总结。 1. 从线性回归到逻辑回归 我们知道,线性回归的模型是求出输出特征向量Y和输入样本矩阵X之间的线性关系系数θ,满足Y=Xθ。此时我们的Y是连续的,所以
Logistic 回归 概述 Logistic 回归 或者叫逻辑回归 虽然名字有回归,但是它是用来做分类的。其主要思想是: 根据现有数据对分类边界线(Decision Boundary)建立回归公式,以此进行分类。 须知概念 Sigmoid 函数 回归 概念 假设现在有一些数据点,我们用一条直线对这些点进行拟合(这条直线称为最佳拟合直线),这个拟合的过程就叫做回归。进而可以得到对这些点的拟合直线方
主要内容:什么是分类问题?,Logistic回归算法我们知道有监督学习分为“回归问题”和“分类问题”,前面我们已经认识了什么是“回归问题”,从本节开始我们将讲解“分类问题”的相关算法。在介绍具体的算法前,我们先聊聊到底什么是分类问题。 什么是分类问题? 其实想要理解“分类”问题非常的简单,我们不妨拿最简单的“垃圾分类处理”的过程来认识一下这个词。现在考虑以下场景: 小明拎着两个垃圾袋出门倒垃圾,等走到垃圾回收站的时候,小明发现摆放着两个垃圾桶,上面
在scikit-learn中,与逻辑回归有关的主要是这3个类。LogisticRegression, LogisticRegressionCV 和logistic_regression_path。其中LogisticRegression和LogisticRegressionCV的主要区别是LogisticRegressionCV使用了交叉验证来选择正则化系数C。而LogisticRegre
Logistic回归模型 二项Logistic回归模型(binomial logistic regression model)是一种分类模型,由条件概率分布$$P(Y|X)$$表示,形式为参数化的logistic分布。 一、模型定义 模型是如下的条件概率分布: $$ P(Y=1|X)=\dfrac{e{w\cdot x+b}}{1+e{w\cdot x+b}} $$ $$ P(Y=0|X)=1-P