300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > python逻辑回归模型建模步骤_从原理到代码 轻松深入逻辑回归模型!

python逻辑回归模型建模步骤_从原理到代码 轻松深入逻辑回归模型!

时间:2023-06-19 10:43:05

相关推荐

python逻辑回归模型建模步骤_从原理到代码 轻松深入逻辑回归模型!

defdJ(theta):#损失函数的导数return2* (theta - 2.5)

2. 通过 Matplotlib 绘制梯度下降迭代过程,具体代码如下:

theta = 0.0#初始点theta_history = [theta]eta = 0.1#步长epsilon = 1e-8#精度问题或者eta的设置无法使得导数为0whileTrue:gradient = dJ(theta) #求导数last_theta = theta #先记录下上一个theta的值theta = theta - eta * gradient #得到一个新的thetatheta_history.append(theta)if(abs(J(theta) - J(last_theta)) < epsilon):break#当两个theta值非常接近的时候,终止循环plt.plot(plot_x,J(plot_x),color='r')plt.plot(np.array(theta_history),J(np.array(theta_history)),color='b',marker='x')plt.show #一开始的时候导数比较大,因为斜率比较陡,后面慢慢平缓了print(len(theta_history)) #一共走了46步

我们来看下所绘制的图像是什么样子的,可以观察到 从初始值 0.0 开始不断的向下前进,一开始的幅度比较大,之后慢慢趋于缓和,逐渐接近导数为 0,一共走了 46 步。如图 4-7 所示:

图4-7 一元二次损失函数梯度下降过程示意图

3、学习率的分析

上一小节我们主要介绍了什么是梯度下降法,本小节主要介绍学习率对于梯度下降法的影响。

第一个例子,我们将 设置为 0.01(之前是 0.1 ),我们会观察到,步长减少之后,蓝色的标记更密集,说明步长减少之后,从起始点到导数为 0 的步数增加了。步数变为了 424 步,这样整个学习的速度就变慢了。效果如图 4-8 所示:

图4-8 学习率时,一元二次损失函数梯度下降过程示意图

第二个例子,我们将设置为 0.8,我们会观察到,代表蓝色的步长在损失函数之间跳跃了,但在跳跃过程中,损失函数的值依然在不断的变小。步数是 22 步,因此当学习率为 0.8 时,优化过程时间缩短,但是最终也找到了最优解。效果如图 4-9 所示:

图4-9 学习率 时,一元二次损失函数梯度下降过程示意图

第三个例子,我们将设置为1.1,看一下效果。这里注意,学习率本身是一个 0 到 1 的概率,因此 1.1 是一个错误的值,但为了展示梯度过大会出现的情况,我们暂且用这个值来画图示意。我们会发现程序会报这个错误 OverflowError: ( 34, 'Result too large' )。我们可以想象得到,这个步长跳跃的方向导致了损失函数的值越来越大,所以才报了“Result too large”效果,我们需要修改下求损失函数的程序:

defJ(theta):try:return(theta-2.5)**2-1except:returnfloat('inf')

i_iter= 0n_iters= 10whilei_iter < n_iters:gradient= dJ(theta)last_theta= thetatheta= theta - eta * gradienti_iter+= 1theta_history.append(theta)if(abs(J(theta) - J(last_theta)) < epsilon):break# 当两个theta值非常接近的时候,终止循环

另外我们需要增加一下循环的次数。

我们可以很明显的看到,我们损失函数在最下面,学习到的损失函数的值在不断的增大,也就是说模型不会找到最优解。如图 4-10 所示:

图4-10学习率时,一元二次损失函数不收敛

通过本小节的几个例子,简单讲解了梯度下降法,以及步长 的作用。从三个实验我们可以看出,学习率是一个需要认真调整的参数,过小会导致收敛过慢,而过大可能导致模型不收敛。

4、逻辑回归的损失函数

逻辑回归中的 Sigmoid 函数用来使值域在(0,1)之间,结合之前所讲的线性回归,我们所得到的完整的公式其实是:,其中的就是之前所介绍的多元线性回归。

现在的问题就比较简单明了了,对于给定的样本数据集 X,y,我们如何找到参数 theta ,来获得样本数据集 X 所对应分类输出 y(通过p的概率值)

需要求解上述这个问题,我们就需要先了解下逻辑回归中的损失函数,假设我们的预测值为:

损失函数假设为下面两种情况,y 表示真值;表示为预测值:

结合上述两个假设,我们来分析下,当 y 真值为 1 的时候,p 的概率值越小(越接近0),说明y的预测值偏向于0,损失函数 cost 就应该越大;当 y 真值为 0 的时候,如果这个时候 p 的概率值越大则同理得到损失函数 cost 也应该越大。在数学上我们想使用一个函数来表示这种现象,可以使用如下这个:

我们对上面这个函数做一定的解释,为了更直观的观察上述两个函数,我们通过 Python 中的 Numpy 以及 Matplotlib 库进行绘制。

我们先绘制下,代码如下:

importnumpy asnpimportmatplotlib.pyplot aspltdeflogp(x):y = -np.log(x)returny

plot_x = np.linspace(0.001, 1, 50) #取0.001避免除数为0

plot_y = logp(plot_x)plt.plot(plot_x, plot_y)plt.show

如下图4-9所示:

图4-9 损失函数if y=1

当p=0的时候,损失函数的值趋近于正无穷,根据说明y的预测值偏向于0,但实际上我们的 y 真值为 1 。当 p 达到 1 的时候,y 的真值和预测值相同,我们能够从图中观察到损失函数的值趋近于 0 代表没有任何损失。

我们再来绘制一下,代码如下:

importnumpy asnpimort matplotlib.pyplot aspltdeflogp2(x):y = -np.log(1-x)returnyplot_x = np.linspace(0, 0.99, 50) #取0.99避免除数为0plot_y = logp2(plot_x)plt.plot(plot_x, plot_y)plt.show

效果如图4-10所示:

图4-10 损失函数 if y=0

当p=1的时候,损失函数的值趋近于正无穷,根据 说明y的预测值 偏向于 1,但实际上我们的 y 真值为 0 。当 p 达到 0 的时候,y 的真值和预测值相同,我们能够从图中观察到损失函数的值趋近于 0 代表没有任何损失。

我们再对这两个函数稍微整理下,使之合成一个损失函数:

对这个函数稍微解释下,当 y=1 的时候,后面的式子就变为了 0 ,所以整个公式成为了;当 y=0 的时候前面的式子变为了 0,整个公式就变为了。

最后就变为了,对m个样本,求一组值使得损失函数最小。

公式如下:

(其中= sigmoi;其中代表了;恒等于1;为列向量)。

当公式变为上述的时候,对于我们来说,只需要求解一组使得损失函数最小就可以了,那么对于如此复杂的损失函数,我们一般使用的是梯度下降法进行求解。

5、Python实现逻辑回归

结合之前讲的理论,本小节开始动手实现一个逻辑回归算法。首先我们定义一个类,名字为 LogisticRegressionSelf ,其中初始化一些变量:维度、截距、theta 值,代码如下:

classLogisticRegressionSelf:def__init__(self):"""初始化Logistic regression模型"""self.coef_ = None#维度self.intercept_ = None#截距self._theta = None

接着我们实现下在损失函数中的 这个函数,我们之前在

Sigmoid函数那个小节已经实现过了,对于这个函数我们输入的值为多元线性回归中的(其中恒等于1),为了增加执行效率,我们建议使用向量化来处理,而尽量避免使用 for 循环,所以对于我们使用来代替,具体代码如下:

def_sigmoid(x):y = 1.0/ (1.0+ np.exp(-x))returny

接着我们来实现损失函数,

代码如下:

#计算损失函数defJ(theta,X_b,y):p_predcit = self._sigmoid(X_b.dot(theta))try:return-np.sum(y*np.log(p_predcit) + (1-y)*np.log(1-p_predcit)) / len(y)except:returnfloat('inf')

然后我们需要实现下损失函数的导数。具体求导过程读者可以自行百度,我们这边直接给出结论,对于损失函数cost,得到的导数值为:,其中,之前提过考虑计算性能尽量避免使用 for 循环实现累加,所以我们使用向量化计算。

完整代码如下:

import numpy as npclassLogisticRegressionSelf:

def__init__(self):"""初始化Logistic regression模型"""self.coef_= None #维度self.intercept_= None #截距self._theta = None

#sigmoid函数,私有化函数def_sigmoid(self,x):y = 1.0/ (1.0+ np.exp(-x))returny

deffit(self,X_train,y_train,eta=0.01,n_iters=1e4):assert X_train.shape[0] == y_train.shape[0], '训练数据集的长度需要和标签长度保持一致'

#计算损失函数defJ(theta,X_b,y):p_predcit = self._sigmoid(X_b.dot(theta))try:return-np.sum(y*np.log(p_predcit) + (1-y)*np.log(1-p_predcit)) / len(y)except:returnfloat('inf')

#求sigmoid梯度的导数defdJ(theta,X_b,y):x = self._sigmoid(X_b.dot(theta))returnX_b.T.dot(x-y)/len(X_b)

#模拟梯度下降defgradient_descent(X_b,y,initial_theta,eta,n_iters=1e4,epsilon=1e-8):theta = initial_thetai_iter = 0whilei_iter < n_iters:gradient = dJ(theta,X_b,y)last_theta = thetatheta = theta - eta * gradienti_iter += 1if(abs(J(theta,X_b,y) - J(last_theta,X_b,y)) < epsilon):breakreturntheta

X_b = np.hstack([np.ones((len(X_train),1)),X_train])initial_theta = np.zeros(X_b.shape[1]) #列向量self._theta = gradient_descent(X_b,y_train,initial_theta,eta,n_iters)self.intercept_= self._theta[0] #截距self.coef_= self._theta[1:] #维度returnself

defpredict_proba(self,X_predict):X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])returnself._sigmoid(X_b.dot(self._theta))

defpredict(self,X_predict):proba = self.predict_proba(X_predict)returnnp.array(proba > 0.5,dtype='int')

小结

以上内容主要讲述了线性回归模型和逻辑回归模型,并做了相应的实现。其中线性回归是逻辑回归的基础,而逻辑回归经常被当做神经网络的神经元,因此逻辑回归又是神经网络的基础。我们借逻辑回归模型介绍了机器学习中离不开的最优化方法,以及最常见的最优化方法——梯度下降。了解本节内容会对接下来第 5 章神经网络的学习有着很大的帮助。本文摘自《深度学习与图像识别:原理与实践》,经出版方授权发布。

作者介绍

魏溪含

爱丁堡大学人工智能硕士,阿里巴巴达摩院算法专家,在计算机视觉、大数据领域有8年以上的算法架构和研发经验。

在大数据领域,曾带领团队对阿里巴巴个性化推荐系统进行升级;计算机视觉领域,主导并攻克了光伏 EL 全自动瑕疵识别的世界难题,并在行为识别领域带领团队参赛打破世界纪录等。

涂铭

阿里巴巴数据架构师,对大数据、自然语言处理、图像识别、Python、Java 相关技术有深入的研究,积累了丰富的实践经验。在工业领域曾参与了燃煤优化、设备故障诊断项目,正泰光伏电池片和组件 EL 图像检测项目;在自然语言处理方面,担任导购机器人项目的架构师,主导开发机器人的语义理解、短文本相似度匹配、上下文理解,以及通过自然语言检索产品库,在项目中构建了 NoSQL+文本检索等大数据架构,也同时负责问答对的整理和商品属性的提取,带领 NLP 团队构建语义解析层。

张修鹏

毕业于中南大学,阿里巴巴技术发展专家,长期从事云计算、大数据、人工智能与物联网技术的商业化应用,在阿里巴巴首次将图像识别技术引入工业,并推动图像识别产品化、平台化,擅于整合前沿技术解决产业问题,主导多个大数据和AI为核心的数字化转型项目成功实施,对技术和商业结合有着深刻的理解。

9大技术论坛、60+主题分享,百余家企业、千余名开发者共同相约 AI ProCon!技术驱动产业,聚焦技术实践,倾听大牛分享,和万千开发者共成长。5折优惠票抢购中!返回搜狐,查看更多

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。