Test Data for Trading—Sentiment Analysis系列文章是对《Machine Learning for Algorithmic Trading》第十四章内容的讲解以及相关代码复现。因为中英文的文本分析存在较大差异,顾此系列没有选取中国市场的材料做为代码复现的数据,而是选择书后源代码进行复现。
用朴素贝叶斯对新闻文章进行分类
一旦文本数据使用前几节提到的NLP技术被转换为数字特征,文本分类就变得和其他分类一样。
朴素贝叶斯算法在文档分类领域中非常流行,因为它的计算成本和内存要求低,方便在大型的高维数据集上进行训练。它的预测性能可以与更复杂的模型竞争,并且因为成功用于垃圾邮件检测而非常出名。该模型依赖于贝叶斯定理和假设,它假设各种特征是相互独立的。换句话说,对于一个给定的结果,知道一个特征(例如, 一个文档中存在某一个token)并不能提供关于另一一个特征的任何信息。
“ 朴素贝叶斯,它是一种简单但极为强大的预测建模算法。之所以称为朴素贝叶斯,是因为它假设每个输入变量是独立的。这个假设很硬,现实生活中根本不满足,但是这项技术对于绝大部分的复杂问题仍然非常有效。
朴素贝叶斯模型由两种类型的概率组成: 1、每个类别的概率P(Cj); 2、每个属性的条件概率P(Ai|Cj)。”
#配置环境
from pathlib import Path
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, confusion_matrix
我们先用之前导入的BBC文章来说明朴素贝叶斯模型对新闻文章的分类起到的作用。
1、创建分层的训练集和测试集
我们将数据分成默认的75:25的训练-测试集,确保测试集的类别与训练集密切相关。
y = pd.factorize(docs.topic)[0]
X = docs.body
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1, stratify=y)
2、将文本数据向量化
继续从训练集中学习词汇,并使用默认设置的CountVectorizer对两个数据集进行转换,以获得近26000个特征。
vectorizer = CountVectorizer()#使用CountVectorizer对数据集进行转换
X_train_dtm = vectorizer.fit_transform(X_train)
X_test_dtm = vectorizer.transform(X_test)
X_train_dtm.shape, X_test_dtm.shape#两个数据集中token的shape形式
((1668, 25951), (557, 25951))#最终输出获得了将近26000个特征,1668和557是样本数
3、训练多层级朴素贝叶斯模型
用准确性来评估多类预测的结果,发现默认的分类器的准确度几乎达到了98%。
accuracy_score(y_test, y_pred_class)#检测分类准确性
0.9712746858168761#输出的默认设置的分类器的准确度将近98%
4、混淆矩阵
混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。具体评价指标有总体精度、制图精度、用户精度等,这些精度指标从不同的侧面反映了图像分类的精度。[1]在人工智能中,混淆矩阵(confusion matrix)是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵。
pd.DataFrame(confusion_matrix(y_true=y_test, y_pred=y_pred_class))#画混淆矩阵
混淆矩阵对角线上的数字代表是分类正确的文档,因为行和列是相同的。比如说矩阵第一行第三列的数字6代表着有6个是0类的文档被分到了第二类,以此类推可以用混淆矩阵来描述分类器的准确度。
更多 机器学习、投资管理 相关的内容,均收录在微信公众号 HI投量化俱乐部
欢迎扫码关注