逻辑回归算法原理及python实现
文章目录引言逻辑回归算法原理逻辑回归损失函数python实现逻辑回归决策边界python实现多项式逻辑回归sklearn中的逻辑回归逻辑回归中的正则化sklearn实现逻辑回归引言逻辑回归(LogisticRegression)是一种分类学习算法,其本质是将样本的特征和样本发生的概率联系起来,由于发生的概率是一个数值,因此称为回归算法。主要解决2分类问题,例如:一个垃圾邮件过滤系统,x是邮件的特征,预测的y值就是邮件的类别(是垃圾邮件还是正常邮件)。
逻辑回归算法原理逻辑回归算法步骤如下
计算样本发生的概率值,即p^=f(x)hatp=f(x)p^=f(x)根据样本发生的概率分类y^={1 , p^≥0.50 , p^≤0.5haty=egin{cases}1,\hatpgeq0.5\0,\hatpleq0.5\end{cases}y^={1 , p^≥0.50 , p^≤0.5逻辑回归算法既可以看作回归算法,也可以看作分类算法,只执行第一步时就是回归算法,但是逻辑回归算法通常作为回归算法用,主要解决2分类问题。在线性回归算法中,样本预测值y^=f(x)=θT⋅xbhaty=f(x)= heta^{T}cdotx_by^=f(x)=θT⋅xb其值域为(−∞,+∞-infty,+infty−∞,+∞),而概率的值域为[0,1],因此需要对f(x)f(x)f(x)函数进行处理,使之值域处于[0,1]即p^=σ(θT⋅xb)hatp=sigma( heta^{T}cdotx_b)p^=σ(θT⋅xb),一般σ(t)=11+e−tsigma(t)=frac{1}{1+e^{-t}}σ(t)=1+e−t1
σ(t)sigma(t)σ(t)值域为(0,1),当t>0时,p>0.5;当ty=1时,p越小,损失越大y=0时,p越大,损失越大
下面函数刚好满足条件
cost={−log(p^) , if y=1−log(1−p^) ,if y=0cost=egin{cases}-log(hatp),\\\if\y=1\-log(1-hatp),if\y=0\end{cases}cost={−log(p^) , if y=1−log(1−p^) ,if y=0画出cost函数图像可以看出,当样本实际值为1时,预测概率值x为0,−log(x)-log(x)−log(x)趋于正无穷,即损失趋于正无穷,当x=1即符合实际值,损失为0;当样本实际值为0时,预测值概率值x为1,−log(1−x)-log(1-x)−log(1−x)趋于正无穷,即损失趋于正无穷,当x=0即符合实际值,损失为0。损失函数可以合为1个,即最终得到损失函数J(θ)=−1m∑i=1my(i)+log(p^(i))+(1−y(i))log(1−p^(i))J( heta)=-frac{1}{m}sum_{i=1}^{m}{y^{(i)}+log(hatp^{(i)})+(1-y^{(i)})log(1-hatp^{(i)})}J(θ)=−m1i=1∑my(i)+log(p^(i))+(1−y(i))log(1−p^(i))
p^(i)=σ(Xb(i)θ)=11+e−Xb(i)θhatp^{(i)}=sigma(X_b^{(i)} heta)=frac{1}{1+e^{-X_b^{(i)} heta}}p^(i)=σ(Xb(i)θ)=1+e−Xb(i)θ1
最后可以通过梯度下降法,求出使损失函数最小的θ hetaθ,求得的损失函数梯度如下
python实现逻辑回归importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitclassLogisticRegression:def__init__(self):self.coef_=Noneself.intercept_=Noneself._theta=Nonedef_sigmoid(self,t):return1/(1+np.exp(-t))deffit(self,x_train,y_trian,n):defJ(theta,x_b,y):y_hat=self._sigmoid(x_b.dot(theta))return-np.sum(y*np.log(y_hat)+(1-y)*np.log(1-y_hat))/len(y)defdJ(theta,x_b,y):returnx_b.T.dot(self._sigmoid(x_b.dot(theta))-y)/len(y)defgradient_descent(x_b,y,initial_theta,alpha=0.01,n_iters=1e4,epsilon=1e-8):theta=initial_thetaiter=0whileiter