Python 机器学习算法交易实用指南(五)(1)https://developer.aliyun.com/article/1523710
如何训练自己的单词向量嵌入
许多任务需要嵌入或特定领域的词汇,而基于通用语料库的预训练模型可能无法很好地或根本无法表示。标准 Word2vec 模型无法为词汇表中不存在的单词分配向量,而是使用降低其预测价值的默认向量。
例如,在处理行业特定文件时,词汇表或其使用可能随着时间推移而变化,因为新技术或产品出现。因此,嵌入也需要相应地发展。此外,企业盈利发布使用的语言不完全反映在基于维基百科文章预训练的 GloVe 向量中。
我们将使用 Keras 库来说明 Word2vec 架构,我们将在下一章中更详细地介绍,并使用 Word2vec 作者提供的代码的 gensim 适配更高效的代码。Word2vec 笔记本包含额外的实现细节,包括 TensorFlow 实现的参考。
Keras 中的 Skip-Gram 架构
为了说明 Word2vec 网络架构,我们使用 TED Talk 数据集,该数据集具有对齐的英文和西班牙文字幕,我们首次在第十三章中介绍了处理文本数据。
笔记本包含将文档标记化并为词汇表中的每个项目分配唯一 ID 的代码。我们要求语料库中至少出现五次,并保留 31300 个标记的词汇表。
噪声对比估计
Keras 包括一个make_sampling_table
方法,允许我们创建一个训练集,其中上下文和噪声词与相应的标签配对,根据它们的语料库频率进行采样。
结果是 2700 万个正面和负面的上下文和目标对的例子。
模型组件
Skip-Gram模型为词汇表中的每个项目包含一个 200 维嵌入向量,导致 31300 x 200 可训练参数,加上两个用于 sigmoid 输出。
在每次迭代中,模型计算上下文和目标嵌入向量的点积,通过 sigmoid 产生概率,并根据损失的梯度调整嵌入。
使用 TensorBoard 可视化嵌入
TensorBoard 是一种可视化工具,允许将嵌入向量投影到三维空间中,以探索单词和短语的位置。
使用 gensim 从 SEC 备案中学习的单词向量
在本节中,我们将使用 gensim 从美国年度证券交易委员会(SEC)备案中学习单词和短语向量,以说明单词嵌入对算法交易的潜在价值。在接下来的几节中,我们将将这些向量与价格回报结合使用作为特征,训练神经网络来根据安全备案的内容预测股票价格。
特别是,我们使用一个数据集,其中包含 2013-2016 年间上市公司提交的超过 22,000 份 10-K 年度报告,其中包含财务信息和管理评论(参见第三章,金融替代数据)。对于大约一半的公司的 11-K 备案,我们有股价以标记预测建模的数据(有关数据来源和sec-filings
文件夹中笔记本的引用,请参阅详细信息)。
预处理
每个备案都是一个单独的文本文件,一个主索引包含备案元数据。我们提取最具信息量的部分,即以下部分:
- 项目 1 和 1A:业务和风险因素
- 项目 7 和 7A:管理对市场风险的讨论和披露
笔记本预处理显示如何使用 spaCy 解析和标记文本,类似于第十四章中采用的方法,主题建模。我们不对单词进行词形还原处理,以保留单词用法的细微差别。
自动短语检测
我们使用gensim
来检测短语,就像之前介绍的那样。Phrases
模块对标记进行评分,而Phraser
类相应地转换文本数据。笔记本展示了如何重复此过程以创建更长的短语:
sentences = LineSentence(f'ngrams_1.txt') phrases = Phrases(sentences=sentences, min_count=25, # ignore terms with a lower count threshold=0.5, # only phrases with higher score delimiter=b'_', # how to join ngram tokens scoring='npmi') # alternative: default grams = Phraser(phrases) sentences = grams[sentences]
最频繁的二元组包括common_stock
,united_states
,cash_flows
,real_estate
和interest_rates
。
模型训练
gensim.models.Word2vec
类实现了之前介绍的 SG 和 CBOW 架构。Word2vec 笔记本包含额外的实现细节。
为了方便内存高效的文本摄取,LineSentence
类从提供的文本文件中创建一个生成器,其中包含单独的句子:
sentence_path = Path('data', 'ngrams', f'ngrams_2.txt') sentences = LineSentence(sentence_path)
Word2vec
类提供了先前介绍的配置选项:
model = Word2vec(sentences, sg=1, # 1=skip-gram; otherwise CBOW hs=0, # hier. softmax if 1, neg. sampling if 0 size=300, # Vector dimensionality window=3, # Max dist. btw target and context word min_count=50, # Ignore words with lower frequency negative=10, # noise word count for negative sampling workers=8, # no threads iter=1, # no epochs = iterations over corpus alpha=0.025, # initial learning rate min_alpha=0.0001 # final learning rate )
笔记本展示了如何持久化和重新加载模型以继续训练,或者如何将嵌入向量单独存储,例如供 ML 模型使用。
模型评估
基本功能包括识别相似的单词:
model.wv.most_similar(positive=['iphone'], restrict_vocab=15000) term similarity 0 android 0.600454 1 smartphone 0.581685 2 app 0.559129
我们也可以使用正负贡献来验证单个类比:
model.wv.most_similar(positive=['france', 'london'], negative=['paris'], restrict_vocab=15000) term similarity 0 united_kingdom 0.606630 1 germany 0.585644 2 netherlands 0.578868
参数设置的性能影响
我们可以使用类比来评估不同参数设置的影响。以下结果表现突出(详细结果请参见models
文件夹):
- 负采样优于分层 softmax,同时训练速度更快。
- Skip-Gram 架构优于 CBOW 给定的目标函数
- 不同的
min_count
设置影响较小,50 为最佳表现的中间值。
使用最佳表现的 SG 模型进行进一步实验,使用负采样和min_count
为 50,得到以下结果:
- 比五更小的上下文窗口会降低性能。
- 更高的负采样率提高了性能,但训练速度慢了。
- 更大的向量提高了性能,大小为 600 时的准确率最高,为 38.5%。
Python 机器学习算法交易实用指南(五)(3)https://developer.aliyun.com/article/1523712