您的位置:首页 > 其它

分类算法----逻辑回归预测

2017-06-18 00:00 597 查看

逻辑回归的用途

逻辑回归常用于预测疾病发生的概率,例如因变量是是否恶性肿瘤,自变量是肿瘤的大小、位置、硬度、患者性别、年龄、职业等等(很多文章里举了这个例子,但现代医学发达,可以通过病理检查,即获取标本放到显微镜下观察是否恶变来判断);广告界中也常用于预测点击率或者转化率(cvr/ctr),例如因变量是是否点击,自变量是物料的长、宽、广告的位置、类型、用户的性别、爱好等等。

逻辑回归原理





逻辑回归是一个形式是Y=1/(1+E(-X))的函数,它的特点是:

1 当X>0,随着X增大,Y很快的接近1;

2 当x<0,随着X的减小,Y很快的接近0;

3 当X=0时,Y=1/2;

由于逻辑回归的这种特性(在0-1之间连续),它被用来判断一个学习算法是否正确。

除了正确和不正确的结果之外,使用逻辑回归的好处在于,它还能告诉你,你离正确的结果还差多少,从而引导你向正确的方向前进。因此它常常和梯度上升的算法结合起来。

https://en.wikipedia.org/wiki/Sigmoid_function

逻辑回归的预测模型



逻辑回归不是回归问题,而是二分类问题,因变量不是0就是1,那么我们很自然的认为概率函数服从伯努利分布,而伯努利分布的指数形式就是个sigmoid 函数。
函数hθ(x)表示结果取1的概率,那么对于分类1和0的概率分别为:



逻辑回归多分类问题

由于逻辑回归常用于二分类问题,但也存在多分类情况:

多类分类问题举例: 电子邮件分类/标注: 工作邮件,朋友邮件,家庭邮件,爱好邮件 ; 医疗图表(medical diagrams): 没有生病,着凉,流感; 天气:晴天,多云,雨,雪

多类分类问题如下所示:



对于多类分类问题,可以将其看做成二类分类问题:保留其中的一类,剩下的作为另一类。



对于每一个类 i 训练一个逻辑回归模型的分类器h(i)θ(x),并且预测 y = i时的概率;

对于一个新的输入变量x, 分别对每一个类别进行预测,取概率最大的那个类作为分类结果:



逻辑回归参数求解

一般回归问题的步骤是:
1. 寻找预测函数(h函数,hypothesis)
2. 构造损失函数(J函数)
3. 使损失函数最小,获得回归系数θ

而第三步中常见的算法有:
1. 梯度下降
2. 牛顿迭代算法
3. 拟牛顿迭代算法(BFGS算法和L-BFGS算法)
其中随机梯度下降和L-BFGS在spark mllib中已经实现,梯度下降是最简单和容易理解的。

预测函数上面已经给出了,现在需要构造损失函数J



推导过程可以参看:

http://blog.jobbole.com/88521/

http://blog.csdn.net/oldbai001/article/details/49872433

最终梯度迭代公式如下:



theata初始化为向量[1,1........1],迭代上面公式,让theata收敛,得到最后结果。

逻辑回归训练模型伪代码

#输入参数1是100行,2列的矩阵 dataMatIn;

#输入参数2是100行,1列的矩阵,取值都是0或1 classLabels;

def gradAscent(dataMatIn, classLabels):
# (以下两行)转换为NumPy矩阵数据类型
dataMatrix = mat(dataMatIn)
labelMat = mat(classLabels).transpose()
m,n = shape(dataMatrix)
alpha = 0.001
maxCycles = 500 #迭500找到
weights = ones((n,1)) #初始化成n行1列的全为1的矩阵
for k in range(maxCycles):
#(以下三行)矩阵相乘
h = sigmoid(dataMatrix*weights) #矩阵相乘,得到100行,1列的矩阵,利用逻辑回归把它变成100行1列的矩阵,每个值介于0到1之间,h是对label的一个估计
error = (labelMat - h)  #估计与实际值之间差距为error,error也是一个100行1列的矩阵;
weights = weights + alpha * dataMatrix.transpose()* error  #后面3项乘的结果是2行1列的矩阵,代表了估算的结果与实际结果是超了还是低了,从而修改weights。
return weights

由于每次迭代都会导致weights朝labelMat的方向靠近,因此经过500次的循环,最终能得到较好的结果,能很好的确定weights的两个参数。

逻辑回归代码python实现

https://github.com/jimenbian/DataMining/blob/master/LogisticRegression/src/LR.py

Spark Java实现

https://github.com/apache/spark/blob/master/examples/src/main/java/org/apache/spark/examples/mllib/JavaLogisticRegressionWithLBFGSExample.java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息