【分类算法】逻辑回归

只谈情不闲聊 提交于 2019-12-23 03:54:44

什么是逻辑回归

之前我们讲过线性回归的原理以及推导过程。今天,我们回家另外一个算法,叫逻辑回归。简单归类一下,这个算法不是归类预测算法,大家千万不要被名字不会了。它其实属于分类算法。说到分类算法,大家有没有联想到?没错,逻辑回归属于监督学习。所以它需要带标签的数据。
这里简单的列举一下逻辑回归的使用场景:

  • 垃圾邮件分类
  • 网络诈骗分类
  • 恶行肿瘤鉴定

逻辑回归模型推导

为何不能用线性模型

下面以恶行肿瘤来举例子。假如我们有个数据集,他们他描述的是肿瘤大小,以及是否为和兴肿瘤。大致如下:

肿瘤大小 是否恶性
1
5
10
10.5
15

假设x是肿瘤的大小,y代表否恶性。最终我们可以得到下图左边的8个红色交叉点。假如我们线性回归预测这8个点时,我们可以得到蓝色的一条线。若我们假设蓝色线上面的是恶行肿瘤,下面的是良性肿瘤。这里看上去预测的结果好像还可以。
在这里插入图片描述
但假如这时候出现一个右边蓝色肩头上点,我们重新用线性模型预测出回归线,然后得到粉色的线。这时候问题就出现了,新增的点的x其实非常的大,但是却被模型判定成良性肿瘤。这样是不是就不对了。所以,我们需要修改我们的模型。我们要把我们的线性模型改成二分类模型。在逻辑回归的思想下,我们需要引入Sigmoid函数。

线性模型转二分类模型(Sigmoid)

突然冒出一个莫名其妙的Sigmoid的词汇是不是很”方“。其实Sigmoid的引入,就是逻辑回归的魅力所在。只要我们在模型中引入它,我们就可以把一条直线“掰”成一条曲线最终变成二分类模型。事不宜迟,马上介绍Sigmoid。
经过上一步的推导,我们可以得到一条线性回归线,这里把它写成:
f(x)=ωTx+b(1) f(x) = \omega^Tx + b (式1)
在逻辑回归中,所谓的Sigmoid函数其实就是,同时可以得到下图:
g(x)=11+ex(2) g(x) = \frac{1}{1+e^{-x}} (式2)在这里插入图片描述
我们把式1和式2做结合,就可以得到:
g(x)=11+ef(x)(3) g(x) = \frac{1}{1+e^{f(x)}} (式3)
g(x)=11+eωTx+b(4) g(x) = \frac{1}{1+e^{\omega^Tx + b}} (式4)
经过这么一段推导,我们就能得到逻辑回归模型的核心公式g(x)。当g(x)>0.5时,我们就认为结果为1;对应g(x)<0.5时,我们认为结果为0。说白了就是把f(x)转化成接近0/1的g(x)。这就是逻辑回归中的Sigmoid函数。对应的Python实现是:

import numpy as np
  
def sigmoid(z):
   return 1 / (1 + np.exp(-z))

代价函数

上面讲了逻辑回归的基本推导,下面进阶的来了啊。那就是代价函数。至于代价函数是什么,大家另行查阅资料。下面到了求最优解的问题了。

使用最小二乘法估计

所谓的最小二乘法,其实就是求f(x)与实际y的欧氏距离。从上面结合,我们得知
f(x)=ωTx+bf(x) = \omega^Tx + b
通过求f(x)和y的欧氏距离,我们可以得到
J(θ)=1mi=1m(fθ(x(i))y(i))2J(\theta) = \frac{1}{m}\sum^m_{i=1}(f_{\theta}(x^{(i)}) - y^{(i)})^2
显然,我们现有的代价函数只适合凸函数的场景下。假如函数是一个非凸的函数,最小二乘法求代价函数显然是不可取的。就如下图一样
在这里插入图片描述

最大似然法

那么,为了满足我们的需求,我们就需要换一个思路。最后大佬们相处了最大似然估计这个方式。什么是最大似然估计请大家自行查阅资料。所谓的极大似然估计其实就是使模型正确率最高的意思。我们可以拟定
{P(y=1x,θ)=hθ(x)P(y=0x,θ)=1hθ(x) \begin{cases} P(y=1|x,\theta) =h_\theta(x)& \\ P(y=0|x,\theta) =1-h_\theta(x) \end{cases}
综合他们的总概率,我们可以得到
P(yx,θ)=hθ(x)y(1hθ(x))yP(y|x,\theta) = h_\theta(x)^y(1-h_\theta(x))^y
得到上述的公式,我们就可以求出最优解了。但P是乘法的,这样我们并不容易求出我们想要的结果。所以我们可以采用对数极值的方式来求。因为对数可以让乘法变成加法。也就是说:
Cost(hθ(x),y)={log(hθx)if y=1log(1hθx)if y=0Cost(h_{\theta}(x),y)=\begin{cases}-log(h_{\theta}x) &\text{if y=1}\\ -log(1-h_{\theta}x) &\text{if y=0} \end{cases}
在这里插入图片描述
这里可以看出,当y=1时,代价函数将越来越小。对应cost代码如下:

import numpy as np
      
def cost(theta, X, y):
  theta = np.matrix(theta)
  X = np.matrix(X)
  y = np.matrix(y)
  first = np.multiply(-y, np.log(sigmoid(X* theta.T)))
  second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))
  return np.sum(first - second) / (len(X))

代码样例

讲了这么多,我们开始紧张刺激的环节吧。让我们来构建一个简单的逻辑回归模型。输入参数依然是癌症肿瘤,判断肿瘤是否恶性。(数据来源)然后包采用sklearn的类库。(官方文档)由于网上比较多的资料都是用这份数据的,所以代码可能差不多。

import pandas as pd
from sklearn.linear_model import LogisticRegression
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report
from sklearn.linear_model import SGDClassifier

columns_names = ['Sample code number','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape',
                'Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli',
                'Mitoses','Class']
data = pd.read_csv('breast-cancer-wisconsin.data',names=columns_names)
#把?的缺失值删除掉
data = data.replace(to_replace='?',value=np.nan)
data = data.dropna(how='any')

#分割数据成测试集和训练集(监督学习必备)
X_train,X_test,y_train,y_test = train_test_split(data[columns_names[1:10]],data[columns_names[10]],test_size=0.25,random_state=33)

#数据预处理
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.fit_transform(X_test)

#创建并训练模型
lr = LogisticRegression().fit(X_train,y_train)

#predict出测试集
lr_y_predict = lr.predict(X_test)

#调用SGDClassifier 中的fit函数进行训练
sgdc = SGDClassifier()
sgdc.fit(X_train,y_train)
sgdc_y_predict=sgdc.predict(X_test)
#打印结果
print('Accuracy of LR Classifier:',lr.score(X_test,y_test))
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))

总结

逻辑回归是一个监督学习中的分类算法。他的核心思想就是通过Sigmoid函数的引入,使一条线性回归的线变成一个二分类问题。所以对于Sigmoid函数的理解和整个推导式逻辑回归的核心。
但事实上,除了线性的逻辑回归以外,还有非线性的逻辑回归模型。关于这个我们后续有机会的话继续学习。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!