清晰易懂的逻辑回归算法总结

逻辑回归(Logistic Regression)在20世纪早期的生物科学得到应用,广泛应用与很多社会科学,很多事物发展的规律符合逻辑回归曲线。

本文介绍的逻辑回归应用于分类任务,即目标变量是分类变量。

比如:

  • 预测邮件是否是垃圾邮件(1)或(0)

  • 预测肿瘤是否是恶性肿瘤(1)或(0)

其中1和0分别表示是和否。

考虑这样一个常见,我们需要对电子邮件是否属于垃圾邮件进行分类。如果我们对这类问题使用线性回归,就需要设置一个阈值,根据这个阈值可以进行分类。假设实际类为恶性,预测连续值为0.4,阈值为0.5,则该数据点被归为非恶性肿瘤,这种模型会导致严重的后果。

从这个例子可以看出,线性回归不适合分类问题,线性回归是无界限的,因此引入了逻辑回归,逻辑回归的界限值为0到1。

1.逻辑回归模型

输出 : 0 或 1

模型的假设函数:

其中Sigmoid函数为:

用图形表示:

由公式可知,如果变量 Z 趋向于无穷大,那么预测变量 Y 等于1;如果变量 Z 趋向于负无穷大,预测变量 Y 等于0。

2.模型的假设函数分析

假设函数输出变量的含义是预测概率,用来推断在给定输入值X时,预测值与真实值的置信度。

考虑如下例子,预测邮件是否是垃圾邮件,给定如下输入变量:

 

基于输入变量 x1 的值,假设我们得到的估计概率是0.8,也就是说属于垃圾邮件的概率是0.8。

数学上可以写成:

含义为:模型参数为 ,给定输入变量X,输出变量Y等于1的概率。 

对于二分类模型来说,由上式可以推导如下等式:

这就证明了“逻辑回归”这个名称的合理性。首先将数据拟合到线性回归模型中,然后通过逻辑函数预测目标标量。

3.逻辑回归类型

1. 二元逻辑回归

目标变量只有两个可能的结果,例如:是否是垃圾邮件

2. 无序多项逻辑回归

目标变量是三个或三个以上的类别,与顺序无关,例如:预测哪种食物更受欢迎(素食,非素食,纯素食)

3. 有序多项逻辑回归

目标变量是三个或三个以上的类别,与顺序有关,例如:预测电影评分,从1颗星到5颗星。

4.决策边界

为了预测数据属于哪一类,可以设置一个阈值,比较预测的估计概率和阈值,得到分类结果。

逻辑回归的阈值常常设置为0.5,也就是说,如果预测的估计概率 ≥ 0.5时,则属于垃圾邮件,反之则不属于垃圾邮件。

决策边界可以是线性的也可以是非线性,多项式阶数的增加可以得到复杂的决策边界,我们可以用支持向量机的核函数来理解。

5.损失函数

逻辑回归的损失函数为:

线性回归使用均方误差作为其损失函数,为什么逻辑回归不使用均方差?

因为若使用均方误差作为逻辑回归的损失函数,那么该函数是非凸函数。若损失函数是非凸函数(Non-convex)时,梯度下降算法可能收敛局部极小值;损失函数是凸函数(Convex)时,梯度下降算法收据全局最小值。如下图:

损失函数详细解释

如果真实目标变量等于1,即:

对应的图形如下:

如果真实目标变量等于0,即:

对应的图形如下:

结合上面的介绍,逻辑回归损失函数简化为:

如果y=1时,损失函数为:

如果y=0时,损失函数为:

6.为什么使用这个损失函数

我们假设  是给定输入变量 x ,输出变量 y 为1的概率,即:

那么输出变量y为0的概率:

根据上面两式,可得模型输出变量y的概率为:

上式是不是有点眼熟,其实上式就是似然函数的定义。

我们对上式取对数,得:

这个式子和我们前面介绍过的损失函数是相反数,即:

因此,逻辑回归最大化似然函数等价于最小化损失函数,这就是我们为什么使用这个损失函数的原因。

7.逻辑回归模型的求解过程

我们使用梯度下降法求解模型的最优参数:

上图知道了不同变量的梯度表达式,因此损失函数的参数梯度为:

逻辑回归模型的Python实现:

def weightInitialization(n_features):
    w = np.zeros((1,n_features))
    b = 0
    return w,b
def sigmoid_activation(result):
    final_result = 1/(1+np.exp(-result))
    return final_result

def model_optimize(w, b, X, Y):
    m = X.shape[0]
    
    #Prediction
    final_result = sigmoid_activation(np.dot(w,X.T)+b)
    Y_T = Y.T
    cost = (-1/m)*(np.sum((Y_T*np.log(final_result)) + ((1-Y_T)*(np.log(1-final_result)))))
    #
    
    #Gradient calculation
    dw = (1/m)*(np.dot(X.T, (final_result-Y.T).T))
    db = (1/m)*(np.sum(final_result-Y.T))
    
    grads = {"dw": dw, "db": db}
    
    return grads, cost
def model_predict(w, b, X, Y, learning_rate, no_iterations):
    costs = []
    for i in range(no_iterations):
        #
        grads, cost = model_optimize(w,b,X,Y)
        #
        dw = grads["dw"]
        db = grads["db"]
        #weight update
        w = w - (learning_rate * (dw.T))
        b = b - (learning_rate * db)
        #
        
        if (i % 100 == 0):
            costs.append(cost)
            #print("Cost after %i iteration is %f" %(i, cost))
    
    #final parameters
    coeff = {"w": w, "b": b}
    gradient = {"dw": dw, "db": db}
    
    return coeff, gradient, costs
def predict(final_pred, m):
    y_pred = np.zeros((1,m))
    for i in range(final_pred.shape[1]):
        if final_pred[0][i] > 0.5:
            y_pred[0][i] = 1
    return y_pred

损失函数与迭代次数的关系:

此Python实现是用于二元逻辑回归,对于超过两个类的数据,我们建议使用softmax回归。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值