大家好,我是Petter Guo
对Coding
充满热情的🐂🐎,坚信实操出真知
。在这里,你将听到最真实的经验分享
,绝不贩卖焦虑,只提供积极向上的硬核干货
,助你一路前行!
如果对你有帮助, 请点赞
+ 收藏
+关注
鼓励下, 学习公众号为 全栈派森
。
继前三节课的学习, 我相信对机器学习的概念以及使用, 都有了一定的了解。
本节知识点
- 阶跃函数
- 逻辑回归Sigmoid函数
- 逻辑回归假设函数
- 逻辑回归损失函数
- 逻辑回归梯度下架
用线性回归 + 阶跃函数完成分类
左图中的x和y明显呈现出连续渐变的特征,是线性关系,适合用线性回归模型建模;
右图中的x是0-100的值,代表成绩,y则不是0-1的连续值,y只有两个结果,要么通过考试(y=1), 要么考试挂科(y=0);
如果用一条直线来画出这个分类回归的模型, 并且损失最少,就是各个数据点到回归线的距离最少, 应该怎么画出这条线, 下面哪条是正确的(损失最少的那条)
如果斜率变小, 那么位于0-1中点的分数就会发生改变, 可能是60分, 也可能是50分,这样考试及格的分数就会发生变化, 和实际中想的就会不一致, 如下图所示;
通过Sigmoid函数进行转换
因此需要想出一个办法对当前模型进行修正, 使之既能够更好的拟合以概率为代表的分类结果, 又能够抑制两边比较接近0和1的极端例子,使之钝化,同时还必须保持函数拟合对中间部分数据细微变化的敏感度
这种S形的函数, 能够很好的0.5这个临界点, 类似样本的分类概率将无限逼近0或1, 样本越靠近分类阀值, 函数对它们越敏感。
这种S形的函数, 被称为logistic function, 翻译为逻辑函数。在机器学习中, logistic function 被广泛应用于逻辑回归分类和神经网络激活过程。
Sigmoid函数是最为常见的机器学习逻辑函数。公式为:
这里的自变量的符号z是一个中间变量,代表的是线性回归的结果。而这里g(z)输出的结果是一个0-1的数字(无穷小-无穷大), 也代表分类概率。
Sigmoid函数的代码实现:
# 输入中间变量z, 返回 y‘
y_hat = 1 / (1 + np.exp(-z))
通过Sigmoid函数就能够比阶跃函数更好的把线性函数求出的数值,转换为一个0-1的分类概率值。
逻辑回归的假设函数
有了Sigmoid函数,就可以建立逻辑回归的机器学习模型。重点要确定假设函数h(x), 来预测y‘。
将线性回归和逻辑函数整合起来, 形成逻辑回归的假设函数。
-
首先通过线性回归模型求出一个中间值z, z = w0X1 + w1X1 + ... + wnXn + b = W^TX。是一个连续值, 区间并不在[0, 1]之间, 可能小于0或大于1, 范围从无穷小到无穷大。
-
通过逻辑函数把这个中间值z转化成0-1的概率值,以提高拟合效果。
-
结果步骤(1) 和 (2), 把新的函数表示假设函数的形式:
这个值就是逻辑回归算法得到的y‘。
-
最后根据y’所代表的概率, 确定分类结果。
- 如果 h(x) 值大于等于0.5, 分类结果为1。
- 如果 h(x) 值小于0.5, 分类结果为0。
上述过程中的关键在于选择Sigmoid函数进行从线性回归到逻辑回归的转换。优点如下:
- Sigmoid函数是连续函数, 具有单调递增性(类似递增的线性函数)。
- Sigmoid函数具有可微性, 可以进行微分, 也可以进行求导。
- 输出范围为[0, 1], 结果可以表示为概率的形式, 为分类输出做准确。
- 抑制分类的两边, 对中间区的细微变化敏感, 这对分类结果拟合效果好。
逻辑回归的损失函数
有了假设函数, 下一步就要确定函数的具体参数。
要想确定具体参数, 还需要一个损失函数。
把训练集中所有的预测所得概率和实际结果的差异求和,并取平均值, 既可以得到平均误差, 这就是逻辑回归的损失函数:
这里想到线性回归的损失函数MSE, 想不起来的可以阅读“机器学习第二课”进行知识回顾, 在逻辑回归中,不能使用MSE, 因为经过了一个逻辑函数转换后, MSE对于w和b而言, 不再是一个凸函数, 这样的话,就无法通过梯度下降找到全局最低点。
为了避免陷入局部最低点, 为逻辑回归选择了符合条件的新的损失函数, 公式如下:
逻辑回归损失函数的python实现:
loss = -(y_train * np.log(y_hat) + (1-y_train) * np.log(1 - y_hat)
逻辑回归的梯度下降
损失函数经过Sigmoid变换之后是可微的, 也就是说每一个点可以求导, 而且是凸函数,存在全局最低点。梯度下降的目的就是把w和b调整,再调整,直至最低的损失点。
逻辑回归的梯度下降过程和线性回归一样, 也就是先进行微分, 然后把计算出来的导数乘以一个学习速率a, 通过不断的迭代, 更新W和b, 直至收敛。
逻辑回归的梯度计算公示如下:
代码实现:
def gradient_descent(X, y, w, b, lr, iter):
# 初始化记录梯度下降过程中误差值(损失)的数组
l_history = np.zeros(iter)
# 初始化记录梯度下降权重的数组
w_history = np.zeros((iter, w.shape[0], w.shape[1]))
b_history = np.zeros(iter)
for i in range(iter):
# sigmoid 逻辑函数 + 线性函数(wX + b) 得到y‘
y_hat = sigmoid(np.dot(X, w) + b)
loss = -(y * np.log(y_hat) + (1-y)*np.log(1-y_hat)) #计算损失
derivative_w = np.dot(X.T,((y_hat - y))) / X.shape[0] # 给权重向量求导
derivative_b = np.sum(y_hat - y) / X.shape[0] # 给偏置求导
w = w - lr * derivative_w
b = b - lr * derivative_b
l_history[i] = loss_function(X, y, w, b) # 梯度下降过程中的损失
print("轮数", i + 1, "当前轮训练集损失:", l_history[i])
w_history[i] = w
b_history[i] = b
return l_history, w_history, b_history
这段代码和上一课中线性回归的梯度下降函数代码整体结构一致, 都是对weight.T进行点积。此处只是增加了Sigmoid函数的逻辑转换, 然后使用了新的损失函数。
逻辑回归Sigmoid函数仅对解决二元分类问题的机器学习模型, 即输出范围是0-1(独立的)。如果进行多元分类问题, 就要选择Softmax函数。
总结
- 逻辑回归本身是线性分类模型,它的决策边界是线性的。它通过 Sigmoid 函数将线性组合的结果映射到概率,但这种映射并不改变其线性分类的本质。
- 机器学习中的“非线性”指的是模型能够学习非线性决策边界或非线性函数关系的能力。
- 神经网络是典型的非线性模型,其非线性能力主要来源于隐藏层中使用的非线性激活函数。