本文是我在美团进行机器学习分享的文档,在此之前我对机器学习的原理没有任何了解,可以看作是机器学习初学者的心得分享。

机器学习

机器学习是一门通过编程让计算机从数据中进行学习的科学(和艺术)。

一个计算机程序利用经验E来学习任务T,性能是P,如果针对任务T的性能P随着经验E不断增长,则称为机器学习。

适合的场景

  1. 需要大量微调或复杂规则的问题

    • 例如,垃圾邮件过滤。传统方法常依赖大量手动编写的规则(如邮件标题包含某些关键词)。机器学习可以通过学习数据中的模式自动生成规则,减少人为干预和维护工作。
  2. 传统方法无法解决的复杂问题

    • 大语言模型是一个典型例子。这些模型能够理解和生成自然语言,捕获多维度数据关系,是传统算法难以完成和处理的自然语言任务。
  3. 环境不断变化的问题

    • 垃圾邮件识别中,发送者可能会不断更改邮件内容以绕过规则。机器学习系统可以根据新数据快速再训练,保持最新状态,灵活适应复杂和动态的环境变化。
  4. 已有大量数据的复杂问题

    • 对于数据丰富的复杂问题,机器学习能够有效挖掘数据中的深层模式和关系,优化决策过程,提升解决方案的准确性和效率。

分类

上面只介绍了机器学习宏观上的概念,但针对具体如何实现机器学习有各种不同的方法,而这些方法可以简单的根据是否有人类监督区分:

本次分享主要介绍监督式学习和无监督式学习

方法

无论是采用监督式学习还是无监督学习,机器学习问题都有一套通用的解决问题的范式:

  1. 作出假设,选择模型

  2. 训练模型

  3. 评估模型效果

下面我们也将用这个思路介绍各种学习方法。

监督式学习

监督式学习中使用的数据是带标签的,这意味着其中的样本包含输入(称为特征)和正确输出(标签)。算法会分析包含这些训练对的大型数据集,以便在被要求根据新数据进行预测时,推断出正确的输出值。

监督学习可以解决两类问题:回归问题和分类问题。

回归 (Regression)

回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。

在机器学习领域中的大多数任务通常都与预测(prediction)有关。 当我们想预测一个数值时,就会涉及到回归问题。 常见的例子包括:预测价格(房屋、股票等)、预测住院时间(针对住院病人等)、 预测需求(零售销量等)。

线性回归(linear regression)在回归的各种标准工具中最简单且最流行,我们将用线性回归的方法来分析一个实际的例子: 根据房屋的面积(平方米)和房龄(年)来估算房屋价格(元)

线性模型作出的假设

我们可以假定面积 ($area$) 和房龄 ($age$) 与房屋价格 ($price$) 之间的关系是线性的,即目标(房屋价格)可以表示为特征(面积和房龄)的加权和,如下面的式子:

$$
price = w_{area} * area + w_{age} * age + b
$$

于是我们有了一个可以通过 $area$ 和 $age$ 两个参数预测 $price$ 的公式,但美中不足的是 $w_{area}$ 和 $w_{age}$ (即 area 和 age 两个特征的权重) 和 $b$ (即 bias,偏置,即所有权重都为0时应当取的 price 值) 都是未知的。所以现在我们的目标就从预测房价这个宏观的问题变成了获取合适的 $w_{area}$ $w_{age}$ 和 $b$。

让我们将这个公式转化为一个更通用的公式,$\hat{y}$ 表示预测值,$x_n$ 表示第 n 个特征的值,$w_n$ 表示第 n 个特征的权重,而 $b$ 表示偏置量:

$$
\hat{y} = w_1 x_1 + w_2 x_2 + … + w_n x_n + b
$$

一般机器学习中输入的特征都是高维度的,这种情况下我们将特征的值全部放入向量 $X$,把特征的权重全部放进向量 $\bold{w}$,这样公式就可以以矩阵点积的形式更清晰的表达:

$$
\hat{y} = \bold{w^\intercal} X + b
$$

损失函数

在我们考虑如何让 $\bold{w}$ 和 $b$ 更加准确,即如何**拟合 (fit) 函数时,我们需要一个拟合程度的度量。损失函数 **(loss function) 可以量化目标实际值和预测值之间的差距。通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0。回归问题中最常用的损失函数是平方误差函数。 当样本 $i$ 的预测值为 $\hat{y}^{(i)}$,其相应的真实值为 $y^{(i)}$ 时, 平方误差可以定义为以下公式:

$$
l^{(i)}(\bold{w}, b) = \frac{1}{2}(\hat{y}^{(i)} - y^{(i)})^2
$$

一维的线性回归问题如下图:
image
为了度量模型在整个数据集上的质量,需要计算整个数据集 $n$ 个样本上的损失均值:
$$
L(\bold{w}, b) = \frac{1}{n} \sum^n_{i=1} l^{(i)}(\bold{w}, b) = \frac{1}{n} \sum^n_{i=1} \frac{1}{2}(\bold{w}^TX^{(i)} + b - y^{(i)})^2
$$

现在我们的目标就从取得合适的 $\bold{w}$ 和 $b$ 变成了让 $L(\bold{w}, b)$ 变得尽可能小。

梯度下降

为了让损失函数的值尽可能小,我们用到一种名为梯度下降(gradient descent)的方法。这种方法通过不断地在损失函数递减的方向上更新参数来降低误差。容易想到的一种方法就是不断对 $L(\bold{w}, b)$ 求 $\bold{w}$ 和 $b$ 各自的偏导数,然后各自减去自身偏导数的值乘以一定的步长,不断循环这个过程,最终损失函数的值会下降到一个离局部最低点较近的位置。
image
假设 $\bold{w}$ 只有 1 维,且 $\theta_0 = w_0, \theta_1 = b$,$\alpha$ 为步长,则 $\bold{w}, b$ 更新的规则如下:
$$
\theta_j := \theta_j - \alpha \frac{\partial J(\theta_0, \theta_1)}{\partial \theta_j} \ \ \ \ (for\ j=1\ and\ j=2)
$$

不断重复这个过程,就能下降到最近的局部最低点,如下图所示:
image
我们可以观察到,从不同的位置开始下降最终会到达不同的局部最低点, $\bold{w}$ 和$b$的初值其实会影响到最终的结果。那我们怎么去取这个初值呢?通常的做法其实就是随机取值:因为我们根本就没法知道哪些位置梯度下降可以到达全局最低点,所以我们一般只能到达一个局部最低点附近,就算这个局部最低点不够低,多尝试几次一般也能得到一个相对较低的局部最低值。

然而线性回归模型的代价函数恰好是一个凸函数,这意味着如果你在曲线上选择任意两个点,连接它们的线段永远不会在曲线下方。也就是说不存在局部最小值,只有一个全局最小值。

**步长(学习率): **在梯度下降算法中我们求得当前损失函数在当前位置上的斜率(导数),但是斜率只代表向下的方法,需要有一个值来规定具体向这个方向移动多长的距离。步长太大会导致每次迭代可能不会减小代价函数,会越过局部最小值导致无法收敛;步长太小又会导致训练的时间成本/算力成本太高;步长一般凭借工程经验取值。

image

测试验证

损失函数的值越低并不代表模型的性能越好,只能代表模型在训练集上的表现。在得到了合适的 $\bold{w}$ 和 $b$ 后,我们也需要一个指标来衡量模型在测试集上的性能。回归问题的典型性能度量是均方根误差(Root Mean Square Error)。$m$ 为测试集中的实例数,$x$ 是数据集中第 $i$ 个实例的所有特征值的向量,$y$ 是这个实例的期望输出值,而 $h(x^{(i)})$ 则指模型对这个实例给出的预测值,公式如下:

$$
RMSE(X, h) = \sqrt{\frac{1}{m} \sum^m_{i=1}(h(x^{(i)}) - y^{(i)})^2}
$$

平方操作使得较大的误差对最终的均方根误差值影响更大,因此均方根误差值对离群点或较大的预测偏差更敏感。

我们可以认为对测试集取均方根误差越小的情况下,模型性能越好。但为什么我们不能在训练集上直接取均方误差呢?因为我们的模型很有可能存在一定程度上的过拟合,即在训练集上表现良好,但在实际预测中表现不好,也就是犯了 “以偏概全” 的错误。模型可能会“记住”了训练集中的噪声和特定模式,而这些模式在新的数据中并不适用。当然我们也可以反过来利用这个特性来评估模型的过拟合水平,即训练集的均方根误差值与测试集的均方根误差差距越大,过拟合就越严重。

多项式回归

有时候对于单个特征可能无法简单的用线性回归来拟合,这种情况下就需要用到多项式回归。单个特征的线性回归模型公式如下:

$$
\hat{y} = \theta_0 + \theta_1 x_1
$$

而多项式回归针对单个特征可能会有多个不同的 $\theta$
,存在多个不同次项。
$$
\hat{y} = \theta_0 + \theta_1 x_1 + \theta_2 x_1^2 + … + \theta_n x_1^n
$$

次项越多,拟合曲线的自由度就越高,越能更好的拟合复杂的曲线。同时由于可以表示的形状自由度太高,也更加容易过拟合。
image

在使用多项式回归的场景下,特征缩放非常有必要(因为次数增大也会放大比较大的值,这会让特征之间的数量级差距更加悬殊,梯度下降要花更多的时间)。

正则化

如果因为模型中的特征的高次项太多而导致了过拟合问题,则可以尝试降低高次项的系数,以降低其拟合能力,这种方法被称作正则化

而可以达成这个目的的一个比较好的方法则是在损失函数中设置一点 “惩罚”,这里以线形回归的损失函数为例,假设 $\theta_3, \theta_4$
为高次项:
$$
L(\bold{w}, b) = \frac{1}{n} \sum^n_{i=1} (\hat{y}^{(i)} - y^{(i)})^2 + 1000\theta_3^2 + 1000\theta_4^2
$$

我们的目的是为了让损失函数变得更小,但 $\theta_3, \theta_4$ 大的情况下损失函数也会很大,所以梯度下降最后下降到的最小值处的 $\theta_3, \theta_4$ 也一定是较小的,也就达成了我们降低高次项系数的目的。

分类问题 (Classification)

在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问题的例子有:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;区别一个肿瘤是恶性的还是良性的。也就是说我们要预测的变量是实际上是离散的类别标签。下面将介绍一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。虽然叫逻辑“回归”,但它其实是一种分类算法。

逻辑回归

我们从二元的分类问题开始思考。我们将单条数据可能属于的分类分为两类:比如不是垃圾邮件,用 0 来表示此类;是垃圾邮件,用 1 来表示此类。

对于分类,取值为 0 或者 1。如果我们要用线性回归算法来解决一个分类问题,其预测值可能远大于 1,或者远小于0:即便所有训练样本的标签都等于 0 或 1。尽管我们知道标签应该取值 0 或者 1 ,但是如果算法得到的值远大于 1 或者远小于 0 的话,就会感觉很奇怪。所以我们在接下来的要介绍的算法就叫做逻辑回归算法,这个算法的性质是:它的预测值永远在 0 到 1 之间。

既然预测值永远在 0 到 1 之间,并且可能的预测结果只有离散的 0(不是垃圾邮件) 和 1 (是垃圾邮件) 两种状态,我们可以认为预测值大于 0.5 则更有可能是垃圾邮件,反之小于 0.5 则更有可能不是垃圾邮件。

逻辑函数

逻辑回归模型的假设是:

$$
h_\theta(x) = g(\theta^TX) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + … + \theta_n x_n)
$$

其中 $X$ 为特征向量,$\theta$ 为参数, $h_\theta(x)$ 表示模型使用参数 $\theta$ 时在 $X$ 上的预测值,$g$ 代表逻辑函数 (logistic function):正是逻辑函数将预测值规约在了 0 到 1 之间。

一般我们使用 Sigmoid 函数作为逻辑回归的逻辑函数:

$$
g(x) = \sigma(x) = \frac{1}{1 + e^{-x}}
$$

Sigmoid 函数是一个 S 形函数,它的数学性质限制了其预测值只能在 0 到 1 之间:
image
$_\theta(x)$ 的作用是,对于给定的特征值,根据选择的参数计算输出变量为 1 的概率,即 $h_\theta(x) = P(y = 1 | x;\theta)$。例如:如果对于给定的 $x$,通过已经确定的参数计算得出 $h_\theta(x) = 0.7$,则表示有 70% 的概率 $y$ 为正向类 (即 1 对应的类别) ,相应地 $y$ 为负向类 (即 0 对应的类别) 的概率为 1 - 0.7 = 0.3。

决策边界

线性回归拟合的是特征值与期望值之间的曲线,逻辑回归又拟合了什么呢?为了更好的理解逻辑回归的假设函数在计算什么,我们引入决策边界decision boundary)的概念。

在逻辑回归中:

  • 当$h_\theta(x) \ge 0.5$
    时,我们预测 $y = 1$。

  • 当$h_\theta(x) < 0.5$
    时,我们预测 $y = 0$。

根据 sigmoid 函数的公式 $\sigma(z) = \frac{1}{1 + e^{-z}}$ 和上面的 sigmoid 曲线图可以知道:

  • $z = 0$ 时 $g(z) = 0.5$

  • $z > 0$ 时 $g(z) > 0.5$

  • $z < 0$ 时 $g(z) < 0.5$

根据 $h_\theta(x) = g(\theta^T X)$ 又可知 $z = \theta^T X$,即 $\theta^T X \ge 0$ 时预测 $y = 1$,$\theta^Tx < 0$ 时预测 $y = 0$。

现在假设我们有一个模型: $h_\theta(x) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2)$,并且参数 $\theta$ 是向量 [-3, 1, 1]。则当 $-3 + x_1 + x_2 \ge 0$,即 $x_1 + x_2 \ge 3$时,模型将预测 $y = 1$。我们可以绘制曲线 $x_1 + x_2 = 3$
,这条线便是我们模型的决策边界,将预测为 1 的区域和预测为 0 的区域分隔开。
image
并且在逻辑回归中我们也可以使用多项式回归来拟合更复杂的决策边界。但跟线性回归一样,次数越高就越容易出现过拟合的情况。

image

损失函数

逻辑回归也跟线性回归一样,是通过梯度下降来最小化损失函数来训练参数的。逻辑回归中单个实例的损失函数如下所示:

$$
l(h_\theta(x), y) = \begin{cases} -\log (h_\theta(x)) & \text{if } y = 1 \ -\log(1 - h_\theta(x)) & \text{if } y = 0 \end{cases}
$$

$h_\theta(x)$ 与 $l(h_\theta(x), y)$ 之间的关系如下图所示:
image
这样构建的损失函数的特点是:当实际的 $y = 1$ 且 $h_\theta(x)$ 也为 1 时误差为 0,当 $y = 1$ 但 $h_\theta(x)$ 不为 1 时误差随着 $h_\theta(x)$ 变小而变大;当实际的 $y = 0$且 $h_\theta(x)$ 也为 0 时代价为 0,当 $y = 0$ 但 $h_\theta(x)$不为 0 时误差随着 $h_\theta(x)$ 的变大而变大。

将 $l(h_\theta(x), y)$ 简化如下:

$$
l(h_\theta(x), y) = -y \log(h_\theta(x)) - (1 - y) \log(1 - h_\theta(x))
$$

再将所有样本取平均值,可得整体的损失函数:

$$
L(h_\theta(x), y) = -\frac{1}{m}\sum^m_{i=1}[y \log(h_\theta(x)) + (1 - y) \log(1 - h_\theta(x))]
$$

再使用梯度下降往最低处逼近即可。

多元分类

上面我们只讲解了只有两种类别的分类情况,那么如果实际情况中需要区分多种类别呢?实际上我们只需要把多个只识别单一类型为正向类,其余识别为负向类的二元分类器组合在一起就可以实现多元分类。
image

image

准确率/召回率

评估分类模型的性能比回归模型要复杂一些。这里我们需要引入两个耳熟能详的指标:**准确率 (Accuracy Rate) 和召回率 **(Recall Rate)。$TP$ 为真阳性(True Positive)数,$FP$ 为假阳性(False Positive)数,$FN$ 为假阴性(False Negative)数。
$$
Accuracy = \frac{TP}{TP + FP}
$$

$$
Recall = \frac{TP}{TP + FN}
$$

准确率主要关注在预测为真的实例中的正确率,而召回率关注在整个测试集中有多少实际为真的实例被模型预测召回。

不幸的是,我们不能两者兼顾:提高准确率会降低召回率(召回的数量越少越准确,一个极端的例子是在一大批样本中只召回一个样本,这样准确率可以达到 100%,但召回率接近 0%)。所以在不同的应用场景下我们会关注不同的指标:比如恶性肿瘤识别的案例中,我们希望有尽可能多的恶性肿瘤患者被召回,即便误诊多一些也没有关系,这种情况下召回率就比较重要;而在垃圾邮件识别的案例中,我们认为相比于少召回几封垃圾邮件,重要邮件被误识别为垃圾邮件是更不可接受的,这种情况下准确率就比较重要。在风控业务中当然是更加关心召回率,即便只有少数漏网之鱼漏召都有可能引发严重的后果。

那么如何控制对准确率和召回率的偏好呢?上面我们使用 0.5 的阈值来预测真假:大于等于 0.5 为真,小于等于 0.5 为假。这个阈值当然是可以改变的,阈值越小则召回率越高,并且准确率越低;反之阈值越高召回率越低,并且准确率越高。如果说我们对这两个指标没有明显的偏好,可以用这两个指标算出 F1 值 :

$$
F_1 = \frac{2}{\frac{1}{Accuracy} + \frac{1}{Recall}} = \frac{TP}{TP + \frac{FN + FP}{2}}
$$

这样我们可以认为在 F1 值最大时,模型的准确率和召回率整体上都是最优的。我们也可以选择使 F1 值最大的阈值。

无监督式学习

在无监督式学习中,我们具有输入特征 $X$,但却没有标签 $y$。没有人告诉模型什么样的特征对应什么样的标签值,由模型自己来发现数据之间的某些关系和模式。

聚类分析 (clustering)

在无监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中,然后我们告诉这个算法,快去为我们找找这个数据的内在结构给定数据。我们可能需要某种算法帮助我们寻找一种结构。图上的数据看起来可以分成两个分开的点集(称为簇),一个能够找到我圈出的这些点集的算法,就被称为聚类算法

image

K-均值算法

K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。假设我们想要将数据聚类成 n 个组,其方法为:

  1. 首先选择 K 个随机的点,称为聚类中心 (cluster centroids)

  2. 对于数据集中的每一个数据,按照距离 K 个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。

  3. 计算每一个组各个特征的平均值,将该组所关联的中心点移动到平均值的位置。

  4. 重复步骤 2,3 直至中心点不再变化

下面是一个K-均值聚类的实例:

image

损失函数

K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此K-均值的损失函数为($c^{(i)}$ 为与第 $i$ 个实例数据最近的聚类中心的索引,$\mu_n$ 为聚类中心点的坐标):

$$
J(c^{(1)}, …, c^{(m)}, \mu_1, …, \mu_K ) = \frac{1}{m}\sum^m_{i=1}||X^{(i)} - \mu_{c^{(i)}}||^2
$$

其中 $\mu_{c^{(i)}}$ 代表与 $x^{(i)}$ 最近的聚类中心点。我们的优化目标便是找出使得损失函数最小的 $c^{(1)}, c^{(2)}, …, c^{(m)}$ 和 $\mu_1,\mu_2,…,\mu_k$。

随机初始化

在运行K-均值算法之前,我们首先需要随机初始化所有的聚类中心点。K-均值不同与我们之前提到的线性回归与逻辑回归,它的损失函数并不是一个凸函数,也就是说它有可能会停留在一个局部最小值处而不是下降到全局最小值附近,这取决于初始化的情况。为了不让聚类中心点的初始坐标取值过于离谱,随机初始化一般不是完全随机的取坐标值,而是随机选择一个实例作为初始坐标。

为了尽可能得到一个全局最优解,我们一般会多次运行K-均值算法,每一次都重新进行随机初始化,最后再比较多次运行K-均值的结果,选择损失函数最小的结果,但如果 K 较大,这样做可能也不会有明显的改善。

测试验证

聚类的效果可以使用轮廓系数来衡量:

  • 样本 $i$ 的轮廓系数: $s(i) = \frac{b(i) - a(i)}{max{a(i), b(i)}}$

  • 簇内不相似度:计算样本 $i$ 到同簇其它样本的平均距离为 $a(i)$,应尽可能小。

  • 簇间不相似度:计算样本 $i$ 到其它簇 $C_j$ 的所有样本的平均距离 $b(i)$,应尽可能大。

  • $s(i)$ 值越接近1表示样本 $i$ 聚类越合理,越接近-1,表示样本应该分类到另外的簇中;近似为0,表示样本应该在边界上;所有样本$s(i)$ 的均值即聚类结果的轮廓系数。

选择 K 值

人们在讨论选择聚类数(K值)的方法时有一个可能会谈及的方法叫作“肘部法则”。关于“肘部法则”,我们所需要做的是改变 $K$ 值,也就是聚类类别数目的总数。我们用一个聚类来运行K均值聚类方法。这就意味着,所有的数据都会分到一个聚类里,然后计算损失函数 $J$。 代表聚类数字。

降维

许多机器学习问题涉及每个训练实例的成千上万甚至数百万个特征。所有这些特征不仅使训练变得极其缓慢,而且还会使找到好的解决方案变得更加困难。这个问题通常称为维度的诅咒。

幸运的是,在实际问题中,通常可以大大减少特征的数量,从而将棘手的问题转变为易于解决的问题。例如在图片识别问题中,每一个像素都对应 RGB 三个色域的值,也就是每个像素都对应三个特征。而相邻两个像素的特征通常是高度相关的,比如图像中有一块红色的区域,在里面的其中一个像素是红色,相邻的像素也大概率是一样的颜色,或者说相近的颜色(浅一点或者深一点)。那么我完全可以把这块区域的像素的特征合并成一个,而不会对结果产生很大的影响,降维本质上就是这样的操作。

下面是一个二维降为一维的例子,把所有的实例都映射到一条新的坐标轴上,原本的两个特征就被压缩成了一个新的特征,还有一个三维压缩到二维的例子:

image

半监督式学习

由于标记数据通常既耗时又昂贵,因此通常会有很多未标记的实例而很少有已标记的实例。一些算法可以处理一部分已标记的数据,这称为半监督学习。

大多数半监督学习算法是无监督和监督算法的组合。例如,可以使用聚类算法将相似的实例分组在一起,然后每个未标记的实例都可以用其集群中最常见的标签进行标记。一旦标记了整个数据集,就可以使用任何监督学习算法。

一些照片托管服务(例如Google相册)就是很好的示例。一旦你将所有的家庭照片上传到该服务,它会自动识别出同一个人A出现在照片1、5和11中,而另一个人B出现在照片2、5和7中。这是算法(聚类)的无监督部分。现在系统只需要你告诉它这些人是谁。你只需为每个人添加一个标签,系统就可以为每张照片中的每个人命名,这对于搜索照片非常有用。

强化学习

在强化学习中,软件智能体(agent)在环境中进行观察并执行动作,作为回报,它会从环境中获得奖励。它的目标是学会以一种可以随时间推移最大化其预期回报的方式来执行动作。可以把正奖励视为愉悦,把负奖励视为痛苦。简而言之,该智能体在环境中执行动作,并通过反复试错来学习,以最大限度地提高其愉悦感并最大限度地减少其痛苦感。软件智能体用来确定其动作的算法称为策略。该策略可以是一个神经网络,将观察结果作为输入并输出要采取的动作。
image
强化学习(Reinforcement Learning, RL)的核心是通过试错与反馈优化决策策略,适用于需要动态交互和长期目标优化的场景,例如:

  • 游戏场景:游戏场景提供明确的规则和奖励机制,适合训练智能体探索策略边界。

    • AlphaGo 通过自我对弈来不断改良模型,最后击败世界冠军
  • 推荐系统:利用强化学习动态调整推荐策略,最大化用户停留时长;

主要挑战

  • 训练数据不足

  • 训练数据不具有代表性

  • 质量差的数据 (异常值,噪声多)

    • 手动进行数据清洗
      • 利用无监督学习来做异常识别,筛掉异常数据
  • 无关特征

    • 降维(即用无监督学习的方法来去除无关特征)
  • 训练数据过拟合

    • 正则化 (降低高次项系数)
      • 降维(降低特征数)
  • 训练数据拟合不足

    • 调整步长,进行特征缩放
      • 批量梯度下降 -> 随机梯度下降 (在陷入局部最优解的情况下,随机梯度下降可能可以找到更优解)

学习资料

  • 吴恩达机器学习课

  • 机器学习实战:基于Scikit-Learn、Keras和TensorFlow(原书第3版)_【法】奥雷利安·杰龙