《Python數據分析與數據挖掘實戰》第十三章學習——預測

《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]html

查看r_c中各變量與y(即財政收入)的相關性,結果以下:
![這裏寫圖片描述](https://img-
blog.csdn.net/20180116142344648?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzM1MTk1MTM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可見除了X11(居民消費價格指數),其他變量均與財政收入呈現高度正相關。python

## 灰色預測算法

書中在構建預測模型以前利用了Adaptive-
Lasso進行變量選擇,但如今python的sklearn包裏已經沒有這個算法,找了好久也沒找到這個函數,其餘的替代函數也沒有找到,此處就不作這個變量選擇了,直接參考書上的變量選擇結果,進行預測模型構建。
灰色預測原理可參照[灰色預測模型]。( [
https://wenku.baidu.com/view/0abf24b7a5e9856a57126015.html
](https://wenku.baidu.com/view/0abf24b7a5e9856a57126015.html) )
書中所給灰色預測函數基本是按照其原理一步步完成的計算推導,具體代碼以下:後端

```code
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,爲後面的神經網絡預測提供變量。
導入函數,對財政地方收入進行預測。
代碼以下:app

```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

須要注意的是,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進行預測。ide

## 神經網絡函數

關於神經網絡的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)

相關文章
相關標籤/搜索