机器学习是指通过学习已有数据中的统计规律,使计算机能够预测未知数据。一个完整的机器学习项目分为两个阶段:训练(Training)和推理(Inference)。计算机学习已有数据的过程被称为训练阶段,预测未知数据的过程被称为推理阶段。
给定数据集 D ={( x 1 , y 1 ),( x 2 , y 2 ), …, ( x m , y m )},其中包含 m 个数据对。第 i 条数据为( x i , y i ),这条数据被称为一组训练样本(Training Example)。在2.1节的房价预测例子中, x i 是一个特征向量,其中的每个元素是数据科学家构建的特征,例如街区收入、房屋年龄、房间数、卧室数、街区人口等。基于这些数据,我们可以使用某种机器学习模型进行建模,从数据中学习规律,并得到一个模型。此时,数据集 D 被称为样本(Sample)或训练集(Training Set), x 为特征(Feature), y 为真实值(Label)或目标值(Target)。
我们从线性回归开始了解机器学习模型的数学原理。在中学阶段,我们常用公式
y
=
ax
+
b
来对很多问题进行建模,此方程描述了变量
y
随着变量
x
的变化关系,表现为一条直线。建立这样的数学模型后,给定
x
,我们就可以得到预测的
(统计学家通常在变量
y
上加上“帽子”来表示预测值,以与真实观测到的数据相区分)。该方程只有一个自变量
x
,且不包含平方、立方等非一次项,因此称为一元线性方程。
在对数据集进行建模时,我们从最简单的情况入手,假设只关注房屋面积(
x
)和房价(
y
)两个维度的数据。我们可以通过调整参数
a
和
b
的值,生成不同的直线,构成一个参数家族。在这些参数组合中,有一个组合是最佳的,它能够以统计上最优的方式拟合数据集。一元线性回归的监督学习过程可以定义为:给定
m
个数据对(
x
,
y
),寻找最佳参数a
*
和b
*
,使模型可以更好地拟合这些数据。
a
和
b
可以取不同的参数,到底哪个参数组合是最佳的呢?如何衡量模型是否以最优的方式拟合数据呢?机器学习使用损失函数(Loss Function)来衡量这个问题。损失函数又称为代价函数(Cost Function),它计算了模型预测值
和真实值
y
之间的差异程度。从名字也可以看出,这个函数计算的是模型犯错的损失或代价,损失函数越大,模型越差,越不能拟合数据。统计学家通常使用
来表示损失函数。
对于线性回归,一个简单实用的损失函数为预测值与真实值误差平方的平均值。在下面的公式中, i 表示数据集中的第 i 个样本点:
在此基础上,代入公式
,得到:
对于给定数据集, x 和 y 的值是已知的,而参数 a 和 b 是需要求解的。模型的求解过程就是解出下面公式的过程:
其中,argmin是一个常见的数学符号,表示寻找使 L 函数最小的参数组合 a *和 b *。
求解这个函数通常有两种方法:
● 基于微积分和线性代数的知识,求出使得 L 的导数为0的点。这个点一般为最优解。这种方式适用于解简单的模型。
● 基于梯度下降法,通过迭代不断搜索最优点。梯度下降法能解决很多复杂的模型,例如深度学习模型。2.3节将进一步解释梯度下降法。
我们现在把回归问题扩展到更为一般的场景。假设 x 是多元的,或者说是多维的。例如,在预测房价时,需要考虑许多因素,包括学区、卧室数量(如两居、三居、四居)、周边商业、交通等。例如下面的公式,每个因素对应一个权重 W :
W 是参数(Parameter),也称为权重(Weight)。这里共有 n 个影响因素,在机器学习领域,将这 n 个影响因素称为特征(Feature)。用向量表示为:
f ( x ) = b + W x
要预测的 y 是实数,范围从负无穷到正无穷。用于预测实数的模型被称为回归模型。
回归问题是指目标值属于整个实数域,而分类问题则是指目标值为有限的离散值。例如,在情感分类任务重,目标值有0和1两种可能值,分别表示负向和正向情感。一个二分类函数可以表示为:
在线性回归的基础上,在其外层加上一个函数 g ( z ):
这个 g ( z )被称为Sigmoid函数或Logistic函数。下面对Sigmoid函数进行可视化。
%config InlineBackend.figure_format = 'svg' import matplotlib.pyplot as plt import numpy as np fig, axs = plt.subplots(1, 1, figsize=(4, 3), sharey=True) # 创建X轴的数据 x = np.linspace(-4, 4, 200) # 创建sigmoid函数的Y轴数据 sigmoid = 1 / (1 + np.exp(-x)) plt.plot(x, sigmoid, label='Sigmoid function') plt.title('Sigmoid') plt.xlabel('x') plt.ylabel('g(x)') plt.grid(True, which='both', linestyle='--', linewidth=0.5) plt.tight_layout() plt.show()
运行结果如图2.4所示。
图2.4 运行结果3
Logistic函数的性质决定了它可以将(-∞, ∞)映射到(0,1)上,Logistic函数有明确的分界线,在中心点处取值为0.5,因为Logistic函数有明确的分界线,可以用来进行分类。我们将线性回归代入Logistic函数,可以得到:
这里不再赘述Logistic回归的训练和求解过程的数学推导,感兴趣的读者可以在互联网上查找相关资料。