赞
踩
在之前,写了不少关于分类的算法,其中有传统机器学习算法如KNN、SVM,也有深度学习领域的算法如多层感知机,但是可以发现这里的算法核心思路都没有变化,利用一部分已有标签的数据训练模型,让模型去处理没有标签的数据。其实这里的分类只是分类的一种叫做有监督分类(有给定的标准,就是训练集),还有一种分类叫做无监督分类(没有标准),只是将特征接近的归为一类,又称为聚类问题。聚类的问题稍有复杂会在后面提到,这里会提及数据挖掘领域另一个大的问题方向—预测。
预测是人们根据事物的发展规律、历史和现状,分析影响其变化的因素,对其发展前景和趋势的一种推测。预测的方法和形式多种多样,根据方法本身的性质特点将预测方法分为定性预测方法、时间序列分析、因果关系预测。
时间序列分析预测法是一种定性分析方法,它是在时间序列变量分析的基础上,运用一定的数学方法建立预测模型,使时间趋势向外延伸,从而预测市场的发展变化趋势,确定变量预测值,也称为时间序列分析法、历史延伸法和外推法。
一般,时间序列分析通常将各种可能发生作用的因素进行分类,传统的分类方法是按各种因素的特点或影响效果分为四大类:长期趋势(T),季节变动(S),循环变动(C)和不规则变动(I)。
时间序列是指同一变量按时间发生的先后顺序排列起来的一组观察值或者记录值。时间序列分析预测法依据的是惯性原理,所以它建立在某经济变量过去的发展变化趋势的基础上,也就是该经济变量未来的发展变化趋势是假设的。然而从事物发展变化的规律来看,同一经济变量的发展趋势在不同时期是不可能完全相同的。这样只有将定性预测和时间序列分析预测结合在一起,才能收到最佳效果。即首先通过定性预测,在保证惯性原理成立的前提下,再运用时间序列分析预测法进行定量预测。
根据一年的历史数据预测后10年数据趋势,使用ARIMA(p,d,q)模型。
读取数据,对数据绘图,观察是否为平稳序列
对非平稳序列进行n阶差分,可以看到,一阶差分已经平稳,二阶变动不大,可以选择d=1。
选择合适的p,q
如何根据相关图选取ARIMA模型,这里不多提及了。最终确定模型为选定AIC、BIC、HQIC均值最小的ARMA(8,0)
使用模型进行预测。
预测结果还是比较合理的,相关代码如下。
# -*-coding:utf-8-*- import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt import statsmodels.api as sm from statsmodels.graphics.api import qqplot def get_data(): """ 读取数据,处理为pandas.Series类型 :return: """ with open('./data/data.txt') as f: data = f.readline() data = list(map(int, data.split(","))) data = np.array(data, dtype=np.float) data = pd.Series(data) return data def draw_plot(data): """ 对数据进行绘图,观测是否是平稳时间序列 :param data: :return: """ data.index = pd.Index(sm.tsa.datetools.dates_from_range('1927', '2016')) data.plot(figsize=(12, 8)) plt.show() def diff_data(data): """ 选择合适的p,q,以求使用ARIMA(p,d,q)模型 :param data: :return: """ # 一阶差分 fig = plt.figure(figsize=(12, 8)) ax1 = fig.add_subplot(211) diff1 = data.diff(1) diff1.plot(ax=ax1) # 二阶差分 ax2 = fig.add_subplot(212) diff2 = data.diff(2) diff2.plot(ax=ax2) plt.show() def choose_pq(data): """ 选择合适的p和q :param data: :return: """ # 检查平稳时间序列的自相关图和偏自相关图 diff1 = data.diff(1) fig = plt.figure(figsize=(12, 8)) ax1 = fig.add_subplot(211) fig = sm.graphics.tsa.plot_acf(data, lags=40, ax=ax1) ax2 = fig.add_subplot(212) fig = sm.graphics.tsa.plot_pacf(data, lags=40, ax=ax2) plt.show() def choose_model(data): """ 获取最佳模型 :param data: :return: """ arma_mod70 = sm.tsa.ARMA(data, (7, 0)).fit() print(arma_mod70.aic, arma_mod70.bic, arma_mod70.hqic) arma_mod30 = sm.tsa.ARMA(data, (0, 1)).fit() print(arma_mod30.aic, arma_mod30.bic, arma_mod30.hqic) arma_mod71 = sm.tsa.ARMA(data, (7, 1)).fit() print(arma_mod71.aic, arma_mod71.bic, arma_mod71.hqic) arma_mod80 = sm.tsa.ARMA(data, (8, 0)).fit() print(arma_mod80.aic, arma_mod80.bic, arma_mod80.hqic) def valid_model(data): """ 模型检验 :param data: :return: """ arma_mod80 = sm.tsa.ARMA(data, (8, 0)).fit() resid = arma_mod80.resid fig = plt.figure(figsize=(12, 8)) ax1 = fig.add_subplot(211) fig = sm.graphics.tsa.plot_acf(data, lags=40, ax=ax1) ax2 = fig.add_subplot(212) fig = sm.graphics.tsa.plot_pacf(data, lags=40, ax=ax2) plt.show() print(sm.stats.durbin_watson(arma_mod80.resid.values)) fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111) fig = qqplot(resid, line='q', ax=ax, fit=True) plt.show() r, q, p = sm.tsa.acf(resid.values.squeeze(), qstat=True) data = np.c_[range(1, 41), r[1:], q, p] table = pd.DataFrame(data, columns=['lag', 'AC', 'Q', 'Prob(>Q)']) print(table.set_index('lag')) def predict(data): """ 模型预测 :param data: :return: """ data.index = pd.Index(sm.tsa.datetools.dates_from_range('1927', '2016')) arma_mod80 = sm.tsa.ARMA(data, (8, 0)).fit() predict_sunspots = arma_mod80.predict('2016', '2026', dynamic=True) print(predict_sunspots) fig, ax = plt.subplots(figsize=(12, 8)) ax = data.ix['1927':].plot(ax=ax) fig = arma_mod80.plot_predict('2016', '2026', dynamic=True, ax=ax, plot_insample=False) plt.show() if __name__ == '__main__': data = get_data() # draw_plot(data) # diff_data(data) # choose_pq(data) # choose_model(data) # valid_model(data) predict(data)
参考了《Python3数据分析与机器学习实战》,具体数据集和代码可以查看我的GitHub,欢迎star或者fork。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。