ML-Andrew NG 学习笔记(3) Classification & Logistic Regression

如前文提到的例子,对肿瘤大小进行分类,以此来预测是良性或是恶性,当数据比较集中时,使用线性回归也许会奏效,但当出现某些数据时,表现会变得很不好。

当引入最右侧方框内的数据点后,拟合的直线及阈值受到的影响,误差都变得非常大
当引入最右侧方框内的数据点后,拟合的直线及阈值受到的影响,误差都变得非常大

对于这种分类,不需求预测出本身大小的问题(如期望输出0或1这样的值),考虑采用逻辑回归Logistic Regression

现在很好地拟合了数据集
现在很好地拟合了数据集

在逻辑回归中,有如下几种常用的处理方法:

  • Sigmoid Function:将实数映射到区间 (0,1) 上。在逻辑回归中,我们通常使用 Sigmoid 函数作为激活函数,将线性回归的结果转换为一个概率值,从而进行分类。

  • Softmax Functon: 将多个线性输出映射为一个概率分布。在多分类问题中,Softmax函数通常被用来将线性输出转化为概率分布,可以对每个类别进行概率预测。

  • ReLU Function (Rectified Linear Unit):在神经网络中广泛应用。ReLU函数在输入大于0时输出输入值本身,否则输出0。这种激活函数的好处是计算速度快且具有稀疏性,因此可以有效地减少过拟合现象。

Sigmoid Function:

a.定义

和前文的曲线很像,但是sigmoid function是一种数学函数,而逻辑回归是一种算法
和前文的曲线很像,但是sigmoid function是一种数学函数,而逻辑回归是一种算法

**     表达式**:

post image

如何构建逻辑回归模型? 这里拿线性回归的式子举例

g(x)是指sigmoid function
g(x)是指sigmoid function

由于e作为底数,且其指数带有负号,同时整体处于分母,输入的z值处理后加上1,很容易使*f(x)*的值趋近于0或者1;又因为始终处于0~1之间,可以将其理解为输出类为1的概率

z=wx+b只是便于说明建立的一个函数,w和b参数不断进行调整,使得能更好预测

一个推导:假如取0.5为阈值,最终可以得到 利用 w·x+b 是否大于0来判断输出为0或1
一个推导:假如取0.5为阈值,最终可以得到 利用 w·x+b 是否大于0来判断输出为0或1

b.决策边界(Decision boundary)

继续拿线性的 z=w·x+b 举例,其对应的决策边界是当z=0的直线,即 w·x+b=0

不过线性并不存在决策边界,不过决策边界本身可以分线性与非线性

举例1(线性)

有着两个特征w_1, w_2
有着两个特征w_1, w_2

假设w_1, w_2, b分别为1,1,-3,则其对应的决策边界为 z=x_1+x_2-3=0,

即x_1 + x_2 = 3

例子1
例子1

举例2(非线性):

当变量w_1和w_2并不呈现简单的线性关系时,可能如这个例子这样,需要用到多项式
当变量w_1和w_2并不呈现简单的线性关系时,可能如这个例子这样,需要用到多项式

假设w_1, w_2, b分别为1,1,-1,则其对应的决策边界为 z=x_1^2+x_2^2-1=0,

即x_1^2+x_2^2=1

例子2
例子2

c.逻辑回归的成本函数

线性回归时的成本函数是这样的:

1/2在外面
1/2在外面

而对于逻辑回归

1/2在里面
1/2在里面

如果仍然使用1/2在外面的成本函数,梯度下降呈现的图像将会是:

不好找到全局最优点
不好找到全局最优点
线性回归时会生成标准的碗状,而逻辑回归不会
线性回归时会生成标准的碗状,而逻辑回归不会

现在将求和符号内的部分称作 单个训练样本的成本,用L表示

交叉熵或对数损失(the cross entropy or the log loss)
交叉熵或对数损失(the cross entropy or the log loss)

以上两种情况对应的图像如下,但我们输入的值始终位于0-1,因此只需考虑图像0-1之间的部分

拆开看便是下图
拆开看便是下图
x轴是sigmoid的输出,非常严格地只能存在0或1
x轴是sigmoid的输出,非常严格地只能存在0或1

如果y = 1,真实标签的确为1。如果标签的预测值也为1,则成本= 0。但是当hθ(x)偏离1并接近0时,成本函数呈指数增长并趋于无穷大

如果y = 0,则真实标签为0。如果标签的预测值也为0,则Cost = 0。但是当hθ(x)偏离0并接近1时,成本函数呈指数增长并趋于无穷大

通过这样的处理,当预测正确时,成本为0;而预测错误,惩罚极大,这使得模型不断向最佳处逼近,因此总体的将会呈现凸函数的图像

有了这样的处理,loss function可以这样改写:

y取值为0或1等号右边均只会存在一项,是前文L的整合
y取值为0或1等号右边均只会存在一项,是前文L的整合

现在我们就可以得到逻辑回归的成本函数了:

post image

代码实现:

def compute_cost_logistic(X, y, w, b):
    """
    Computes cost

    Args:
      X (ndarray (m,n)): Data, m examples with n features
      y (ndarray (m,)) : target values
      w (ndarray (n,)) : model parameters  
      b (scalar)       : model parameter
      
    Returns:
      cost (scalar): cost
    """

    m = X.shape[0]
    cost = 0.0
    for i in range(m):
        z_i = np.dot(X[i],w) + b
        f_wb_i = sigmoid(z_i)
        cost +=  -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i)
             
    cost = cost / m
    return cost

参考来源:

https://www.geeksforgeeks.org/ml-cost-function-in-logistic-regression/