Python 机器学习算法交易实用指南(五)(3)

简介: Python 机器学习算法交易实用指南(五)

Python 机器学习算法交易实用指南(五)(2)https://developer.aliyun.com/article/1523711

使用 Doc2vec 进行情感分析

文本分类需要组合多个词嵌入。一个常见的方法是对文档中每个词的嵌入向量进行平均。这使用所有嵌入的信息,并有效地使用向量加法来到达嵌入空间中的不同位置。但是,有关单词顺序的相关信息会丢失。

相比之下,用于生成文本片段(如段落或产品评论)的嵌入的最先进模型是使用文档嵌入模型Doc2vec。这个模型是 Word2vec 作者在发布其原创贡献后不久开发的。

与 Word2vec 类似,Doc2vec也有两种类型:

  • 分布式词袋DBOW)模型对应于 Word2vec 的 CBOW 模型。文档向量是通过训练网络在预测目标词的合成任务中产生的,该任务基于上下文词向量和文档的文档向量。
  • 分布式记忆DM)模型对应于 Word2vec Skip-Gram 架构。通过训练神经网络来预测目标单词,使用整个文档的文档向量。

Gensim 的 Doc2vec 类实现了这种算法。

在 Yelp 情感数据上训练 Doc2vec

我们使用 500,000 条 Yelp 评论(参见第十三章,处理文本数据)的随机样本,以及它们的相关星级评分(参见 notebook yelp_sentiment):

df = (pd.read_parquet('yelp_reviews.parquet', engine='fastparquet')
          .loc[:, ['stars', 'text']])
stars = range(1, 6)
sample = pd.concat([df[df.stars==s].sample(n=100000) for s in stars])

我们使用简单的预处理来删除停用词和标点符号,使用 NLTK 的分词器并删除少于 10 个标记的评论:

import nltk
nltk.download('stopwords')
from nltk import RegexpTokenizer
from nltk.corpus import stopwords
tokenizer = RegexpTokenizer(r'\w+')
stopword_set = set(stopwords.words('english'))
def clean(review):
    tokens = tokenizer.tokenize(review)
    return ' '.join([t for t in tokens if t not in stopword_set])
sample.text = sample.text.str.lower().apply(clean)
sample = sample[sample.text.str.split().str.len()>10]

创建输入数据

gensim.models.doc2vec 类以 TaggedDocument 格式处理文档,其中包含标记化的文档以及允许在训练后访问文档向量的唯一标记:

sentences = []
for i, (_, text) in enumerate(sample.values):
    sentences.append(TaggedDocument(words=text.split(), tags=[i]))

训练界面与 word2vec 类似,但有额外的参数来指定 Doc2vec 算法:

model = Doc2vec(documents=sentences,
                dm=1,          # algorithm: use distributed memory
                dm_concat=0,   # 1: concat, not sum/avg context vectors
                dbow_words=0,  # 1: train word vectors, 0: only doc 
                                    vectors
                alpha=0.025,   # initial learning rate
                size=300,
                window=5,
                min_count=10,
                epochs=5,
                negative=5)
model.save('test.model')

您还可以使用 train() 方法来继续学习过程,并且,例如,逐渐降低学习率:

for _ in range(10):
    alpha *= .9
    model.train(sentences,
                total_examples=model.corpus_count,
                epochs=model.epochs,
                alpha=alpha)

因此,我们可以将文档向量作为特征来访问,以训练情感分类器:

X = np.zeros(shape=(len(sample), size))
y = sample.stars.sub(1) # model needs [0, 5) labels
for i in range(len(sample)):
 X[i] = model[i]

我们将训练一个 lightgbm 梯度提升机,如下所示:

  1. 从训练集和测试集创建 lightgbm Dataset 对象:
train_data = lgb.Dataset(data=X_train, label=y_train)
test_data = train_data.create_valid(X_test, label=y_test)
  1. 定义具有五个类别的多类模型的训练参数(否则使用默认值):
params = {'objective'  : 'multiclass',
          'num_classes': 5}
  1. 对模型进行 250 次迭代的训练,并监视验证集错误:
lgb_model = lgb.train(params=params,
                      train_set=train_data,
                      num_boost_round=250,
                      valid_sets=[train_data, test_data],
                      verbose_eval=25)
  1. Lightgbm 对所有五个类别进行概率预测。我们使用 np.argmax() 来获取具有最高预测概率的列索引来获取类别预测:
y_pred = np.argmax(lgb_model.predict(X_test), axis=1)
  1. 我们计算准确率评分来评估结果,并看到相对于五个平衡类别的基线 20%,准确率提高了 100% 以上:
accuracy_score(y_true=y_test, y_pred=y_pred)
0.44955063467061984
  1. 最后,我们通过混淆矩阵来更仔细地查看每个类别的预测:
cm = confusion_matrix(y_true=y_test, y_pred=y_pred)
cm = pd.DataFrame(cm / np.sum(cm), index=stars, columns=stars)
  1. 并将结果可视化为 seaborn 热图:
sns.heatmap(cm, annot=True, cmap='Blues', fmt='.1%')


总之,doc2vec 方法使我们能够在不经过太多调整的情况下,比一个简单的基准模型取得了非常大的测试准确率改进。如果我们只选择顶部和底部的评论(分别为五星和一星),并训练一个二元分类器,则使用每个类别的 250,000 个样本时,AUC 分数可以达到 0.86 以上。

附加内容 - 用于翻译的 Word2vec

该 notebook 翻译演示了一个语言中编码的关系通常对应于另一种语言中的类似关系。

它说明了如何使用单词向量通过将单词向量从一个语言的嵌入空间投影到另一个语言的空间使用翻译矩阵来翻译单词和短语。

摘要

本章以词嵌入如何更有效地为个别标记编码语义开始,这比我们在第十三章中使用的词袋模型更为有效。我们还看到了如何通过线性向量算术验证嵌入,以评估是否正确表示了单词之间的语义关系。

学习词嵌入时,我们使用的浅层神经网络曾经在包含数十亿标记的 Web 数据规模上训练速度很慢。word2vec 模型结合了几种算法创新,显著加速了训练,并为文本特征生成确立了新标准。我们看到了如何使用spaCygensim来使用预训练的词向量,并学会了训练自己的词向量嵌入。然后,我们将word2vec模型应用于 SEC 提交文件。最后,我们介绍了doc2vec扩展,它以与单词向量类似的方式学习文档的向量表示,并将其应用于 Yelp 商家评论。

现在,我们将开始第四部分关于深度学习(如前言所述,在线可用),从介绍前馈网络、流行的深度学习框架和大规模高效训练技术开始。

Python 机器学习算法交易实用指南(五)(4)https://developer.aliyun.com/article/1523713

相关文章
|
2月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
2月前
|
存储 监控 算法
监控电脑屏幕的帧数据检索 Python 语言算法
针对监控电脑屏幕场景,本文提出基于哈希表的帧数据高效检索方案。利用时间戳作键,实现O(1)级查询与去重,结合链式地址法支持多条件检索,并通过Python实现插入、查询、删除操作。测试表明,相较传统列表,检索速度提升80%以上,存储减少15%,具备高实时性与可扩展性,适用于大规模屏幕监控系统。
130 5
|
2月前
|
机器学习/深度学习 数据采集 人工智能
【机器学习算法篇】K-近邻算法
K近邻(KNN)是一种基于“物以类聚”思想的监督学习算法,通过计算样本间距离,选取最近K个邻居投票决定类别。支持多种距离度量,如欧式、曼哈顿、余弦相似度等,适用于分类与回归任务。结合Scikit-learn可高效实现,需合理选择K值并进行数据预处理,常用于鸢尾花分类等经典案例。(238字)
|
3月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
194 26
|
3月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于D*算法的机器人路径规划(Python代码实现)
192 0
|
3月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)
237 0
|
3月前
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
331 4
|
3月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
【机器人路径规划】基于A*算法的机器人路径规划研究(Python代码实现)
490 4
|
3月前
|
机器学习/深度学习 算法 机器人
【机器人路径规划】基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(Python代码实现)
【机器人路径规划】基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(Python代码实现)
256 3
|
3月前
|
算法 机器人 定位技术
【机器人路径规划】基于流场寻路算法(Flow Field Pathfinding)的机器人路径规划(Python代码实现)
【机器人路径规划】基于流场寻路算法(Flow Field Pathfinding)的机器人路径规划(Python代码实现)
170 4

推荐镜像

更多