数据挖掘之--啥都不会到逻辑回归

来源:互联网 发布:centos 7如何引导win7 编辑:程序博客网 时间:2024/04/29 02:06

QQ交流群:127591054
JackChiang QQ:595696297 欢迎大家来交流。

作者经历:17年7月刚毕业的童孩~~16年底实习半年在做DBA,中途有变,想把数据挖掘作为自己的长远职业,也就是职业规划定位:数据挖掘。偏爱做数据分析,没办法。但是!但是!但是!挖掘的门槛真的好高!好高!好高!快毕业的时候辞去在电信的工作,来了一场说走就走的旅途,一个人!!!去了云南,带上仅有的200块钱!!!(大家别张嘴,我在飞猪报的团),云南很美!就不发图了。

回来开始找工作,真的很难!很难!很难,基本没人要!啥都不会,这样持续了一个月!这一个月是难熬的,信用卡欠了3千等等。静下心来想了想自己为什么选这个?为什么没人要?

原因我归于:
1、挖掘这一块需要大量的理论知识!!自己都学过,但是都忘了,等于0。
2、没有分析这一块的经验,完全在面试官面前就是0的概念。
3、我要是面试官,看见这样的我!也不会要,如一个面试官说的:你表达的很诚恳的样子,但是你没有为此做过任何努力!!

这句话我想了好久,停止了再找这一块的工作。
这也是找了好久工作,连面试电话都没有的原因了。然后无意接触到ETL,简单的来说就是清洗数据,然后送给挖掘分析!没办法,先从上一级干起,慢慢进入挖掘或者说是机器学习!几个月前就是这样想的。
可能是我运气好吧!之前拒绝过的一家公司,又要了我!不对收留了我。公司主管很好,但是!但是!但是!对我特别凶!特别凶!特别凶!感觉就是我高三班主任,她还是个四川的妹子!!!29岁!关键还不丑。。。。。。

她问了问我的想法,让我先做ETL说我现在这个水平,挖掘慢慢来!的确是。她吧公司做挖掘这一块的经理介绍给我,指导我如何学习!!这东西我感觉一开始,就是学数学!!!!!而我现在就在学数学!!他给我布置了个任务两周之内搞懂“逻辑回归”,是在工作以外的时间学习!因为我ETL要去项目上出差特别忙!!那就看呗。。。于是下面的笔记就造出来了,也和他讲了讲!然后他叫我继续学习补数学!

以上就是我刚入坑:数据挖掘/机器学习的背景!!!

此篇文章是我从我Word笔记中挪过来的,好麻烦,大家如果想看Word可以去下面链接下载。
http://download.csdn.net/download/jack__chiang/9970290

第一篇文章:很浅四处摘抄,添加自己理解,用Python实现。还是有很大收获的。
希望可以帮到大家,我希望17年底可以正式入挖掘的坑!!祝愿我吧。

1、概念

逻辑回归简称LR,可是说是互联网领域应用最广泛的自动分类算法:从单机运行的垃圾邮件自动识别程序到需要成百上千台机器支撑的互联网广告投放系统,其算法主干都是LR。百度的解释:LR算法是Logistic Regression的简写,中文翻译为逻辑回归算法。LR分析是当前最一般的分析方法。它对文法的限制最少,现今能用上下文无关文法描述的程序设计语言一般均可用LR方法进行有效的分析。而且在分析的效率上也不比诸如不带回溯的自顶向下分析、一般的“移进归约”以及算符优先等分析方法逊色。此外,LR分析器在工作过程中,还能准确及时地发现输入符号串的语法错误。凡此种种,就使LR分析方法在国际上受到了广泛的重视。

2、一个例子

大家在平时的工作和学习当中会经常遇到各种决策问题:例如这封邮件是不是垃圾邮件,这个用户是不是对某个商品感兴趣呢?这个房子到底买不买呢?然而当我们需要通过机器学习这样一个学科解决的时候,也就是第一步需要对这些问题进行决策,最常用的方法就是构建一个叫做分类器的程序。这种程序的输入是待决策的一系列特性,输出的就是这个程序的判定结果。以垃圾邮件分类为例子,每一封邮件就是一个待决策的问题,而我们通常使用的特性就是从这个邮件本身抽取的一系列我们认为可能相关的信息,例如发件人,邮件长度,时间,邮件中的关键词,标点符号,是否有多个收件人等等。给定了这些特征我们的垃圾邮件分类器就可以判定出这封邮件是不是垃圾邮件。至于我们怎么得到这个邮件分类的程序,通常的做法就通过某种机器学习算法。之所以称之为学习,是因为这些算法通常需要已经标注好的样本,例如:100封邮件,每封信已经明确了标注的是否是垃圾邮件,然后这个算法就是自动的产生一个关于这个问题的自动分类程序。然而逻辑回归就是最常用的一个机器学习的分类算法。
LR模型原理简单,并且有一个现成的叫做LIBLINEAR的工具库,易于上手而且效果不错。
LR可以说是互联网上最常用的的也就是最有影响力的分类算法。LR几乎是所有广告系统中和推荐系统中点击率预估模型的基本算法。
LR同时也就炙手可热的深度学习的基本组成单元,扎实的掌握LR也有助于学好深度学习。

3、学习逻辑回归的三个阶段

1、了解LR模型准备工作

1、首先学习极大似然估计,大学学习过都忘记了。
概念:极大似然估计是根据样本(x1,x2,…,xi,…,xn)的值来估计样本模型中参数(θ1,θ2,…,θi,…,θn)的。是一种参数估计方法。
其中,似然是似然函数的简称。可由L(x1,x2,…,xi,…,xn,θ1,θ2,…,θi,…,θn )来表示。实际上,样本一旦确定,人们一般会假设一个可拟合这些样本的模型,即参数个数是确定的,待求的是参数的具体值。比如,基于班上同学的身高数据,一般会假设身高是符合正态分布(μ,σ),待求的是这两个参数具体的值。
  那么,如何基于已有的样本数据来求得模型中参数得具体值呢?
  极大似然估计的意思是说,你只要能使L(x1,x2,…,xi,…,xn,θ1,θ2,…,θi,…,θn )最大,你的参数θ1,θ2,…,θi,…,θn 就是有效的。
  以身高样本为例(假定身高样本是独立同分布的)。即当L(x1,x2,…,xi,…,xn,μ,σ )最大时,(μ,σ)被估计的是准确的。
  
  求极大似然函数估计值的一般步骤:
  (1) 写出似然函数;
  (2) 对似然函数取对数,并整理;
  (3) 求导数 ;
  (4)导数为零时,似然函数取得极大值 。
  
下面通过一个例子介绍极大似然估计法的思想和方法。

设一袋中装有黑、白两种球。设p是从袋中随机摸得一个白球的概率,现要估计p的取值。
根据问题,我们令总体X为
X={
1, if get white ball
0, if get black ball
{
则X服从0-1分布B(1,p),其中P(X=1)=p, P(X=0)=1-p.
为估计p,我们做有放回摸球10次,其结果可用随机变量表示如下:
Xi={
1, if get white ball
0, if get black ball i=1,2,…,10.
{
则X1,X2,…,X10是来自总体X的一个样本。若10次摸球的结果是样本观测值(x1,x2,…,x10)=(1,0,1,0,0,0,1,0,0,0),则其似然函数为
L(p)=P(X1=1,X2=0,X3=1,X4=0,X5=0,X6=0,X7=1,X8=0,X9=0,X10=0)=p3(1−p)7

即L(p)=p3(1−p)7是在10次摸球中出现观测值(1,0,1,0,0,0,1,0,0,0)的概率。
极大似然估计法的思想

随机试验有若干个可能的结果,如果在一次试验中某一结果出现了,有小概率事件原理,我们便自然认为这一结果出现的概率较大,从而可以认为这一结果是所有结果中出现概率最大的一个。因此p应该这样估计,即选择p^,使得上述观测值出现的概率最大。也就是说使L(p^)为L(p)的最大值。而求得L(p)的最大值点p^,可由方程

这里写图片描述
这里写图片描述
解得。本例解得p^=0.3时,L(0.3)=max{L(p)}。于是用p^=0.3作为随机取得一白球的概率的估计值是适当的。
因此,一般对离散型总体,极大似然估计值Θ^是满足 的解。
这里写图片描述

2、补充方向导数和梯度
在许多问题中,不仅要知道函数在坐标轴方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。这就是接下来要谈论的方向导数。

定义 1 设三元函数这里写图片描述在点这里写图片描述的某邻域这里写图片描述内有定义,l为从点这里写图片描述出发的射线,这里写图片描述为l上且含于这里写图片描述内的任一点,以这里写图片描述表示与两点间P与这里写图片描述的距离,若极限
这里写图片描述
存在,则称此极限为函数f在点这里写图片描述沿l方向的方向导数,记作
这里写图片描述
沿任一方向的方向导数与偏导数的关系由下述定理给出。(一个一个单词截好麻烦我直接截Word文档了)
简单来说方向导数就是分别求每个坐标变量的导数乘以这个坐标变量延某个点的方向余弦.
这里写图片描述
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

补充:方向余弦
定义:在解析几何里,一个向量的三个方向余弦分别是这向量与三个坐标轴之间的角度余弦。
这里写图片描述
这里写图片描述

3、然后梯度下降算法
概念:梯度下降法是一个最优化算法,通常也称为最速下降法。最速下降法是求解无约束优化问题最简单和最古老的方法之一,虽然现在已经不具有实用性,但是许多有效算法都是以它为基础进行改进和修正而得到的。最速下降法是用负梯度方向为搜索方向的,最速下降法越接近目标值,步长越小,前进越慢。

随机梯度下降
梯度下降是通过顺着成本函数(cost function)的梯度来最小化函数的过程。
这涉及到成本函数的形式及导数,使得从任意给定点能推算梯度并在该方向上移动,例如,沿坡向下(downhill)直到最小值。

常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型
首先我们要清楚,一个多元函数的梯度方向是该函数值增大最陡的方向。具体化到1元函数中时,梯度方向首先是延曲线的切线,然后取切线向上增长的方向为梯度方向。2元或者多元函数中,梯度向量为函数值f对每一个变量的导数,改向量的方向就是梯度方向,当然向量的大小也就是梯度的大小。
现在假设我们要求函数的最值,采用梯度下降法,如图:
这里写图片描述
梯度下降法的基本思想还是挺简单的,现假设我们要求函数f的最小值,首先得选取一个初始点后,然后下一个点的产生时是沿着梯度直线方向,这里是沿着梯度的反方向(因为求的是最小值,如果是求最大值的话则沿梯度的方向即可)。梯度下降法的迭代公式为:
这里写图片描述
因为一般情况下,梯度向量为0的话说明是到了一个极值点,此时梯度的幅值也为0.而采用梯度下降算法进行最优化求解时,算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置个非常小的常数阈值。

在机器学习中,我们可以使用一种技术来评估和更新每次迭代后的系数,这种技术称为随机梯度下降,它可以使模型的训练误差(training error)最小化。

2、问题

实际工作中,我们可能会遇到如下问题:
1、预测一个用户是否点击特定的商品
2、判断用户的性别
3、预测用户是否会购买给定的品类
4、判断一条评论是正面的还是负面的
这些都可以看做是分类问题,更准确地,都可以看做是二分类问题

3、logistic模型

在介绍逻辑回归模型之前,我们先引入sigmoid函数,其数学形式是:
这里写图片描述
对应的函数曲线如下图所示:
这里写图片描述
从上图可以看到sigmoid函数是一个s形的曲线,它的取值在[0, 1]之间,在远离0的地方函数的值会很快接近0/1。这个性质使我们能够以概率的方式来解释(后边延伸部分会简单讨论为什么用该函数做概率建模是合理的)。

决策函数
一个机器学习的模型,实际上是把决策函数限定在某一组条件下,这组限定条件就决定了模型的假设空间。当然,我们还希望这组限定条件简单而合理。而逻辑回归模型所做的假设是
这里写图片描述
这里的 g(h) 是上边提到的 sigmoid 函数,相应的决策函数为:
这里写图片描述
选择0.5作为阈值是一个一般的做法,实际应用时特定的情况可以选择不同阈值,如果对正例的判别准确性要求高,可以选择阈值大一些,对正例的召回要求高,则可以选择阈值小一些。
模型的数学形式确定后,剩下就是如何去求解模型中的参数。统计学中常用的一种方法是最大似然估计,即找到一组参数,使得在这组参数下,我们的数据的似然度(概率)越大。在逻辑回归模型中,似然度可表示为:
这里写图片描述
即在逻辑回归模型中,我们最大化似然函数和最小化log损失函数实际上是等价的。对于该优化问题,存在多种求解方法,这里以梯度下降的为例说明。梯度下降(Gradient Descent)又叫作最速梯度下降,是一种迭代求解的方法,通过在每一步选取使目标函数变化最快的一个方向调整参数的值来逼近最优值。基本步骤如下:
这里写图片描述

其中损失函数的梯度计算方法为:
这里写图片描述
沿梯度负方向选择一个较小的步长可以保证损失函数是减小的,另一方面,逻辑回归的损失函数是凸函数(加入正则项后是严格凸函数),可以保证我们找到的局部最优值同时是全局最优。此外,常用的凸优化的方法都可以用于求解该问题。例如共轭梯度下降,牛顿法,LBFGS等。

分类边界
知道如何求解参数后,我们来看一下模型得到的最后结果是什么样的。很容易可以从sigmoid函数看出,当θTx>0 时,y=1,否则 y=0。θTx=0 是模型隐含的分类平面(在高维空间中,我们说是超平面)。所以说逻辑回归本质上是一个线性模型,但是,这不意味着只有线性可分的数据能通过LR求解,实际上,我们可以通过特征变换的方式把低维空间转换到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。下面两个图的对比说明了线性分类曲线和非线性分类曲线(通过特征映射)。
这里写图片描述

正则化
当模型的参数过多时,很容易遇到过拟合的问题。这时就需要有一种方法来控制模型的复杂度,典型的做法在优化目标中加入正则项,通过惩罚过大的参数来防止过拟合:
这里写图片描述
逻辑回归是一种判别模型,表现为直接对条件概率P(y|x)建模,而不关心背后的数据分布P(x,y)。而高斯贝叶斯模型(Gaussian Naive Bayes)是一种生成模型,先对数据的联合分布建模,再通过贝叶斯公式来计算样本属于各个类别的后验概率,即:
这里写图片描述

多分类(softmax)
如果y不是在[0,1]中取值,而是在K个类别中取值,这时问题就变为一个多分类问题。有两种方式可以出处理该类问题:一种是我们对每个类别训练一个二元分类器(One-vs-all),当K个类别不是互斥的时候,比如用户会购买哪种品类,这种方法是合适的。如果K个类别是互斥的,即 y=i 的时候意味着 y 不能取其他的值,比如用户的年龄段,这种情况下 Softmax 回归更合适一些。Softmax 回归是直接对逻辑回归在多分类的推广,相应的模型也可以叫做多元逻辑回归(Multinomial Logistic Regression)。模型通过 softmax 函数来对概率建模,具体形式如下:
这里写图片描述
类似的,我们也可以通过梯度下降或其他高阶方法来求解该问题,这里不再赘述。

应用
本文开始部分提到了几个在实际中遇到的问题,这里以预测用户对品类的购买偏好为例,介绍一下美团是如何用逻辑回归解决工作中问题的。该问题可以转换为预测用户在未来某个时间段是否会购买某个品类,如果把会购买标记为1,不会购买标记为0,就转换为一个二分类问题。我们用到的特征包括用户在美团的浏览,购买等历史信息,见下表。

这里写图片描述
其中提取的特征的时间跨度为30天,标签为2天。生成的训练数据大约在7000万量级(美团一个月有过行为的用户),我们人工把相似的小品类聚合起来,最后有18个较为典型的品类集合。如果用户在给定的时间内购买某一品类集合,就作为正例。哟了训练数据后,使用Spark版的LR算法对每个品类训练一个二分类模型,迭代次数设为100次的话模型训练需要40分钟左右,平均每个模型2分钟,测试集上的AUC也大多在0.8以上。训练好的模型会保存下来,用于预测在各个品类上的购买概率。预测的结果则会用于推荐等场景。
由于不同品类之间正负例分布不同,有些品类正负例分布很不均衡,我们还尝试了不同的采样方法,最终目标是提高下单率等线上指标。经过一些参数调优,品类偏好特征为推荐和排序带来了超过1%的下单率提升。
此外,由于LR模型的简单高效,易于实现,可以为后续模型优化提供一个不错的baseline,我们在排序等服务中也使用了LR模型。

总结
逻辑回归的数学模型和求解都相对比较简洁,实现相对简单。通过对特征做离散化和其他映射,逻辑回归也可以处理非线性问题,是一个非常强大的分类器。因此在实际应用中,当我们能够拿到许多低层次的特征时,可以考虑使用逻辑回归来解决我们的问题。

梯度下降法,最大似然估计,凸函数,最下平法差,log损失函数。

4、用Python实现带梯度的下降的逻辑回归(Logistic)

logistic 回归算法以该方法的核心函数命名,即 logistic 函数。logistic 回归的表达式为方程,非常像线性回归。输入值(X)通过线性地组合权重或系数值来预测输出值(y)。
这里用印度安人糖尿病的数据集。

1、如何使用 logistic 回归模型进行预测。
与线性回归的主要区别在与,模型的输出值为0或1,logistic回归的表达为方程,非常像线性回归。输入值X通过线性的组合权重或者系数值来预测输出值Y
与线性回归相比主要的区别在于,模型的输出值是二值0或者1,而不是连续的值。
这里面的e是自然数的底(欧拉数),y是预测值,b0是偏差或者截距项,b1是单一输入变量(x1)的参数。
y预测值为0,1之前的实数,它需要舍入到整数值并映射到预测类值。
输入数据中的每一列都有一个相关的系数b(一个常数实数值),这个系数是训练集中学习的。存数在存储器或者文件中的最终模型的实际上是等式中的系数(β值或 b)。
Logisti回归算法的系数必须从训练集中估计。
这里写图片描述
随机梯度下降
梯度下降是通过顺着成本函数的梯度来最小化函数的过程。
这涉及到成本函数的形式及导数,使得从任意给定点能推送梯度并在该移动方向移动,例如,沿坡向下直到最小值。
在机器学习中,我们可以使用一种技术来评估和更新每次迭代后的系数,这种技术称为随机梯度下降,它可以使模型的训练误差最小化。
此优化算法每次将每个训练样本传入模型,模型对训练样本进行预测,计算误差并更新模型以便减少下一预测的误差。
该过程可以找到训练误差系数最小的一组系数,每次迭代,机器学习中的系数b通过一下等式更新:
这里写图片描述
其中b是被优化的系数或者权重,learning_rate 是必须设置的学习速率,例如0.01,y1-y是训练数据基于权重计算的模型误差,y是通过系数计算预测值,x是输入值。
Pima 印第安人糖尿病数据集

Pima Indians 数据集包含了根据基本医疗细节预测 Pima 印第安人 5 年内糖尿病的发病情况。

它是一个二项分类问题,其中预测是 0(无糖尿病)或 1(糖尿病)。

它包含 768 行和 9 列。所有值都是数字型数值,含有浮点值(float)。下面的例子展示了数据前几行的结构。
这里写图片描述
数据地址:https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes

第一步是开发一个可以进行预测的函数。

在随机梯度下降中估计系数值以及模型最终确定后在测试集上进行预测都需要这个预测函数。

下面是一个名为 predict() 的函数,给定一组系数,它预测每一行的输出值。

第一个系数始终为截距项 (intercept),也称为偏差或 b0,因为它是独立的,不是输入值的系数。
这里写图片描述
我们可以放一些小数据测试我们的函数
这里写图片描述
这是上面几个数据的分布图,不同颜色代表不同类别。
这里写图片描述

先使用这些小数据放在一起,测试Predict函数。
这里写图片描述
这里写图片描述
运行此函数,我们得到的预测值相当接近预期的输出值(y),并且四舍五入时能预测出正确的类别。
这里写图片描述
现在我们已经准备好实现随机梯度下降算法来优化系数值了。

2、如何使用随机梯度下降(stochastic gradient descent)来估计系数(coefficient)。
我们可以使用随机梯度下降来估计训练集的系数值。
随机梯度下降需要两个参数:
学习速率(Leanring Rate):用于限制每次迭代时每个系数的校正量。
迭代次数(Epochs):更新系数前便利训练集数据的次数。

函数中的三层循环:
1、每次迭代(epoch)的循环。
2、每次迭代的训练集数据的每一行的循环。
3、每次迭代的每一行数据的每个系数的每次更新的循环。

就这样,在每一次迭代中,我们更新训练集中的每一行数据的每一个系数。稀疏的更新基数基于模型的训练误差值。这个误差通过期望输出值(真实的因变量)与估计系数确定的预测值之间的差来计算。

每一个输出属性(自变量)对应一个系数,这些系数在迭代中不断的更新,例如:
这里写图片描述
列表开头的特殊系数(也称为截距)以类似方法更新,除了与输入值无关。
这里写图片描述
现在我们可以把这所有一切放在一起。下面是一个名为:coefficients_sgd()的函数,它使用随机梯度下降计算训练集的系数值。
这里写图片描述
此外,每次迭代我们记录误差平方和SSE(一个正值),以便我们在每一个外循环开始时可以输出结果。

我们可以用上面的小数据测试这个函数
这里写图片描述
这里写图片描述

我们使用更大的学习速率0.3,并循环100次来迭代次来训练模型,或者系数更新100次。
运作该代码,每次迭代时会print出该次得带的去查平方和及该迭代确定的最优系数。
这里写图片描述
你可以看到误差持续下降,甚至在最后一下迭代。我们可以训练更长的时间,或者更多的迭代,或者增加迭代更新系数的程度(更高的学习率)。
现在,让我们将算法应用到实际数据集。

3、如何将 logistic 回归应用到真实的预测问题。
在本节中,我们将使用随机梯度下降算法对糖尿病数据集进行 logistic 回归模型训练。
该示例假定数据集的 CSV 副本位于当前工作目录中,文件名为 pima-indians-diabetes.csv
首先加载数据集,将字符串值转换为数字,并将每个列标准化为 0 到 1 范围内的值。这是通过辅助函数 load_csv()和 str_column_to_float()来加载和准备数据集以及 dataset_minmax()和 normalize_dataset()来标准化的。
我们将使用 k 折交叉验证(k-fold cross validation)来估计学习到的模型在未知数据上的预测效果。这意味着我们将构建和评估 k 个模型,并将预测效果的平均值作为模型的评价标准。分类准确率将用于评估每个模型。这些过程由辅助函数 cross_validation_split(),accuracy_metric() 和 evaluate_algorithm() 提供。

我们将使用上面创建的 predict()、coefficients_sgd() 函数和一个新的 logistic_regression() 函数来训练模型。
这里写图片描述
令k折交叉验证的k值为 5,每次迭代时用于评估的数量为 768/5 = 153.6 或刚好超过 150 个记录。通过实验选择学习速率0.1和训练迭代次数100。
你可以尝试其它的设置,看看模型的评估分数是否比我的更好。

运行此示例代码,print 5 折交叉验证的每一次的分数,最后 print 分类准确率的平均值。
可以看到,此算法的准确率大约为 77%,而如果我们使用零规则算法预测多数类,基线值为 65%,本算法的准确率高于基线值。
这里写图片描述

原创粉丝点击