分类就是到底是1类别还是0类别。
回归就是预测的不是一个类别的值,而是一个具体的值,具体借给你多少钱哪?
一、回归分析
回归分析(英语:Regression Analysis)是一种统计学上分析数据的方法,目的在于了解两个或多个变量间是否相关、相关方向与强度,并建立数学模型以便观察特定变量来预测研究者感兴趣的变量。更具体的来说,回归分析可以帮助人们了解在只有一个自变量变化时因变量的变化量。一般来说,通过回归分析我们可以由给出的自变量估计因变量的条件期望。
回归分析是建立因变量Y(或称依变量,反因变量)与自变量X(或称独变量,解释变量)之间关系的模型。简单线性回归使用一个自变量X,复回归使用超过一个自变量(X1,X2...XiX_{1},X_{2}...X_{i}X1,X2...Xi)
- 目的在于找出一条最能够代表所有观测资料的函数(回归估计式)。
- 用此函数代表因变量和自变量之间的关系。
二、线性回归 & 逻辑回归
0.引入
在进入正题之前,先讲一个可能很多人(包括非初学者)没有注意到的问题:逻辑回归为什么叫“逻辑”?既然是分类算法,为什么又叫“回归”?
其实逻辑回归和逻辑二字没有实际上的关系,纯粹是由“Logistic”音译而来,那么Logistic又该怎么解释呢?且Regression的确是回归的意思,那又该如何解释呢?
这两个问题的答案最后再揭开(不是我不想说_(:з)∠)_,是因为涉及到底层原理…)
1.线性回归
在介绍逻辑回归之前,先用线性回归来热热身。线性回归几乎是最简单的模型了,它假设因变量和自变量之间是线性关系的,一条直线简单明了。
在有监督(有标签的)学习中,我们会有一份数据集,由一列观测(y,即因变量)和多列特征(X,即自变量)组成 。线性回归的目的就是找到和样本拟合程度最佳的线性模型(or式子,方程 whatever),在寻找过程中需要确定系数β和干扰项ε(干扰项的作用是捕获除了X之外所有影响y的其他因素)。
直接上公式吧,有“看公式会发困病”的同学可以直接跳过到 加粗斜体黑字 噢 (●ˇ∀ˇ●)~:
前面说过,线性回归的过程就是要找到最优的模型来描述数据。这里就产生了两个问题:
如何定义“最优”?
如何寻找“最优”?
想要评价一个模型的优良,就需要一个度量标准。对于回归问题,最常用的度量标准就是均方差(MSE,Mean Squared Error),均方差是指预测值和实际值之间的平均方差。平均方差越小,说明测试值和实际值之间的差距越小,即模型性能更优。
在线性回归的式子中y和X是给定的,而β和ε是不确定的,也就是说,找到最优的β和ε,就找到了最优的模型。
明确了我们的目标,接下来就是该如何去寻找这两个量呢?最常用的是参数估计方法是最小二乘法(Least Square Method), 最小二乘法试图找到一条直线,使得样本点和直线的欧氏距离之和最小。这个寻找的过程简单描述就是:根据凸函数的性质,求其关于β和ε的二阶导的零点。
( •̀ ω •́ )✧终于讲完了理论知识,下面展示一个使用python3编写的简单例子。
from numpy.random import randint # 导入numpy库中的随机数生成函数
import matplotlib.pyplot as plt # 导入绘图库X = np.array([x for x in range(1, 101)]).reshape(-1, 1) # X = 1,2,...,n
y = np.array(list(map(lambda x: 2 * x + randint(-30, 30), X))) # y=2X+r, r=random(-30,+30)
y_true = np.array(list(map(lambda x: 2 * x, X))) # y=2x
plt.plot(X, y_true, c='b') # 绘制线图
plt.scatter(X, y, alpha=0.7, s=60) # 绘制散点图
plt.title('Random Scatter')
plt.show()
即使去掉标准的y=2x直线图像,也可以很明显地看出y和X具有线性关系(这里的X为了简单起见只包含一个自变量,即X特征空间只有一维/列),但是由于我们加入了噪声(随机数),所以仅仅靠观察的话找不到一条确切的直线能够描述y和X的线性关系。
# 续上面的代码
from sklearn.linear_model import LinearRegression # 导入sklearn库中的线性回归模块
lr = LinearRegression() # 定义一个线性回归模型
lr.fit(X, y) # 将模型拟合到数据上
y_pred = lr.predict(X) # 使用模型预测数据(方便起见就不划分训练集和测试集了)
plt.scatter(X, y, alpha=0.5, s=50)
plt.plot(X, y_pred, c='r')
plt.plot(X, y_true, c='b')
plt.title('Linear Regression')
plt.show()
图中的蓝线是y=2x,红线是回归之后得到的拟合直线,由于噪声比较多,所以拟合程度没有非常理想,但也足以描述观测量y和回归量X之间的线性关系了。
2.从线性回归推广到广义线性回归
上面我们得到了线性回归模型的数学原型,在数学上一个特例经常都是归属于一个更普遍或更一般的原型。让我们思考下面这两个回归模型:
左边是我们之前得到的线性回归模型,右边是对数线性回归模型(log-Linear Regression)。从等式的形式来看,对数线性回归与线性回归区别仅仅在于等式左部,形式依旧是线性回归,但实质上是完成了输入空间X到输出空间y的非线性映射。这里的对数函数ln(·),将线性回归模型和真实观测联系起来。通俗地说,原本线性回归模型无法描述的非线性y,套上了一个非线性函数ln(·),就可以描述对数形式的y了。
将以上两个式子综合,写成更一般的形式就是广义线性回归模型(GLM,Generalized Linear Model)了。这里的g(·),即ln(·),是一个单调可微函数,称为联系函数(Link Function)。显然,前面的线性回归和对数回归都是广义线性回归的特例,根据联系函数的不同,以不同的方式映射,可以是对数,可以是指数,也可以是其他更复杂的函数。
3.逻辑回归
经过上面的铺垫,终于可以愉快地谈谈逻辑回归了✪ ω ✪
当我们想将线性回归应用到分类问题中该怎么办呢?比如二分类问题,将X对应的y分为类别0和类别1。我们知道,线性回归本身的输出是连续的,也就是说要将连续的值分为离散的0和1。答案很容易想到,找到一个联系函数,将X映射到y∈{0,1}。
单位阶跃函数的确直接明了,小于0为类别0,大于0为类别1,等于0则皆可。但是有一个原则性的问题,我们需要的联系函数,必须是一个单调可微的函数,也就是说必须是连续的。(关于连续和可微的概念,忘了的同学赶紧回去补高数吧╮(╯_╰)╭)。
( •̀ ω •́ )✧所以逻辑回归也是广义线性回归中的一种以对数几率函数为联系函数的特例。至于为什么要使用Sigmoid函数中的对数几率函数,这涉及到伯努利分布的指数族形式,最大熵理论等,这里就不展开讨论啦,数学和英语比较ok的同学可以看下这两篇详细的数学推导:
逻辑回归与最大熵模型 www.win-vector.com
指数族分布与广义线性回归 blog.csdn.net
得到了逻辑回归的数学原型,接下来就是找到最优参数。
与线性回归不同的是,逻辑回归由于其联系函数的选择,它的参数估计方法不再使用最小二乘法,而是极大似然法(Maximum Likelihood Method)。
最小二乘法是最小化预测和实际之间的欧氏距离,极大似然法的思想也是如出一辙的,但是它是通过最大化预测属于实际的概率来最小化预测和实际之间的“距离”。详细推导涉及凸优化理论,梯度下降法,牛顿法等,就不展开了。
讲完了理论知识,为了防止大家发困( ̄o ̄) . z Z,下面同样讲个简单的例子。
import matplotlib.pyplot as plt # 导入matplotlib绘图库
import seaborn as sns # 导入seaborn绘图库tips = sns.load_dataset('tips') # 加载小票数据集
tips['big_tip'] = (tips['tip'] / tips['total_bill']) < 0.15 # 构造y
sns.regplot(x=tips['total_bill'], y=tips['big_tip'], logistic=True)
plt.title('Logistic Regression')
plt.show()
上面是一段简单的逻辑回归可视化代码
tips是一个seaborn内置的数据集,搜集了小票的信息,包括七个特征字段。注意这里没有类标,即没有y,所以在有监督学习的情况下,需要我们自己构造一个y。在我上面给出的代码中,y代表的含义是{0:小费超过账单的15%,1:小费没超过账单的15%}。为了方便可视化,这里只将total_bill一列作为我们的X。
这就是最后绘制出来的逻辑回归图像,由于现实中的数据不总是理想化的,所以很少出现像之前展示的sigmoid函数图像那么的“S”,但也能看出规律:账单较小的更有可能给出超过15%的小费,这也符合生活经验。
4.线性回归和逻辑回归的区别和联系
- 线性回归和逻辑回归都是广义线性回归模型的特例
- 线性回归只能用于回归问题,逻辑回归用于分类问题(可由二分类推广至多分类)
- 线性回归无联系函数或不起作用,逻辑回归的联系函数是对数几率函数,属于Sigmoid函数
- 线性回归使用最小二乘法作为参数估计方法,逻辑回归使用极大似然法作为参数估计方法
1)线性回归要求变量服从正态分布,logistic回归对变量分布没有要求。
2)线性回归要求因变量是连续性数值变量,而logistic回归要求因变量是分类型变量。
3)线性回归要求自变量和因变量呈线性关系,而logistic回归不要求自变量和因变量呈线性关系
4)logistic回归是分析因变量取某个值的概率与自变量的关系,而线性回归是直接分析因变量与自变量的关系
总之,
logistic回归与线性回归实际上有很多相同之处,最大的区别就在于他们的因变量不同,其他的基本都差不多,正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalized linear model)。这一家族中的模型形式基本上都差不多,不同的就是因变量不同,如果是连续的,就是多重线性回归,如果是二项分布,就是logistic回归。logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最为常用的就是二分类的logistic回归。
5.最后
ヾ( ̄▽ ̄)最后,揭晓刚开始两个问题的答案!
1.逻辑回归的“Logistic”应该怎么解释?
2.为什么逻辑回归是分类算法?
其实如果有仔细看正文的同学早就已经知道答案啦:
1.Logistic并非逻辑的意思,其语义来自Logarithm:对数。这更体现了Logistic Regression的本质。周志华老师在其书《机器学习》中,给出了一个更恰当的中文名称:对数几率回归。我觉得这个翻译比起不搭边的“逻辑回归”,或者画蛇添足的“逻辑斯谛回归”更靠谱。
2.对数几率回归的“回归”并非针对可以应用的问题,而是来自其父级:广义线性回归模型。对数几率回归之所以用于离散的分类而不是连续的回归,是因为它将本来连续的输出,通过对数几率函数,映射到了非线性的{0,1}空间上,所以它可以有效地解决二分类问题(甚至可推广至多分类)。
https://zhuanlan.zhihu.com/p/39363869
https://www.jianshu.com/p/35f571f0b598