Logistic回归的python实现
有时候你可能会遇到这样的问题:
明天的天气是晴是阴?
病人的肿瘤是否是阳性?
……
这些问题有着共同的特点:被解释变量的取值是不连续的。此时我们可以利用logistic回归的方法解答。下面便来对这一方法进行简单的介绍。
Logistic回归的介绍
logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有w^T*x+b的形式,其中w和b是待求参数,其区别在于他们的因变量不同。Logistic中因变量为二分类变量。如果我们用线性回归去拟合一条直线:

若Y≥0.5则判断为1,否则为0。这样我们也可以构建出一个模型去进行分类,但是会存在很多的缺点,比如稳健性差、准确率低。
逻辑回归假设函数如下,它作了一个函数g变换,映射至0到1的范围之内,而函数g称为sigmoid function或者logistic function。函数表达式和图像如下。当我们输入特征,得到的其实是这个样本属于1这个分类的概率值。也就是说,逻辑回归是用来得到样本属于某个分类的概率。
回想之前线性回归中所用到的损失函数:
如果在逻辑回归中也运用这种损失函数,得到的函数J是一个非凸函数,存在多个局部最小值,很难进行求解,因此需要换一个cost函数。重新定义个cost函数如下:
当实际样本属于1类别时,如果预测概率也为1,那么损失为0,预测正确。相反,如果预测为0,那么损失将是无穷大。这样构造的损失函数是合理的,并且它还是一个凸函数,十分方便求得参数θ,使得损失函数J达到最小。
我们已经定义好了损失函数J(θ),接下来的任务就是求出参数θ。我们的目标很明确,就是找到一组θ,使得我们的损失函数J(θ)最小。最常用的求解方法有两种:批量梯度下降法(batch gradient descent), 牛顿迭代方法((Newton's method)。
批量梯度下降法公式:
牛顿迭代方法公式:
Logistic回归的python实现
实现代码所需的数据保存在百度网盘https://pan.baidu.com/s/1fhC_zdGYHT7rCHsXFkwVnA,提取码zyvc
1. 导入第三方软件包:
import numpy as npimport pandas as pdfrom numpy import dotfrom numpy.linalg import invimport warningswarnings.filterwarnings('ignore')
2. 读取数据,生成变量:
iris = pd.read_csv('C:/Users/V720-14/Desktop/iris.csv')dummy = pd.get_dummies(iris['Species']) # 对Species生成哑变量iris = pd.concat([iris, dummy], axis =1 )iris = iris.iloc[0:100, :] # 截取前一百行样本
3. 构建:
iris = pd.read_csv('C:/Users/V720-14/Desktop/iris.csv')dummy = pd.get_dummies(iris['Species']) # 对Species生成哑变量iris = pd.concat([iris, dummy], axis =1 )iris = iris.iloc[0:100, :] # 截取前一百行样本
4. 求解:
m,n = X.shape #矩阵大小alpha = 0.0035#设定学习速率theta_g = np.zeros((n,1)) #初始化参数maxCycles = 3000 #迭代次数J = pd.Series(np.arange(maxCycles, dtype = np.longfloat)) #损失函数for i in range(maxCycles):h = logit(dot(X, theta_g)) #估计值J[i] = -(1/100.)*np.sum(Y*np.log(h)+(1-Y)*np.log(1-h)) #计算损失函数值error = h - Y #误差grad = dot(X.T, error) #梯度theta_g -= alpha * gradprint (theta_g)输出theta_g的结果为:[[145.8354865 ] [ -4.30981641]]
5. 利用牛顿方法求解:
theta_n = np.zeros((n,1)) #初始化参数maxCycles = 10 #迭代次数C = pd.Series(np.arange(maxCycles, dtype = float)) #损失函数for i in range(maxCycles):h = logit(dot(X, theta_n)) #估计值C[i] = -(1/100.)*np.sum(Y*np.log(h)+(1-Y)*np.log(1-h)) #计算损失函数值error = h - Y #误差grad = dot(X.T, error) #梯度A = h*(1-h)* np.eye(len(X))H = np.mat(X.T)* A * np.mat(X) #海瑟矩阵, H = X`AXtheta_n -= inv(H)*gradprint (theta_n)
输出theta_n的结果为[[149.23002611] [ -2.95505002]]
根据所得到的结果带入原方程,即可得到logistic回归函数。
看完以上的介绍,你是否对logistic回归有了更多的了解?快去尝试一下吧!
参考网页:https://www.cnblogs.com/sumai/p/5221067.html

欢迎关注数据皮皮侠!
作者:唐久琳
编辑校对:郭通

