逻辑回归的用途
逻辑回归常用于预测疾病发生的概率,例如因变量是是否恶性肿瘤,自变量是肿瘤的大小、位置、硬度、患者性别、年龄、职业等等(很多文章里举了这个例子,但现代医学发达,可以通过病理检查,即获取标本放到显微镜下观察是否恶变来判断);广告界中也常用于预测点击率或者转化率(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之间连续),它被用来判断一个学习算法是否正确。
除了正确和不正确的结果之外,使用逻辑回归的好处在于,它还能告诉你,你离正确的结果还差多少,从而引导你向正确的方向前进。因此它常常和梯度上升的算法结合起来。
逻辑回归的预测模型
逻辑回归不是回归问题,而是二分类问题,因变量不是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
推导过程可以参看:
最终梯度迭代公式如下:
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实现
Spark Java实现