奎克的藏经阁 · MinerU 解析内容

人工智能与大数据技术导论

490 个 PDF 物理页 · 本页显示文件第 281–290 页

PDF 物理页索引 280

文件中的第 281 页 · 印刷页码:264

我们可以创建很多不同种类的特征交叉,例如:

●[A×B]:将两个特征的值相乘形成的特征交叉。

●[A×B×C×D×E]:将5个特征的值相乘形成的特征交叉。

●[A×A]:对单个特征的值求平方形成的特征交叉。

通过采用随机梯度下降法可以有效地训练线性模型。因此,在使用扩展的线性模型时辅以特征交叉一直都是训练大规模数据集的有效方法。在实际工作中,机器学习模型很少会交叉具有连续值的特征。机器学习模型却经常交叉独热(onehot)特征向量,将独热特征向量的特征交叉视为逻辑连接。例如,假设具有两个特征:国家和语言。对每个特征进行独热编码会生成具有二元特征的向量,这些二元特征可解读为country=USA、country=France或language=English、language=Spanish。然后,如果你对这些独热编码进行特征交叉,就会得到可解读为逻辑连接的二元特征,如下所示:

再举一个例子,假设你对纬度和经度进行分箱,获得单独的独热5元素特征向量。例如,一个特定的纬度和经度可以表示如下:

假设我们创建了这两个特征向量的特征交叉:

此特征交叉是一个25元素独热矢量(24个0和1个1)。该交叉组合中的唯一一个1表示纬度与经度的连接。然后,我们就可以了解有关这种连接的特定关联性。假设我们更粗略地对纬度和经度进行分箱,如下所示:

针对上述这些分箱创建特征交叉会生成具有以下含义的合成特征:

人工智能与大数据技术导论

264

PDF 物理页索引 281

文件中的第 282 页 · 印刷页码:265

现在,假设我们的模型需要根据以下两个特征来预测狗主人对狗的满意程度:

如果我们根据这两个特征构建以下特征交叉:

最终获得的预测能力将远远超过任一特征单独的预测能力。例如,如果狗在下午5点主人下班回来时(快乐地)叫喊,我们可以预测主人满意度是很正面的。如果狗在凌晨3点主人熟睡时(也许痛苦地)哀叫,我们可以预测主人满意度是很负面的。

总之,线性学习器可以很好地扩展到海量数据。在大规模数据集上使用特征交叉是学习高度复杂模型的一种有效策略。神经网络可提供另一种策略。

9.1.2 FTRL 实践

我们还是使用加州房价这个样本数据集。装载数据和创建训练集/验证集的代码与8.4.7节一样。在下面的代码中,我们将原来的SGD梯度下降训练学习器换成了FTRL(Follow-The-Regularized-Leader)训练学习器。

FTRL是对每一维分开训练更新的,每一维使用的是不同的学习速率(步长)。与所有特征维度使用统一的学习速率相比,这种方法考虑了训练样本本身在不同特征上分布的不均匀性,如果某一个维度特征的训练样本很少,每一个样本都很珍贵,那么该特征维度对应的训练速率可以独自保持比较大的值,每来一个包含该特征的样本,就可以在该样本的梯度上前进一大步,而不需要与其他特征维度的前进步调强行保持一致。

训练模型代码如下,要注意的是,我们在使用FtrlOptimizer:

第9章 TensorFlow 高级知识

265

PDF 物理页索引 282

文件中的第 283 页 · 印刷页码:266

人工智能与大数据技术导论

266

PDF 物理页索引 283

文件中的第 284 页 · 印刷页码:267

下面我们进行训练:

结果如图9-3、图9-4所示。

第9章 TensorFlow 高级知识

267

PDF 物理页索引 284

文件中的第 285 页 · 印刷页码:268

9.1.3分桶(分箱)代码实例

分桶也称为分箱。例如,我们可以将population分为以下3个分桶。

bucket\_0(<5000):对应于人口分布较少的街区。

●bucket\_1(5000-25000):对应于人口分布适中的街区。

bucket\_2(>25000):对应于人口分布较多的街区。

根据前面的分桶定义,以下population矢量:

将变成以下经过分桶的特征矢量:

人工智能与大数据技术导论

268

PDF 物理页索引 285

文件中的第 286 页 · 印刷页码:269

这些特征值现在是分桶索引。请注意,这些索引被视为离散特征。通常情况下,这些特征将被进一步转换为独热编码表示,但这是以透明方式实现的。要为分桶特征定义特征列,我们可以使用 bucketized column(而不是使用numeric column),bucketized column 将数字列作为输入,并使用boundaries参数中指定的分桶边界将其转换为分桶特征。以下代码为households和longitude定义了分桶特征列。get\_quantile\_based\_boundaries函数会根据分位数(quantile)计算边界(boundaries),以便每个分桶包含相同数量的元素。

在前面的代码块中,两个实值列(即households和longitude)已被转换为分桶特征列。剩下的任务是对其余的列进行分桶,然后运行代码来训练模型。我们使用了分位数技巧,通过这种方式选择分桶边界后,每个分桶将包含相同数量的样本。

第9章 TensorFlow 高级知识

269

PDF 物理页索引 286

文件中的第 287 页 · 印刷页码:270

分桶后,开始训练模型:

运行结果如图9-5、图9-6所示。

人工智能与大数据技术导论

270

PDF 物理页索引 287

文件中的第 288 页 · 印刷页码:271

9.1.4 特征交叉代码实例

交叉组合的两个(或更多个)特征是使用线性模型来学习非线性关系的一种聪明做法。在我们的例子中,如果只使用latitude特征进行学习,那么该模型可能会发现在一个特定纬度(或在一个特定纬度范围内,因为我们已经将其分桶)的城市街区更可能比其他街区住房成本高昂。longitude特征的情况与此类似。但是,如果我们将longitude与latitude交叉组合,那么产生的交叉组合特征则代表一个明确的城市街区。如果模型发现某些城市街区(位于特定纬度和经度范围内)更可能比其他街区住房成本高昂,那么就是比单独使用两个特征更合适。

目前,特征列API仅支持交叉组合离散特征。如果要组合两个连续的值(比如latitude或longitude),我们可以对其进行分桶。如果交叉组合latitude和longitude特征(例如,longitude被分到2个分桶中,而latitude有3个分桶),那么我们实际上会得到6个交叉组合的二值特征(binaryfeature)。当我们训练模型时,每个特征都会分别获得自己的权重。

第9章 TensorFlow高级知识

271

PDF 物理页索引 288

文件中的第 289 页 · 印刷页码:272

下面在模型中添加longitude与latitude的特征组合,训练模型,然后确定结果是否有所改善。我们使用 TensorFlow API的crossed column()来交叉组合构建特征列。hash bucket size 设为1000。

人工智能与大数据技术导论

272

PDF 物理页索引 289

文件中的第 290 页 · 印刷页码:273

开始训练模型:

结果如图9-7、图9-8所示。

第9章 TensorFlow 高级知识

273