机器学习--模型(1)逻辑回归模型

机器学习中有非常多的模型,那么模型的原理是什么?参数怎么使用?模型如何选择?这是困扰我比较久的问题,借最近学习sklearn顺便学一学我最近项目里面需要的模型。

在这一系列文章中,我想解决的是如下几个问题:

1. 如何选择合适的模型?

2. 模型的原理是什么?

3. 如何使用模型?

那么让我们继续往下看。

1. 如何选择合适的模型?

在sklearn官网上有这样一幅图:

http://sklearn.apachecn.org/cn/0.19.0/tutorial/machine_learning_map/index.html

图太大了,放不上来,上网址,里面就是标明了数据量小于大于多少时可以参考使用的模型。

分类模型的选择是这样的:

 

机器学习--模型(1)逻辑回归模型

 

最近做的项目的数据量是远远小于100k的,所以先选择SVC(支持向量机),后续再尝试朴素贝叶斯分类器,KNN,以及集成方法。之前没看过这个图之前还选用过logistic regression,所以在文章后续会一一介绍。

2. LOGISTIC REGRESSION模型的原理与使用

逻辑回归原理:

之所以先介绍逻辑回归,因为它是最简单的线性回归的升级版(这是我自己的理解哈),下面我将官网上的解释和自己的理解融合了一下:

logistic 回归,虽然名字里有 “回归” 二字,但实际上是解决分类问题的一类线性模型。线性问题的模型数学公式简单来说是y=ax+b,x就是输入的特征,可以有多个,a就是x特征的权重,越大代表x这个特征越重要,b是偏置,作用就是input为0时,至少有一个可以用来表示data波动的量。

而逻辑回归是通过odd函数对y=ax+b的转换,把y的值域缩小到0-1范围内,从而实现2分类。(这个过程在我的手写笔记上有,这里懒得写了。)

逻辑回归的数学公式就变成了:f(x)=Y = 1/(1+e^-(ax+b)),图像自己搜百度一大堆。

总而言之我们要根据输入的数据量,求使得模型的误差最小的a和b的量。

用什么东西来衡量模型的误差呢?一般有两种方法:

①最小二乘(LS)

将目标函数设为:J=机器学习--模型(1)逻辑回归模型(yi-axi-b)^2 也就是最小均方误差,求解方法就是分别对ab求偏导,到导数为0时就得到了最优解。

②MLE最大似然估计(从概率方面解析问题)

最合理的参数估计就是使得“从分布中抽取该几组样本观测值的概率最大。”我自己的理解就是比如train data中有一点为(4,1),求1=4a+b时a、b为多少时1能够出现的概率最大。

数学公式是:maxp(y1,y2,.....yn|a,b)= p(y1|a,b) p(y2|a,b)...... p(yn|a,b)

根据中心极限定理可知,maxp是服从高斯分布的,所以求得使maxp处于高斯分布图像最顶端的ab参数即可。

而最大似然函数的损失函数如何表示呢?有点复杂,大体来说就是二分类问题是每个样本的单次试验都是服从伯努利分布的,将其总体概率分布表示为:L(a,b)= 机器学习--模型(1)逻辑回归模型    p = 1/(1+e^-(ax+b)) [0,1] 。yi = 0 or 1 

要得到maxL(a,b),或者是对L(a,b)取对数,再取负数,就会得到最大似然函数的损失方程,求其min。

这一块其实很难理解,要自己多思考,这里只是简要的提及一下。

怎么计算呢?这就要用到梯度下降算法了,因为LS算法中求导数这一招在特征很多的时候太难算了,当然梯度下降算法我现在还不太清楚那是什么鬼,所以后续再说~

逻辑回归的使用:

在scikit-learn官网中一查便可以知道:

在linear_model中的LogisticRegression类可以实现逻辑回归。

机器学习--模型(1)逻辑回归模型机器学习--模型(1)逻辑回归模型

scikit-learn 中 logistic 回归在 LogisticRegression 类中实现了二分类(binary)、一对多分类(one-vs-rest)及多项式 logistic 回归,并带有可选的 L1 和 L2 正则化。

正则化其实是feature selection的一部分,将特征稀疏,避免模型过拟合,L1,L2只是使用的范数不同罢了。

https://www.zhihu.com/question/20924039 这个知乎上的回答者答得挺好的,有兴趣可以瞅瞅。

 

作为优化问题,带 L2 罚项的二分类 logistic 回归要最小化以下代价函数(cost function):

机器学习--模型(1)逻辑回归模型

类似地,带 L1 正则的 logistic 回归解决的是如下优化问题:

机器学习--模型(1)逻辑回归模型

在 LogisticRegression 类中实现了这些优化算法: “liblinear”, “newton-cg”, “lbfgs”, “sag” 和 “saga”。

“liblinear” 应用了坐标下降算法(Coordinate Descent, CD),并基于 scikit-learn 内附的高性能 C++ 库 LIBLINEAR library 实现。不过 CD 算法训练的模型不是真正意义上的多分类模型,而是基于 “one-vs-rest” 思想分解了这个优化问题,为每个类别都训练了一个二元分类器。因为实现在底层使用该求解器的 LogisticRegression 实例对象表面上看是一个多元分类器。 sklearn.svm.l1_min_c 可以计算使用 L1 罚项时 C 的下界,以避免模型为空(即全部特征分量的权重为零)。

“lbfgs”, “sag” 和 “newton-cg” solvers (求解器)只支持 L2 惩罚项,对某些高维数据收敛更快。这些求解器的参数 `multi_class`设为 “multinomial” 即可训练一个真正的多项式 logistic 回归 [5] ,其预测的概率比默认的 “one-vs-rest” 设定更为准确。

“sag” 求解器基于平均随机梯度下降算法(Stochastic Average Gradient descent) [6]。在大数据集上的表现更快,大数据集指样本量大且特征数多。

“saga” 求解器 [7] 是 “sag” 的一类变体,它支持非平滑(non-smooth)的 L1 正则选项 penalty="l1" 。因此对于稀疏多项式 logistic 回归 ,往往选用该求解器。

一言以蔽之,选用求解器可遵循如下规则:

Case Solver
L1正则 “liblinear” or “saga”
多项式损失(multinomial loss) “lbfgs”, “sag”, “saga” or “newton-cg”
大数据集(n_samples) “sag” or “saga”

“saga” 一般都是最佳的选择,但出于一些历史遗留原因默认的是 “liblinear” 。

对于大数据集,还可以用 SGDClassifier ,并使用对数损失(’log’ loss)

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression

使用方法参考官方文档。

其参数有14个看得我脑壳都大了,得慢慢看,慢慢挑里面你需要什么,实验的时候慢慢调整,其实文档里面都写的很清楚,比如对分类器的选择:

机器学习--模型(1)逻辑回归模型

如果要看具体代码如何使用,请看我的sklearn系列笔记。

下篇文章会讲到的是svm(支持向量机)。