• constant.py

定义数据位置,在主文件中调用

raw_text_csv_file = './dataset/Combined_News_DJIA.csv'
cln_text_csv_file = './cln_text.csv'
  • tools.py
    把主文件需要数据处理的步骤模块化,分别定义为函数进行调用,代码更加清晰
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
import pandas as pd
import numpy as np
from sklearn.model_selection import GridSearchCVdef proc_text(raw_line):"""处理每行的文本数据返回分词结果"""raw_line = str(raw_line)# 全部转为小写raw_line = raw_line.lower()# 去除 b'...' 或 b"..."if raw_line[:2] == 'b\'' or raw_line[:2] == 'b"':raw_line = raw_line[2:-1]tokenizer = RegexpTokenizer(r'\w+')tokens = tokenizer.tokenize(raw_line)meaninful_words = [w for w in tokens if w not in stopwords.words('english')]return ' '.join(meaninful_words)def clean_text(raw_text_df):"""清洗原始文本数据"""cln_text_df = pd.DataFrame()cln_text_df['date'] = raw_text_df['Date'].valuescln_text_df['label'] = raw_text_df['Label'].valuescln_text_df['text'] = ''# 处理25列文本数据,['Top1', ..., 'Top25']col_list = ['Top' + str(i) for i in range(1, 26)]for i, col in enumerate(col_list):raw_text_df[col] = raw_text_df[col].apply(proc_text)# 合并列cln_text_df['text'] = cln_text_df['text'].str.cat(raw_text_df[col], sep=' ')print('已处理{}列.'.format(i + 1))return cln_text_dfdef split_train_test(data_df):"""分割训练集和测试集"""# 训练集时间范围 2008-08-08 ~ 2014-12-31train_text_df = data_df.loc['20080808':'20141231', :]# 将时间索引替换为整型索引train_text_df.reset_index(drop=True, inplace=True)# 测试集时间范围 2015-01-02 ~ 2016-07-01test_text_df = data_df.loc['20150102':'20160701', :]# 将时间索引替换为整型索引test_text_df.reset_index(drop=True, inplace=True)return train_text_df, test_text_dfdef get_word_list_from_data(text_df):"""将数据集中的单词放入到一个列表中"""word_list = []for _, r_data in text_df.iterrows():word_list += r_data['text'].split(' ')return word_listdef extract_feat_from_data(text_df, text_collection, common_words_freqs):"""特征提取"""# 这里只选择TF-IDF特征作为例子# 可考虑使用词频或其他文本特征作为额外的特征n_sample = text_df.shape[0]n_feat = len(common_words_freqs)common_words = [word for word, _ in common_words_freqs]# 初始化X = np.zeros([n_sample, n_feat])y = np.zeros(n_sample)print('提取特征...')for i, r_data in text_df.iterrows():if (i + 1) % 100 == 0:print('已完成{}个样本的特征提取'.format(i + 1))text = r_data['text']feat_vec = []for word in common_words:if word in text:# 如果在高频词中,计算TF-IDF值tf_idf_val = text_collection.tf_idf(word, text)else:tf_idf_val = 0feat_vec.append(tf_idf_val)# 赋值X[i, :] = np.array(feat_vec)y[i] = int(r_data['label'])return X, ydef get_best_model(model, X_train, y_train, params, cv=5):"""交叉验证获取最优模型默认5折交叉验证"""clf = GridSearchCV(model, params, cv=cv, verbose=3)clf.fit(X_train, y_train)return clf.best_estimator_
  • main.py
    运行整个项目的主文件
import os
import constant
import pandas as pd
from tools import clean_text, split_train_test, get_word_list_from_data, \extract_feat_from_data, get_best_model
import nltk
from nltk.text import TextCollection
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn import svm
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, roc_auc_score
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
os.chdir(r'C:\Users\LHL\Desktop\小象学院数据分析\lect10_codes\lect10_codes\lect10_proj')def main():"""主函数"""# Step 1: 处理数据集print('===Step1: 处理数据集===')if not os.path.exists(constant.cln_text_csv_file):print('清洗数据...')# 读取原始csv文件raw_text_df = pd.read_csv(constant.raw_text_csv_file)# 清洗原始数据cln_text_df = clean_text(raw_text_df)# 保存处理好的文本数据cln_text_df.to_csv(constant.cln_text_csv_file, index=None)print('完成,并保存结果至', constant.cln_text_csv_file)print('================\n')# Step 2. 查看整理好的数据集,并选取部分数据作为模型的训练print('===Step2. 查看数据集===')text_data = pd.read_csv(constant.cln_text_csv_file)text_data['date'] = pd.to_datetime(text_data['date'])text_data.set_index('date', inplace=True)print('各类样本数量:')print(text_data.groupby('label').size())# Step 3. 分割训练集和测试集print('===Step3. 分割训练集合测试集===')train_text_df, test_text_df = split_train_test(text_data)# 查看训练集测试集基本信息print('训练集中各类的数据个数:')print(train_text_df.groupby('label').size())print('测试集中各类的数据个数:')print(test_text_df.groupby('label').size())print('================\n')# Step 4. 特征提取print('===Step4. 文本特征提取===')# 计算词频n_common_words = 200# 将训练集中的单词拿出来统计词频print('统计词频...')all_words_in_train = get_word_list_from_data(train_text_df)fdisk = nltk.FreqDist(all_words_in_train)common_words_freqs = fdisk.most_common(n_common_words)print('出现最多的{}个词是:'.format(n_common_words))for word, count in common_words_freqs:print('{}: {}次'.format(word, count))print()# 在训练集上提取特征text_collection = TextCollection(train_text_df['text'].values.tolist())print('训练样本提取特征...')train_X, train_y = extract_feat_from_data(train_text_df, text_collection, common_words_freqs)print('完成')print()print('测试样本提取特征...')test_X, test_y = extract_feat_from_data(test_text_df, text_collection, common_words_freqs)print('完成')print('================\n')# 特征处理# 特征范围归一化scaler = StandardScaler()tr_feat_scaled = scaler.fit_transform(train_X)te_feat_scaled = scaler.transform(test_X)# 3.6 特征选择sel = VarianceThreshold(threshold=(.8 * (1 - .8)))tr_feat_scaled_sel = sel.fit_transform(tr_feat_scaled)te_feat_scaled_sel = sel.transform(te_feat_scaled)# 3.7 PCA降维操作pca = PCA(n_components=0.95)  # 保留95%贡献率的特征向量tr_feat_scaled_sel_pca = pca.fit_transform(tr_feat_scaled_sel)te_feat_scaled_sel_pca = pca.transform(te_feat_scaled_sel)print('特征处理结束')print('处理后每个样本特征维度:', tr_feat_scaled_sel_pca.shape[1])# Step 5. 训练模型models = []print('===Step5. 训练模型===')print('1. 朴素贝叶斯模型:')gnb_model = GaussianNB()gnb_model.fit(tr_feat_scaled_sel_pca, train_y)models.append(['朴素贝叶斯', gnb_model])print('完成')print()print('2. 逻辑回归:')lr_param_grid = [{'C': [1e-3, 1e-2, 1e-1, 1, 10, 100]}]lr_model = LogisticRegression()best_lr_model = get_best_model(lr_model,tr_feat_scaled_sel_pca, train_y,lr_param_grid, cv=3)models.append(['逻辑回归', best_lr_model])print('完成')print()print('3. 支持向量机:')svm_param_grid = [{'C': [1e-2, 1e-1, 1, 10, 100], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},]svm_model = svm.SVC(probability=True)best_svm_model = get_best_model(svm_model,tr_feat_scaled_sel_pca, train_y,svm_param_grid, cv=3)models.append(['支持向量机', best_svm_model])print('完成')print()print('4. 随机森林:')rf_param_grid = [{'n_estimators': [10, 50, 100, 150, 200]}]rf_model = RandomForestClassifier()best_rf_model = get_best_model(rf_model,tr_feat_scaled_sel_pca, train_y,rf_param_grid, cv=3)rf_model.fit(tr_feat_scaled_sel_pca, train_y)models.append(['随机森林', best_rf_model])print('完成')print()# Step 6. 测试模型print('===Step6. 测试模型===')for i, model in enumerate(models):print('{}-{}'.format(i + 1, model[0]))# 输出准确率print('准确率:', accuracy_score(test_y, model[1].predict(te_feat_scaled_sel_pca)))print('AUC:', roc_auc_score(test_y, model[1].predict_proba(te_feat_scaled_sel_pca)[:, 0]))# 输出混淆矩阵print('混淆矩阵')print(confusion_matrix(test_y, model[1].predict(te_feat_scaled_sel_pca)))print()if __name__ == '__main__':main()

通过新闻预测股市涨跌相关推荐

  1. 【手把手教你】使用Logistic回归、LDA和QDA模型预测指数涨跌

    1 引言 机器学习(Machine Learning)是人工智能(AI)的重要组成部分,目前已广泛应用于数据挖掘.自然语言处理.信用卡欺诈检测.证券市场分析等领域.量化投资作为机器学习在投资领域内最典 ...

  2. python支持向量机 股票_小蛇学python(4)利用SVM预测股票涨跌

    最近接了一个私活,指导学妹完成毕业设计.核心思想就是利用SVM模型来预测股票涨跌,并完成策略构建,自动化选择最优秀的股票进行资产配置. 在做这个项目的过程中,我体会到想成为一个合格的数据分析或者数据挖 ...

  3. python应用(3)svm模型预测股票涨跌

    最近接了一个私活,指导学妹完成毕业设计.核心思想就是利用SVM模型来预测股票涨跌,并完成策略构建,自动化选择最优秀的股票进行资产配置. 在做这个项目的过程中,我体会到想成为一个合格的数据分析或者数据挖 ...

  4. 量化交易是不是用机器预测股票涨跌?这靠谱吗?

    量化交易是不是用机器预测股票涨跌?是又不全是,量化交易是策略制定的基础上进行自动化交易,也不能全说是机器预测涨跌的,而且机器学习预测股票涨跌也不太靠谱,结果和丢硬币差不了太多. 虽然用机器学习来预测涨 ...

  5. 传统机器学习分类模型预测股价涨跌

    前言 股票市场风起云涌,只有对股价有良好的预测才能够更好的抓住盈利机会.那么传统的机器学习分类模型在这方面的效果如何呢? 本文在只考虑5.10.20日移动平均线.移动指数平均线这六项指标的情况下,比较 ...

  6. 如何利用机器学习预测股市,成为百万富翁?

    全文共5549字,预计学习时长11分钟 正如人们所想象的一样,在华尔街工作充满机遇与挑战.大家都西装革履.脸色阴沉.手持香烟吞云吐雾.在世界金融中心的喧嚣里,每个人的实际目标都很简单.不过是冒着将事物 ...

  7. CNN模型预测股票涨跌的始末过程——(一)股票数据的获取

    CNN模型预测股票涨跌的始末过程--(一)股票数据的获取[附源码和数据] 股票数据的获取 Choice数据 - 东方财富 Tushare BigQuant 最后列一下我下载成功的数据 股票数据的获取 ...

  8. 机器学习预测股市_机器学习在股市中的表现如何

    机器学习预测股市 When it comes to using machine learning in the stock market, there are multiple approaches ...

  9. svm预测股价 python_小蛇学python(4)利用SVM预测股票涨跌

    最近接了一个私活,指导学妹完成毕业设计.核心思想就是利用SVM模型来预测股票涨跌,并完成策略构建,自动化选择最优秀的股票进行资产配置. 在做这个项目的过程中,我体会到想成为一个合格的数据分析或者数据挖 ...

最新文章

  1. centos7-同步时间
  2. [转载]freeSwitch基本操作(转载)
  3. html js绑定键盘按键触发事件(按回车键登陆)
  4. AJAX——与服务器交换数据并更新部分网页技术
  5. mac m1上运行jenkins
  6. java取二进制其中两位_Java:二进制(原码、反码、补码)与位运算(示例代码)...
  7. DPDK:不仅是加速
  8. Linux远程管理协议(RFB、RDP、Telnet和SSH)
  9. IOS中获取屏幕尺寸
  10. springboot整合rabbitmq之消息的确认机制
  11. 活学活用pic单片机c语言编程pdf,活学活用PIC单片机C语言编程
  12. 键盘扫描码集(共三版)
  13. 万年历单片机课程设计百度文库_单片机课程设计报告(万年历)
  14. goodix触摸屏(IIC)外设驱动
  15. SpringBoot 3.0 来啦!
  16. [python之数据分析] 基础篇1- Numpy,Scipy,Matplotlib 快速入门攻略
  17. 运行时错误1004 应用程序定义或对象定义错误
  18. Item 3: Understand decltype
  19. (深度学习入门)sigmoid型函数和 sigmoid函数的区别
  20. 在kibana中查询elasticsearch数据的方法(lucene和kql语法)

热门文章

  1. 问题记录-Android遇到的覆盖安装问题
  2. iTOP-4412开发板全新升级支持4G全网通模块
  3. list-style-type:定义列表样式
  4. 智慧水利:河湖水库生态流量监测预警系统
  5. ✔[77]组合(回溯,DFS)
  6. Java基础教程23-static举例
  7. Java基础教程0-测试人员为什么要掌握Java基础
  8. 基于servlet的服务端与安卓客户端的通信(文本)
  9. MFC框架下自绘CEdit控件
  10. 壹佰智能名片v1.2.11 壹佰名片 名片 商城