scikit-learn的线性回归
scikit-learn的线性回归预测Google股票
这是机器学习系列的第一篇文章。
本文将使用Python
及scikit-learn
的线性回归预测Google的股票走势。请千万别期望这个示例能够让你成为股票高手。下面按逐步介绍如何进行实践。
准备数据
本文使用的数据来自www.quandl.com
网站。使用Python
相应的quandl
库就可以通过简单的几行代码获取到我们想要的数据。本文使用的是其中的免费数据。利用下面代码就可以拿到数据:
import quandl
df = quandl.get('WIKI/GOOGL')
其中WIKI/GOOGL
是数据集的ID,可以在网站查询到。不过我发现新版本的Quandl
要求用户在其网站注册获取身份信息,然后利用身份信息才能读取数据。这里用到的WIKI/GOOGL
数据集属于旧版本接口提供的数据,不需要提供身份信息。
通过上面代码,我们把数据获取到,并存放在df
变量中。默认地,Quandl
获取到的数据以Pandas
的DataFrame
存储。因此你可以通过DataFrame
的相关函数查看数据内容。如下图,使用print(df.head())
可以打印表格数据的头几行内容。
预处理数据
从上面图片我们看到数据集提供了很多列字段,例如Open
记录了股票开盘价、Close
记录了收盘价、Volumn
记录了当天的成交量。带Adj.
前缀的数据应该是除权后的数据。
我们并不需要用到所有的字段,因为我们的目标是预测股票的走势,因此需要研究的对象是某一时刻的股票价格,这样的有比较性。所以我们以除权后的收盘价Adj. Close
为研究对象来描述股票价格,也就是我们选择它作为将要被预测的变量。
接下来需要考虑关于什么变量跟股票价格有关。下面代码选取了几个可能影响Adj. Close
变化的字段作为回归预测的特征,并对这些特征进行处理。详细步骤请阅读注释。
import math
import numpy as np # 定义预测列变量,它存放研究对象的标签名
forecast_col = 'Adj. Close'
# 定义预测天数,这里设置为所有数据量长度的1%
forecast_out = int(math.ceil(0.01*len(df))) # 只用到df中下面的几个字段
df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']] # 构造两个新的列
# HL_PCT为股票最高价与最低价的变化百分比
df['HL_PCT'] = (df['Adj. High'] - df['Adj. Close']) / df['Adj. Close'] * 100.0
# HL_PCT为股票收盘价与开盘价的变化百分比
df['PCT_change'] = (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0 # 下面为真正用到的特征字段
df = df[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']]
# 因为scikit-learn并不会处理空数据,需要把为空的数据都设置为一个比较难出现的值,这里取-9999,
df.fillna(-99999, inplace=True)
# 用label代表该字段,是预测结果
# 通过让与Adj. Close列的数据往前移动1%行来表示
df['label'] = df[forecast_col].shift(-forecast_out) # 最后生成真正在模型中使用的数据X和y和预测时用到的数据数据X_lately
X = np.array(df.drop(['label'], 1))
# TODO 此处尚有疑问
X = preprocessing.scale(X)
# 上面生成label列时留下的最后1%行的数据,这些行并没有label数据,因此我们可以拿他们作为预测时用到的输入数据
X_lately = X[-forecast_out:]
X = X[:-forecast_out]
# 抛弃label列中为空的那些行
df.dropna(inplace=True)
y = np.array(df['label'])
上面代码难点在理解label
列的是如何生成的以及有什么用。实际上这一列的第i
个元素都是Adj. Close
列的第i + forecast_out
个元素。我想尝试用简单文字描述:这列的每个数据是真实统计中的未来forecast_out
天的收盘价。利用这一列的数据作为线性回归模型的监督标准,让模型学习出规律,然后我们才能用之预测结果。
另外X = preprocessing.scale(X)
这行代码对X的数据进行规范化处理,让X的数据服从正态分布。(PS. 但是,我发现这种处理让X的数据都发生了变化,因此无法理解这样做的原因,以及为什么不会影响模型学习的结果。有知道答案的麻烦留言告告知。)
线性回归
上面我们已经准备好了数据。可以开始构建线性回归模型,并让用数据训练它。
# scikit-learn从0.2版本开始废弃cross_validation,改用model_selection
from sklearn import preprocessing, model_selection, svm
from sklearn.linear_model import LinearRegression # 开始前,先X和y把数据分成两部分,一部分用来训练,一部分用来测试
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.2) # 生成scikit-learn的线性回归对象
clf = LinearRegression(n_jobs=-1)
# 开始训练
clf.fit(X_train, y_train)
# 用测试数据评估准确性
accuracy = clf.score(X_test, y_test)
# 进行预测
forecast_set = clf.predict(X_lately) print(forecast_set, accuracy)
上述几行代码就是使用scikit-learn
进行线性回归的训练和预测过程。我们可以通过测试数据计算模型的准确性accuracy
,并且通过向模型提供X_lately
计算预测结果forecast_set
。
我运行得到的结果如下:
需要注意到的这个准确性accuracy
并不表示模型预测100天的数据有97天是正确的。它表示的是线性模型能够描述统计数据的信息的一个统计概念。在后续的文章我可能会对这个变量进行一些讨论。
绘制走势
最后我们使用matplotlib
让数据可视化话。详细步骤看代码注释。
import matplotlib.pyplot as plt
from matplotlib import style
import datetime # 修改matplotlib样式
style.use('ggplot') one_day = 86400
# 在df中新建Forecast列,用于存放预测结果的数据
df['Forecast'] = np.nan
# 取df最后一行的时间索引
last_date = df.iloc[-1].name
last_unix = last_date.timestamp()
next_unix = last_unix + one_day # 遍历预测结果,用它往df追加行
# 这些行除了Forecast字段,其他都设为np.nan
for i in forecast_set:
next_date = datetime.datetime.fromtimestamp(next_unix)
next_unix += one_day
# [np.nan for _ in range(len(df.columns) - 1)]生成不包含Forecast字段的列表
# 而[i]是只包含Forecast值的列表
# 上述两个列表拼接在一起就组成了新行,按日期追加到df的下面
df.loc[next_date] = [np.nan for _ in range(len(df.columns) - 1)] + [i] # 开始绘图
df['Adj. Close'].plot()
df['Forecast'].plot()
plt.legend(loc=4)
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()
运行代码可以得到下图。
上图红色部分为采集到的已有数据,蓝色部分为预测数据。
点击这里查看完整代码。
scikit-learn的线性回归的更多相关文章
- (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探
一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...
- Scikit Learn: 在python中机器学习
转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...
- scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)
scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...
- (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探
目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...
- Scikit Learn
Scikit Learn Scikit-Learn简称sklearn,基于 Python 语言的,简单高效的数据挖掘和数据分析工具,建立在 NumPy,SciPy 和 matplotlib 上.
- Linear Regression with Scikit Learn
Before you read This is a demo or practice about how to use Simple-Linear-Regression in scikit-lear ...
- 如何使用scikit—learn处理文本数据
答案在这里:http://www.tuicool.com/articles/U3uiiu http://scikit-learn.org/stable/modules/feature_extracti ...
- Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)
所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的 ...
- 机器学习框架Scikit Learn的学习
一 安装 安装pip 代码如下:# wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=83 ...
- Python第三方库(模块)"scikit learn"以及其他库的安装
scikit-learn是一个用于机器学习的 Python 模块. 其主页:http://scikit-learn.org/stable/. GitHub地址: https://github.com/ ...
随机推荐
- C语言运行时数据结构
段(Segment): 对象文件/可执行文件: SVr4 UNIX上被称为ELF(起初"Extensible Linker Format", 现在"Executable ...
- C语言程序设计:现代方法阅读笔记
第二十六章 atexit函数允许用户“注册”在程序终止时要调用的函数:atexit(func); 在程序终止后,func函数会被自动调用 clock()函数可以计算程序运行时间 time函数返回当前的 ...
- hdu 4496 并查集 逆向 并查集删边
貌似某大犇说过 正难则反,,, 题目说要对这张图进行删边,然后判断联通块的个数,那么就可以先把所有边都删掉,之后从后往前加边,若加的边两端点不在同一个联通块中, 那么此时联通快个数少一,否则不变 #i ...
- Oracle11g R2创建PASSWORD_VERIFY_FUNCTION相应password复杂度验证函数步骤
Oracle11g R2创建PASSWORD_VERIFY_FUNCTION相应密码复杂度验证函数步骤 运行測试环境:数据库服务器Oracle Linux 5.8 + Oracle 11g R2数据库 ...
- 6.5.2 C# 中的函数组合
6.5.2 C# 中的函数组合 C# 中的函数组合是可能的.但使用非常有限,这是部分是由于在 C# 中散应用不能非常easy使用.但更重要的是,由于大多数操作是用成员来写的.而不是函数.但我们至少能够 ...
- Swift学习笔记(二)——常量与变量
这篇博客将会学习到Swift中的常量Constants和变量Variable.这是学习语言的基础.当中能够看到Swift每句后面基本都是没有:分号的,假设有加:分号的习惯,也能够加上. (1)常量声明 ...
- MySQ学习笔记之十 NULL值处理
这是MySQL一大特殊之处. 概念上.NULL意味着"没有值"或"未知值",且它被看作有点与众不同的值. 为了測试NULL.你不能使用算术比較运算符比如=.&l ...
- SDUTOJ 2776 小P的故事——奇妙的分组
#include<iostream> #include<math.h> #include<memory.h> using namespace std; int dp ...
- less07 important
less .foo (@bg: #f5f5f5, @color: #900) { background: @bg; color: @color; font-size: 16px; font-weigh ...
- bzoj1070: [SCOI2007]修车(费用流)
1070: [SCOI2007]修车 题目:传送门 题解: 一道挺简单的费用流吧...胡乱建模走起 贴个代码... #include<cstdio> #include<cstring ...