机器学习实战︱基于逻辑回归算法进行乳腺癌的识别

01
数据集加载
代码清单14-1所示为数据集的代码 , 并将数据集按照4:1的比例划分为训练集和测试集 。
代码清单14-1数据集加载函数
defloadTrainData:
cancer=load_breast_cancer#加载乳腺癌数据
X=cancer.data#加载乳腺癌判别特征
y=cancer.target#两个TAG , y=0时为阴性 , y=1时为阳性
#将数据集划分为训练集和测试集 , 测试集占比为0.2
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)
X_train=X_train.T
X_test=X_test.T
returnX_train,X_test,y_train,y_test
02
Logistic模块
该模块包含两大内容 , 正向传播计算预测结果以及控制整个参数优化过程从而实现对参数值的更新 。 首先是代码清单14-2中sigmoid函数的实现 。
代码清单14-2sigmoid函数
defsigmoid(inx):
fromnumpyimportexp
return1.0/(1.0+exp(-inx))
如代码清单14-3所示 , 本文通过随机高斯函数直接初始化w , 参数b直接初始化为0 。
代码清单14-3参数初始化函数
#初始化参数
definitialize_para(dim):
mu=0
sigma=0.1
np.random.seed(0)
w=np.random.normal(mu,sigma,dim)
w=np.reshape(w,(dim,1))
b=0
returnw,b
如代码清单14-4所示 , 前向传播过程以参数w和b、训练集X和标签Y作为函数输入 , 计算最终预测结果A , 以及损失函数对w和b的梯度值 , 返回梯度值 。 需要注意的是在计算过程中log函数可能会遇到输入为0的情况 , 在这种情况下程序会抛出异常 , 因此为了防止类似的数值运算错误 , 可以设置一个非0的非常的小的值 , 即eps , 当要使用log运算时 , 直接在后面加上该值 。
代码清单14-4前向传播函数
#前向传播
defpropagate(w,b,X,Y):
#eps防止log运算遇到0
eps=1e-5
m=X.shape[1]
#计算初步运算结果
A=sigmoid(np.dot(w.T,X)+b)
#计算损失函数值大小
cost=-1/m*np.sum(np.multiply(Y,np.log(A+eps))+np.multiply(1-Y,np.log(1-A+eps)))
#计算梯度值
dw=1/m*np.dot(X,(A-Y).T)
db=1/m*np.sum(A-Y)
cost=np.squeeze(cost)
grads={"dw":dw,
"db":db}
#返回损失函数大小以及反向传播的梯度值
returngrads,cost,A
如代码清单14-5所示 , 该函数是非常核心的一个函数 , 实现了在训练集上不断迭代对参数进行优化的过程 , 函数以参数值w和b、训练集输入X , 标签Y , 以及与参数更新相关的学习迭代次数、学习率作为输入 , 为了更好的观察在参数优化过程中到底发生了什么 , 没经过100次迭代就计算在目前模型在训练集上的表现如何 , 以及损失函数是如何变化的 。 最终等待迭代完成 , 将模型的参数以及损失函数的变化返回 。
代码清单14-5参数优化函数
#num_iterations梯度下降次数
#learning_rate学习率
defoptimize(w,b,X,Y,num_iterations,learning_rate):
costs=[]#记录损失函数值
#循环进行梯度下降
foriinrange(num_iterations):
#print(i)
grads,cost,pre_Y=propagate(w,b,X,Y)
dw=grads["dw"]
db=grads["db"]
w=w-learning_rate*dw
b=b-learning_rate*db
#每100次循环记录一次损失函数大小并打印
ifi%100==0:
costs.append(cost)
ifi%100==0:
pre_Y[pre_Y>=0.5]=1
pre_Y[pre_Y<0.5]=0
pre_Y=pre_Y.astype(np.int)
acc=1-np.sum(pre_Y^Y)/len(Y)
print("Iteration:{}Loss={},Acc={}".format(i,cost,acc))
#最终参数值
params={"w":w,
"b":b}
returnparams,costs
下面是训练完成后 , 若要使用该模型对其他输入进行预测的predict函数 , 该函数以参数w和b , 以及输入数据X作为输入 , 返回预测结果 , 如代码清单14-6所示 。
代码清单14-6预测结果函数
defpredict(w,b,X):
- 36氪首发|烹饪机器人公司「智谷天厨」获数千万元天使轮融资,羲融善道独家投资
- 网友热议|母亲回应3个孩子2个上清华:只能教孩子做人诚实守信 学习都靠自己努力
- 机器人|华为机器人新专利上线 网友:先有华为后有天开上鸿蒙如升仙
- 金字塔是时间机器?用途是拉伸和压缩时间,或能使生命延长和衰老
- 第六届全省中小学生互联网+机器人设计活动决赛顺利结束
- “文旅机器人小i”上岗
- 文旅机器人“小i”来了
- 如何评价扫地机器人离家出走一事?
- 李飞飞团队将ViT用在机器人身上,规划推理最高提速512倍
- 格力电器|不要再说Python难了,按照这个学习路线,四周速成Python
