大家好,今天将分享一个与美丽的引言相似的主题。一直在寻找新的想法来分享知识,因为相信“分享的知识是知识平方”。许多人可能已经对股票市场有所了解。在这篇文章中,将探索一些新的和有趣的东西。让深入探讨今天的主题。
这篇文章实际上是基于自然语言处理(NLP)的,将创建一个模型,该模型将分析新闻标题以预测股票价格。各种新闻文章会影响股票价格的波动。将使用NLP进行情感分析,然后预测股票价格是上涨还是下跌。这全部是关于股市情感分析的。
在这里,使用了Kaggle数据集。可以直接从这里下载。这个数据集是世界新闻和股票价格的组合,可在Kaggle上找到。数据框架中有25列是每天的顶级新闻标题,日期和标签(依赖特征)。数据范围从2008年到2016年,而2000年到2008年的数据框架是从雅虎财经抓取的。标签是基于道琼斯工业平均股票指数的。
类别1 - 股票价格上涨。类别0 - 股票价格保持不变或下跌。
首先,需要导入所需的库。
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report,confusion_matrix,accuracy_score
让读取数据集。
df = pd.read_csv('F:Stock-Sentiment-Analysis-master/Stock News Dataset.csv', encoding = "ISO-8859-1")
让看看数据集,标签是依赖特征(目标值),其余的26个特征是独立的。每当标签是1时,股价就会上涨,当得到这25条新闻标题时。这是拥有的数据集类型,将在这个问题陈述中使用NLP进行情感分析,然后将预测股价是上涨还是下跌。
让将数据集分成训练和测试部分。
train = df[df['Date'] < '20150101']
test = df[df['Date'] > '20141231']
根据日期划分数据集。数据集的日期小于20150101,将其作为训练数据集,数据集的日期大于20141231,将其作为测试数据集。
让对数据集进行一些特征工程。
现在让从文本数据集中删除所有这些列,句号或感叹号,因为这些都不是进行情感分析所必需的。取了所有25个新闻列,然后刚刚应用了正则表达式,说除了a-z和A-Z之外,将所有内容替换为空白。如果有任何特殊字符出现,它将自动删除它们并将它们替换为空白空间。
# 移除特殊字符
data=train.iloc[:,2:27]
data.replace("[^a-zA-Z]"," ",regex=True, inplace=True)
重命名列名以更好地理解和访问。
list1= [i for i in range(25)]
new_Index=[str(i) for i in list1]
data.columns= new_Index
更新后的数据集如下所示:
data.head(5)
让将所有这些字符转换为小写。
for index in new_Index:
data[index] = data[index].str.lower()
data.head(1)
这是一个非常重要的步骤,因为每当尝试创建一个词袋模型或TFIDF模型时,总是记住这些模型如果那个词以大写字母开头,而另一个句子中以小写字母出现相同的词,那么这个模型将考虑两个不同的词。这意味着相同的词,但由于只有大写和小写,它被认为是不同的词。
为了解决这些问题,正在执行这一步。因此,总是确保已经将所有字符转换为小写字符,也可以将它们转换为大写字符,但请记住,如果决定将所有字符转换为大写字符,那么每个字符都应该以大写字符出现,类似于小写字符。
让根据索引合并所有新闻标题:
如果将特定日期的所有新闻标题视为一个段落,那么那时只能应用CountVectorizer,这是词袋模型或TFIDF。所以会去每个索引,会将它们合并成一个段落。
headlines = []
for row in range(0,len(data.index)):
headlines.append(' '.join(str(x) for x in data.iloc[row,0:25]))
现在标题看起来像这样:
headlines
让应用CountVectorizer和RandomForestClassifier。
这里计数向量化器基本上会将这些句子转换为向量。这就是词袋的意思。
# 实施词袋模型
countvector=CountVectorizer(ngram_range=(2,2))
traindataset=countvector.fit_transform(headlines)
# 实施随机森林分类器
randomclassifier=RandomForestClassifier(n_estimators=200,criterion='entropy')
randomclassifier.fit(traindataset,train['Label'])
让为测试数据集进行预测。
现在对于测试数据集,将执行与训练数据集相同的特征转换。
# 为测试数据集进行预测
test_transform= []
for row in range(0,len(test.index)):
test_transform.append(' '.join(str(x) for x in test.iloc[row,2:27]))
test_dataset = countvector.transform(test_transform)
predictions = randomclassifier.predict(test_dataset)
最后,让检查准确性。
正在应用分类报告、混淆矩阵和准确度分数来检查模型的准确性。
matrix = confusion_matrix(test['Label'],predictions)
print(matrix)
score = accuracy_score(test['Label'],predictions)
print(score)
report = classification_report(test['Label'],predictions)
print(report)