机器学习——对数几率回归模型及python代码实现

《机器学习:公式推导与代码实践》鲁伟著读书笔记。上一章介绍了线性回归的数学推导过程以及python实现,可以知道线性回归模型就是对数据进行线性拟合或者说是回归,然后采用训练好的模型对未来数据进行预测。那能否运用线性模型对一些数据进行分类呢,这就需要运用对数几率回归模型(logistics regression,LR)这种线性分类模型。

对数几率回归的数学原理

在对数几率回归中,我们需要将线性回归模型的预测值转化为0/1值,而不是去逼近真实标签 y y y。而取值范围为(0,1),单调可微的Sigmoid函数便是对数几率回归的不二之选。Sigmoid函数的表达式为: y = 1 1 + e − z y=\frac{1}{1+e^{-z}} y=1+ez1。特别的是,Sigmoid函数的导数是可以由其自身来表达的: f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f^{\prime}(x)=f(x)(1-f(x)) f(x)=f(x)(1f(x))
我们知道了对数几率回归模型的重要函数了,下一步便将线性回归模型带入Sigmoid函数中,进行基本数学理论的推导。大致分为以下几步:

  1. 定义线性回归模型
    我们采用上一节所讲的线性回归模型,令线性回归模型的公式为: y = X ω + b y=X\omega+b y=Xω+b
  2. 通过Sigmoid激活函数
    y = 1 1 + e − ( X ω + b ) y=\frac{1}{1+e^{-(X\omega+b)}} y=1+e(Xω+b)1
  3. 化简后两边同时取对数 y + y e − ( X ω + b ) = 1 y+ye^{-(X\omega+b)}=1 y+ye(Xω+b)=1 1 − y y = e − ( X ω + b ) \frac{1-y}{y} =e^{-(X\omega+b)} y1y=e(Xω+b) l n 1 − y y = − ( X ω + b ) ln\frac{1-y}{y}=-(X\omega+b) lny1y=(Xω+b) l n y 1 − y = X ω + b ln\frac{y}{1-y}=X\omega+b ln1yy=Xω+b上式便为对数几率回归的模型公式,可以将 y y y视作样本 X X X作为正例的概率,将 1 − y 1-y 1y视作样本 X X X作为反例的概率。所以 y 1 − y \frac{y}{1-y} 1yy可以称之为“几率”,对几率求对数得到对数几率。
  4. 确定 ω \omega ω b b b的梯度
    y y y视为后验概率(先验分布:根据一般的经验认为随机变量应该满足的分布;后验分布:通过当前训练数据修正的随机变量的分布,比先验分布更符合当前数据)估计 p ( y = 1 ∣ x ) p(y=1|x) p(y=1x),则对数几率回归模型的公式可化简为:
    l n p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) = X ω + b ln\frac{p(y=1|x)}{p(y=0|x)}=X\omega+b lnp(y=0x)p(y=1x)=Xω+b
  5. 展开上式可得
    p ( y = 1 ∣ x ) = 1 1 + e − ( X ω + b ) = y ^ p(y=1|x)=\frac{1}{1+e^{-(X\omega+b)}}=\hat {y} p(y=1x)=1+e(Xω+b)1=y^ p ( y = 0 ∣ x ) = e − ( X ω + b ) 1 + e − ( X ω + b ) = 1 − y ^ p(y=0|x)=\frac{e^{-(X\omega+b)}}{1+e^{-(X\omega+b)}}=1-\hat {y} p(y=0x)=1+e(Xω+b)e(Xω+b)=1y^综合得: p ( y ∣ x ) = y ^ y + ( 1 − y ^ ) 1 − y p(y|x)=\hat {y}^{y}+(1-\hat {y})^{1-y} p(yx)=y^y+(1y^)1y两边取对数得: l n p ( y ∣ x ) = y l n y ^ + ( 1 − y ) l n ( 1 − y ^ ) lnp(y|x)=yln\hat {y}+(1-y)ln(1-\hat {y}) lnp(yx)=ylny^+(1y)ln(1y^)这就是最经典的交叉熵损失函数
  6. L = l n p ( y ∣ x ) L=lnp(y|x) L=lnp(yx)并对 ω \omega ω b b b求偏导
    L = y l n ( 1 1 + e − ( X ω + b ) ) + ( 1 − y ) l n ( e − ( X ω + b ) 1 + e − ( X ω + b ) ) L=yln(\frac{1}{1+e^{-(X\omega+b)}})+(1-y)ln(\frac{e^{-(X\omega+b)}}{1+e^{-(X\omega+b)}}) L=yln(1+e(Xω+b)1)+(1y)ln(1+e(Xω+b)e(Xω+b)) L = y ( − l n ( 1 + e − ( X ω + b ) ) ) + ( 1 − y ) [ − ( X ω + b ) − l n ( 1 + e − ( X ω + b ) ) ] L=y(-ln(1+e^{-(X\omega+b)}))+(1-y)[-(X\omega+b)-ln(1+e^{-(X\omega+b)})] L=y(ln(1+e(Xω+b)))+(1y)[(Xω+b)ln(1+e(Xω+b))] L = − y l n ( 1 + e − ( X ω + b ) ) − ( X ω + b ) − l n ( 1 + e − ( X ω + b ) ) + y ( X ω + b ) + y l n ( 1 + e − ( X ω + b ) ) L=-yln(1+e^{-(X\omega+b)})-(X\omega+b)-ln(1+e^{-(X\omega+b)})+y(X\omega+b)+yln(1+e^{-(X\omega+b)}) L=yln(1+e(Xω+b))(Xω+b)ln(1+e(Xω+b))+y(Xω+b)+yln(1+e(Xω+b)) L = − ( X ω + b ) − l n ( 1 + e − ( X ω + b ) ) + y ( X ω + b ) L=-(X\omega+b)-ln(1+e^{-(X\omega+b)})+y(X\omega+b) L=(Xω+b)ln(1+e(Xω+b))+y(Xω+b) ∂ L ∂ ω = ∂ − ( X ω + b ) ∂ ω + ∂ − l n ( 1 + e − ( X ω + b ) ) ∂ ω + ∂ y ( X ω + b ) ∂ ω \frac{\partial L}{\partial {\omega}}=\frac{\partial -(X\omega+b)}{\partial {\omega}}+\frac{\partial -ln(1+e^{-(X\omega+b)})}{\partial {\omega}}+\frac{\partial y(X\omega+b)}{\partial {\omega}} ωL=ω(Xω+b)+ωln(1+e(Xω+b))+ωy(Xω+b) ∂ L ∂ ω = − X T + X T 1 1 + e − ( X ω + b ) e − ( X ω + b ) + X T y \frac{\partial L}{\partial {\omega}}=-X^{T}+X^{T}\frac{1}{1+e^{-(X\omega+b)}}e^{-(X\omega+b)}+X^{T}y ωL=XT+XT1+e(Xω+b)1e(Xω+b)+XTy ∂ L ∂ ω = − X T + X T ( 1 − y ^ ) + X T y \frac{\partial L}{\partial {\omega}}=-X^{T}+X^{T}(1-\hat {y})+X^{T}y ωL=XT+XT(1y^)+XTy ∂ L ∂ ω = X T ( y − y ^ ) \frac{\partial L}{\partial {\omega}}=X^{T}(y-\hat {y}) ωL=XT(yy^) ∂ L ∂ b = ∂ − ( X ω + b ) ∂ b + ∂ − l n ( 1 + e − ( X ω + b ) ) ∂ b + ∂ y ( X ω + b ) ∂ b \frac{\partial L}{\partial {b}}=\frac{\partial -(X\omega+b)}{\partial {b}}+\frac{\partial -ln(1+e^{-(X\omega+b)})}{\partial {b}}+\frac{\partial y(X\omega+b)}{\partial {b}} bL=b(Xω+b)+bln(1+e(Xω+b))+by(Xω+b) ∂ L ∂ b = − 1 + 1 1 + e − ( X ω + b ) e − ( X ω + b ) + y \frac{\partial L}{\partial {b}}=-1+\frac{1}{1+e^{-(X\omega+b)}}e^{-(X\omega+b)}+y bL=1+1+e(Xω+b)1e(Xω+b)+y ∂ L ∂ b = − 1 + ( 1 − y ^ ) + y \frac{\partial L}{\partial {b}}=-1+(1-\hat {y})+y bL=1+(1y^)+y ∂ L ∂ b = y − y ^ \frac{\partial L}{\partial {b}}=y-\hat {y} bL=yy^
    综上所述,对数几率回归算法的参数更新公式为: ∂ L ∂ ω = X T ( y − y ^ ) \frac{\partial L}{\partial {\omega}}=X^{T}(y-\hat {y}) ωL=XT(yy^) ∂ L ∂ b = y − y ^ \frac{\partial L}{\partial {b}}=y-\hat {y} bL=yy^

对数几率回归的NumPy手撕代码

对数几率回归模型的算法思路是建立在线性回归算法之上的,具体过程如下。

初始化与定义Sigmoid函数

def init_params(train_dim):
	w = np.zeros((train_dim,1))
	b = 0
	return w,b
def sigmoid(x):
    z=1/(1+np.exp(-x))
    return z

定义对数几率回归模型主体

def logistics(X,y,w,b):
	num_train = X.shape[0]
	num_feature = X.shape[1]
	y_hat = sigmoid(np.dot(X,w) + b)
	loss = -1/num_train * np.sum(y*np.log(y_hat)+(1-y)*np.log(1-y_hat)) # 交叉熵损失
	dw = np.dot(X.T,(y_hat-y))/num_train
	db = np.sum((y_hat-y))/num_train
	loss = np.squeeze(loss)
	return y_hat, loss, dw, db	

定义训练过程

def train(X, y, learning_rate=0.01, epochs=10000):
	'''
	输入:
	X:输入数据
	y:输出标签
	learning_rate:学习率
	epochs:迭代次数
	输出:
	loss_his:每一代的误差
	params:参数字典
	grads:优化后的梯度
	'''
	loss_his = []
	w, b = init_params(X.shape[1])
	for i in range(epochs):
		y_hat, loss, dw, db = logistics(X, y, w, b)
		w += -learning_rate*dw
		b += -learning_rate*db
		loss_his.append(loss)
	params = {'w':w, 'b':b}
	grads = {'dw':dw,'db':db}
	return loss_his, params, grads

定义预测函数

def predict(X, params):
	'''
	输入:
	X:测试数据集
	params:模型训练参数
	输出:
	y_pre:预测值
	'''
	w = params['w']
	b = params['b']
	y_pre = sigmoid(np.dot(X, w) + b)
	for i in range(len(y_pre)):
		if y_pre[i]>0.5:
			y_pre[i]=1
		else:
			y_pre[i]=0
	return y_pre

下一个章节进一步讲解另外一种分类方法,线性判别分析法。

  • 11
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习-基于python实现对数几率回归模型对西瓜、鸢尾花进行分类源码+项目说明+实验报告 【项目介绍】 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 数据集特征分析 本次实验采用西瓜数据集以及鸢尾花数据集,西瓜数据集中包含17个样本,每个西瓜样本包含两维特征,包括西瓜的含糖量以及密度,以及对应的好瓜和坏瓜标签用0和1表示。鸢尾花数据集中包含150个样本,每个样本包含四维特征分别是花萼长、花萼宽、花瓣长、花瓣宽,以及对应的鸢尾花品种标签,三个鸢尾花品种分别用0、1、2表示。 由于西瓜数据集样本数量较少,因此这里采用将所有17个样本作为训练集,并再次利用17个样本作为测试集验证模型的准确度。将鸢尾花数据集以8:2的比例切分为训练集和测试集。最后使用sklearn自带的模型验证工具对本次实现对数几率回归模型进行精准度分析。 对于鸢尾花数据集的多分类问题,我采用的是OVR的方式,分别将鸢尾花的三个品种作为正例,将剩余两个品种作为负例训练三个分类器,再计算每个分类器的置信度,将置信度最高的分类器作为样本的预测结果。由此得到的多分类模型在鸢尾花数据集上的分类准确度最高可以达到100%。 文件目录 |-- IrisRegress.py 鸢尾花数据集分类测试 |-- LogisticModel.py 对数几率回归模型 |-- README.md |-- WaterRegress.py 西瓜数据集3.0分类测试 以上是西瓜数据集,西瓜数据集每个样本有含糖量以及密度两维特征,以及对应的好瓜和坏瓜标签。以及对应的数据分布情况,由上图可以可以看出西瓜数据集的含糖量以及密度分布并不是很规范,因此导致后面的对数几率回归分类模型的准确度最多只能达到70-80%, 通过参数的调试当w初始值设为0.05,迭代次数1000时模型的准确率达到71%,通过调试的过程可以发现准确率在60-70%左右。 这也是数据集的数据量少和样本分布规律并不明显导致的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值