《Python数据分析与数据挖掘实战》第十三章学习——预测

#-*- coding: utf-8 -*-
import numpy as np
import pandas as pd
inputfile='D:/ProgramData/datapath.csv'
data = pd.read_csv(inputfile) #读取数据
#描述分析
r = [data.min(), data.max(), data.mean(), data.std()] #依次计算最小值、最大值、均值、标准差
r = pd.DataFrame(r, index = ['Min', 'Max', 'Mean', 'STD']).T  #表格化
r=np.round(r, 2) #保留两位小数
#相关性分析
r_c=np.round(data.corr(method = 'pearson'), 2) #计算相关系数矩阵,保留两位小数

[/code]

查看r_c中各变量与y(即财政收入)的相关性,结果如下:
![这里写图片描述](https://img-
blog.csdn.net/20180116142344648?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzM1MTk1MTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可见除了X11(居民消费价格指数),其余变量均与财政收入呈现高度正相关。

灰色预测

书中在构建预测模型之前利用了Adaptive-
Lasso进行变量选择,但现在python的sklearn包里已经没有这个算法,找了很久也没找到这个函数,其他的替代函数也没有找到,此处就不做这个变量选择了,直接参考书上的变量选择结果,进行预测模型构建。
灰色预测原理可参照[灰色预测模型]。(
https://wenku.baidu.com/view/0abf24b7a5e9856a57126015.html
)
书中所给灰色预测函数基本是按照其原理一步步完成的计算推导,具体代码如下:

    def GM11(x0): #自定义灰色预测函数
      import numpy as np
      x1 = x0.cumsum() #1-AGO序列
      z1 = (x1[:len(x1)-1] + x1[1:])/2.0 #紧邻均值(MEAN)生成序列
      z1 = z1.reshape((len(z1),1))
      B = np.append(-z1, np.ones_like(z1), axis = 1)
      Yn = x0[1:].reshape((len(x0)-1, 1))
      [[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Yn) #计算参数(最小二乘法估计参数)
      f = lambda k: (x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2)) #还原值
      delta = np.abs(x0 - np.array([f(i) for i in range(1,len(x0)+1)]))
      C = delta.std()/x0.std()
      P = 1.0*(np.abs(delta - delta.mean()) < 0.6745*x0.std()).sum()/len(x0)
      return f, a, b, x0[0], C, P #返回灰色预测函数、a、b、首项、方差比、小残差概率
[/code]

灰色预测是利用 **时间序列**
预测,主要用于对2014年和2015年的几个变量进行预测,比如这里的x1,x2,x3,x4,x5,x7,为后面的神经网络预测提供变量。  
导入函数,对财政地方收入进行预测。  
代码如下:

```code
    #-*- coding: utf-8 -*-
    import numpy as np
    import pandas as pd
    import sys
    #添加自定义函数所在位置
    sys.path.append('D:/ProgramData/codepath')
    #前一个GM11为文件名,后一个为函数名
    from GM11 import GM11
    
    inputfile='D:/ProgramData/PythonDataAnalysiscode/chapter13/demo/data/data1.csv'#定义输入数据路径
    outputfile='D:/ProgramData/PythonDataAnalysiscode/chapter13/demo/outdata/data1_GM11.xls'#定义输出数据保存路径
    
    data=pd.read_csv(inputfile)
    data.index=np.arange(1994,2014)
    data.loc[2014]=None
    data.loc[2015]=None
    l=['x1','x2','x3','x4','x5','x7']#根据变量选择选取这六个变量
    for i in l:
        f = GM11(data[i][np.arange(1994, 2014)].as_matrix())[0]#灰色预测函数
        data[i][2014] = f(len(data)-1) #2014年预测结果
        data[i][2015] = f(len(data)) #2015年预测结果
        data[i] = data[i].round(2) #保留两位小数
    data[l+['y']].to_excel(outputfile) #结果输出```

需要注意的是,python2.7和python3.5中的range()有区别,前者表示list,而后者表示迭代器,因此上述代码不能使用range,会报错,改成numpy里的arange。  
变量填充结果如下图:  
![这里写图片描述](https://img-
blog.csdn.net/20180116154105115?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzM1MTk1MTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)  
所需变量都已经填充上了,接下来要对财政地方收入,也就是y进行预测。

##  神经网络

关于神经网络的python程序包下载、后端设置都已经在第六章的时候说过了,其实现在用了python3.5之后,再用神经网络就直接用默认的tensorflow后端就好了,很方便。  
以灰色模型预测结果中的变量为特征变量,以y为预测值,构建神经网络模型,并画出准确值与预测值的分布图。  
代码如下:

```code
    #-*- coding: utf-8 -*-
    import numpy as np
    import pandas as pd
    inputfile='D:/ProgramData/PythonDataAnalysiscode/chapter13/demo/outdata/data1_GM11.xls'
    outputfile='D:/ProgramData/PythonDataAnalysiscode/chapter13/demo/outdata/revenue.xls'
    modelfile='D:/ProgramData/PythonDataAnalysiscode/chapter13/demo/outdata/1-net.model'
    data=pd.read_excel(inputfile)
    feature=['x1','x2','x3','x4','x5','x7']#特征所在列
    
    data_train=data.loc[np.arange(1994,2014)].copy()
    
    data_mean=data_train.mean()
    data_std=data_train.std()
    #零均值标准化
    data_train=(data_train-data_mean)/data_std
    x_train=data_train[feature].as_matrix()
    y_train=data_train['y'].as_matrix()
    
    from keras.models import Sequential
    from keras.layers.core import Dense,Activation
    from keras.callbacks import EarlyStopping
    early_stopping = EarlyStopping(monitor='loss', patience=5)#提早停止
    model.add(Dense(12,input_dim=6,init='uniform'))#输入层6层,隐藏层12层
    model.add(Activation('relu'))#激活函数为relu,能够大幅度提高准确度
    model.add(Dense(1,input_dim=12))#隐藏层12层,输出层1层
    model.compile(loss='mean_squared_error',optimizer='adam')#编译模型
    model.fit(x_train,y_train,nb_epoch=10000,batch_size=16,callbacks=[early_stopping])#训练模型,学习一万次,如果误差不再减少,就提早停止
    model.save_weights(modelfile)#保存模型参数
    
    #预测,并还原结果
    x=((data[feature]-data_mean[feature])/data_std[feature]).as_matrix()
    data[u'y_pred']=model.predict(x)*data_std['y']+data_mean['y']
    data.to_excel(outputfile)
    
    #画出预测结果图
    import matplotlib.pyplot as plt
    p=data[['y','y_pred']].plot(subplots=True,style=['b-o','r-*'])
    plt.show()
[/code]

模型学习了100多次之后就停止了。  
预测结果对比图如下:  
![这里写图片描述](https://img-
blog.csdn.net/20180116162504224?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzM1MTk1MTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)  
没有书中的效果好,是因为书中学习了10000次,结果肯定会更准确一些,但总体来说,效果也还可以。

##  总结

本章内容较为简单,新的实践内容其实就是灰色预测与Adaptive-
Lasso变量选择,后者函数没有找到没办法,而前者,通过资料查找,灰色预测只适合短期内的预测,应用范围有限,如果长期则准确率会有所下降,感觉平时应用也挺少的,因为没怎么听说…


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210608151750993.gif)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值