1. 程式人生 > >《Python資料分析與資料探勘實戰》第十三章學習——預測

《Python資料分析與資料探勘實戰》第十三章學習——預測

這一章內容是對財政收入的影響因素進行分析,並構建預測模型。
本章資料比較清楚,幾乎不用做清洗工作,主要工作都在模型構建上,中間涉及到的演算法有Lasso演算法的改進演算法——Adaptive-Lasso、書中自己編寫的灰色預測、神經網路。
書中對財政地方收入、增值稅、營業稅、政府基金收入等都做了預測,但每一個預測所用模型和構建過程都類似,因此本文只選擇財政地方收入作為例子進行整理。
本文主要分為以下幾個部分:

  1. 探索性分析
  2. 灰色預測
  3. 神經網路
  4. 總結

探索性分析

對變數進行描述性分析和相關性分析。
程式碼如下:

#-*- 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) #計算相關係數矩陣,保留兩位小數

檢視r_c中各變數與y(即財政收入)的相關性,結果如下:
這裡寫圖片描述
可見除了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、首項、方差比、小殘差概率

灰色預測是利用時間序列預測,主要用於對2014年和2015年的幾個變數進行預測,比如這裡的x1,x2,x3,x4,x5,x7,為後面的神經網路預測提供變數。
匯入函式,對財政地方收入進行預測。
程式碼如下:

#-*- 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。
變數填充結果如下圖:
這裡寫圖片描述
所需變數都已經填充上了,接下來要對財政地方收入,也就是y進行預測。

神經網路

關於神經網路的python程式包下載、後端設定都已經在第六章的時候說過了,其實現在用了python3.5之後,再用神經網路就直接用預設的tensorflow後端就好了,很方便。
以灰色模型預測結果中的變數為特徵變數,以y為預測值,構建神經網路模型,並畫出準確值與預測值的分佈圖。
程式碼如下:

#-*- 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()

模型學習了100多次之後就停止了。
預測結果對比圖如下:
這裡寫圖片描述
沒有書中的效果好,是因為書中學習了10000次,結果肯定會更準確一些,但總體來說,效果也還可以。

總結

本章內容較為簡單,新的實踐內容其實就是灰色預測與Adaptive-Lasso變數選擇,後者函式沒有找到沒辦法,而前者,通過資料查詢,灰色預測只適合短期內的預測,應用範圍有限,如果長期則準確率會有所下降,感覺平時應用也挺少的,因為沒怎麼聽說…