1.什么是逻辑回归?
逻辑回归是一种常用的统计学习方法,主要用于解决分类问题。尽管名字中包含"回归",但它实际上是一种分类算法
2.为什么机器学习需要使用逻辑回归
1.二元分类
这是逻辑回归最基本和常见的用途。它可以预测某个事件是否会发生,输出结果为是或否
例如:
- 预测用户是否会点击广告
- 判断邮件是否为垃圾邮件
- 诊断患者是否患有某种疾病
这些例子都有一个共同的特征,就是只有两个结果,真(1)和假(0)
2.多类别分类
通过一对多(One-vs-Rest)或softmax等方法,逻辑回归可以扩展到多类别分类问题
例如:
- 图像识别中的物体分类
- 文本分类(新闻分类、情感分析等)
这些例子都有一个共同的特征,就是同一种对象有多个可能的结果,类似于咱们常见的单选题,选项有多个,但是最符合答案的选项只有一个
3.概率预测
逻辑回归不仅给出分类结果,还能输出概率值,这在很多场景下非常有用
例如:
- 预测客户购买某产品的概率
- 评估贷款申请人的违约风险概率
这些例子都有一个共同的特征,那就是预测,即用已知的结果去推出未知的结果
如果你还没有听懂逻辑回归的作用,没关系,我再给你举个通俗易懂的例子
想象你是一个医生,需要判断病人是否患有某种疾病。逻辑回归就像一个智能助手,帮你做这个判断。就像医生会看病人的各项体检指标一样,逻辑回归会考虑多个相关因素(我们称之为特征)。有些指标可能比其他指标更重要。逻辑回归会给每个因素分配一个"权重",反映其重要性。最后,它不会简单地说"是"或"否",而是给出一个概率。比如"这个病人患病的可能性是70%"。你可以设定一个标准,比如超过50%就认为是"是",否则就是"否"。逻辑回归通过大量的已知案例来"学习"。就像医生通过大量病例积累经验一样。
当然,逻辑回归的作用远不止于此,限于篇幅(其实是我自己想偷懒),就不多做介绍了
3.OK,接下来我们来引入逻辑回归的公式
我个人不喜欢啰里啰唆的给你一大堆数学公式,然后告诉你底层原理就是这些数学公式,让你自己慢慢去领悟。我希望的是能把几个核心的公式给刨析出来,为什么需要用这几个公式就够了,这是我希望能够在我的文章里讲明白的事情
1.线性回归公式
y = b0 + b1x1 + b2x2 + ... + bn*xn
- y 是因变量,即我们要预测的值。
- b0 是截距,表示当所有自变量都为 0 时,因变量的值
- b1, b2, ..., bn 是回归系数,表示每个自变量对因变量的影响程度
- x1, x2, ..., xn 是自变量,即用来预测因变量的值
这里举出一个线性回归的样例
代码看不懂没关系,看图就行了
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.font_manager as fm
# Generate some simulated house data
np.random.seed(0)
area = np.random.rand(100) * 200 + 50 # House area (square meters)
price = 2 * area + 5000 + np.random.randn(100) * 500 # House price (ten thousand yuan)
# Fit the data using linear regression
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(area.reshape(-1, 1), price)
# Get the regression coefficients
b0 = model.intercept_
b1 = model.coef_[0]
# Plot the scatter plot
plt.scatter(area, price, label="House Data")
# Plot the regression line
plt.plot(area, b0 + b1*area, color="red", label="Linear Regression")
# Set the plot title and axis labels
plt.title("Linear Regression of House Area and Price")
# Set the font to SimSun (楷体)
font_prop = fm.FontProperties(fname=r"C:\Windows\Fonts\simkai.ttf", size=12) # Replace with your SimSun font path
plt.xlabel("House Area (Square Meters)", fontproperties=font_prop)
plt.ylabel("House Price (Ten Thousand Yuan)", fontproperties=font_prop)
# Add legend
plt.legend()
# Show the plot
plt.show()
1.生成100个房屋模拟数据
np.random.seed(0)
area = np.random.rand(100) * 200 + 50
price = 2 * area + 5000 + np.random.randn(100) * 500
2.使用线性回归拟合数据
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(area.reshape(-1, 1), price)
3.获取回归系数(b0 ~ bn)
b0 = model.intercept_
b1 = model.coef_[0]
4.绘制散点图
plt.scatter(area, price, label="House Data")
5.绘制回归线
plt.plot(area, b0 + b1*area, color="red", label="Linear Regression")
6.设置文章标题
plt.title("Linear Regression of House Area and Price")
7. 设置字体为楷体&&字体大小(如果有的话)
font_prop = fm.FontProperties(fname=r"C:\Windows\Fonts\simkai.ttf", size=12)
plt.xlabel("House Area (Square Meters)", fontproperties=font_prop)
plt.ylabel("House Price (Ten Thousand Yuan)", fontproperties=font_prop)
8. 添加图例
plt.legend()
9.展示图表
plt.show()
这段代码使用线性回归来拟合房屋面积和价格之间的关系(用英文描述横纵标题是为了不报错)
运行结果如下:
有人可能就会问了:我们搞这么一大堆数据出来干嘛呢?
问得好~
有了这些数据,我们是不是就可以大致算出 y = b0 + b1x1 + b2x2 + ... + bn*xn 的系数了呢?
具体来说:
- y 代表我们要预测的目标变量,例如房屋价格。
- x1, x2, ... xn 代表影响目标变量的因素,例如房屋面积、房间数量、地理位置等等。
- b0, b1, b2, ... bn 代表每个因素对目标变量的影响程度,也就是我们要算出的系数。
通过收集大量数据,我们可以使用线性回归模型来计算出这些系数,并建立一个预测模型。 这个模型可以帮助我们理解不同因素对目标变量的影响,并预测未来目标变量的值(类似于数学里的 y = kx + b,有了具体的k和b,我们就可以通过得到x来预测y,区别就是这里的系数k更多)
2.sigmoid 函数公式
σ(x) = 1 / (1 + exp(-x))
sig函数的图像如下所示:
问题一:为什么选用sigmoid函数?
我们之前说到过,逻辑回归最基本的用途是为了解决二分类问题的
逻辑回归的目标是将线性模型的输出(可以是任何实数)转化为一个概率值,这个概率值代表着某事件发生的可能性,而概率值自然应该在 0 到 1 之间。
sigmoid 函数就完美地完成了这个任务:它将线性模型的输出压缩到 0 到 1 之间,并且随着输入值的增加,输出值也逐渐增加,这与概率值的变化趋势相吻合
你看sig的函数,趋近于正无穷则无限趋近于1,趋近于负无穷则无限趋近于0,是不是正好符合我们的非0即1的问题呀~
问题二:sigmoid函数如何分类?
那有人又要说了,那你这也不对啊,虽然说两边的可以无限趋近,但是中间的没法弄啊,比如说0.5在0和1的中间,那你说0.5是趋近于0还是趋近于1呢?
虽然说中间的数不能够趋近,但是我可以人为规定啊~
比如我将 >= 0.5 的数归到1的分类里,将 < 0.5的数归到0的分类里,这样问题不就解决了~
所以,0.5 并不是一个临界点,而是我们人为设定用来进行分类的阈值
3.逻辑回归公式
p = σ(b0 + b1*x1 + b2*x2 + ... + bn*xn) = 1 / (1 + exp(-(b0 + b1*x1 + b2*x2 + ... + bn*xn)))
之前我们说了这么多,就是为了引入这个公式
是不是看着就头疼?我看着也头疼,不如我们将它简化一下吧~
你看,这样是不是就清爽多了,就像一个不爱打扮的帅哥,稍微整理了一下自己的容貌,之后你发现,哇塞原来这个人长得这么帅~
咳咳,跑题了~ 所以逻辑回归其实就是 线性回归 + sigmoid函数
sigmoid函数里的 z 就是用线性回归的 y = b0 + b1x1 + b2x2 + ... + bn*xn 去替代
那么这样有什么作用呢?
OK,来让我们看一看~
4.逻辑回归的本质及作用
逻辑回归的本质是预测事件发生的概率。它并不是直接对数据进行分类,而是通过一个函数(Sigmoid 函数)将线性回归的结果映射到 0~1 区间,这个区间内的值代表着事件发生的可能性
逻辑回归的基础是线性回归。线性回归建立一个线性模型,试图用一个线性函数来拟合数据,得到一个预测值。这个预测值可以是任何值,不受 0~1 区间的限制
Sigmoid 函数是一个“魔法”函数,它将线性回归得到的预测值转换到 0~1 区间,并且这个区间内的值可以被解释为事件发生的概率
为了进行二分类,我们需要设置一个阈值,通常是 0.5。如果预测的概率大于阈值,则判定为正类,否则判定为负类
例如这样:
左边函数可以看成 线性回归函数 而右边函数则是映射后的 sigmoid 函数