【作者主頁】Francek Chen
【專欄介紹】 ? ? ?機器學習與數據挖掘實戰 ? ? ? 機器學習是人工智能的一個分支,專注于讓計算機系統通過數據學習和改進。它利用統計和計算方法,使模型能夠從數據中自動提取特征并做出預測或決策。數據挖掘則是從大型數據集中發現模式、關聯和異常的過程,旨在提取有價值的信息和知識。機器學習為數據挖掘提供了強大的分析工具,而數據挖掘則是機器學習應用的重要領域,兩者相輔相成,共同推動數據科學的發展。本專欄介紹機器學習與數據挖掘的相關實戰案例。
【GitCode】專欄資源保存在我的GitCode倉庫:https://gitcode.com/Morse_Chen/ML-DM_cases。
文章目錄
- 一、目標分析
- (一)背景
- (二)數據說明
- (三)分析目標
- 二、數據準備
- 三、特征工程
- (一)Lasso回歸
- (二)特征選擇
- 四、模型訓練
- (一)灰色預測模型
- (二)關鍵特征預測
- (三)SVR模型預測
- 五、性能度量
- 小結
一、目標分析
(一)背景
財政收入是政府理財的重要環節,是政府進行宏觀調控的重要手段之一,也是政府提供公共產品滿足公共支出需要的重要經濟基礎。財政收入規模是衡量一個國家或一個地區財力和相關政府在社會經濟生活中職能范圍的重要指標。只有在組織財政收入的過程中正確處理各種物質利益關系,才能達到充分調動各方面的積極性,達到優化資源配置,協調分配關系的目的。財政收入的變化受到經濟發展水平和分配政策的制約,同時也會影響到后續財政支出的規劃,從而影響到下一階段的發展規劃與相關決策。
本案例利用某市財政收入的歷史數據,建立合理的模型,對該市2014年和2015年財政收入進行預測,希望預測結果能夠幫助政府合理的控制財政收支,優化財源建設,為制政府定相關決策提供依據。
(二)數據說明
考慮到數據的可得性,本案例所用的財政收入數據分為地方一般預算收入和政府性基金收入。
地方一般預算收入包括以下兩個部分。
- 稅收收入。主要包括企業所得稅與地方所得稅中中央和地方共享的40%,地方享有的25%的增值稅、營業稅和印花稅等。
- 非稅收收入。包括專項收入、行政事業性收費收入、罰沒收入、國有資本經營收入和其他收入等。
政府性基金收入是國家通過向社會征收以及出讓土地、發行彩票等方式取得收入。并專項用于支持特定基礎設施建設和社會事業發展的收入。
本案例所用數據集data.csv
內容如下。
本案例所用數據特征名稱及說明如下表所示。
特征名稱 | 特征說明 |
---|---|
社會從業人數 x 1 x_1 x1? | 就業人數的上升伴隨著居民消費水平的提高,從而間接影響財政收入的增加。 |
在崗職工工資總額 x 2 x_2 x2? | 反映的是社會分配情況,主要影響財政收入中的個人所得稅,房產稅以及潛在消費能力。 |
社會消費品零售總額 x 3 x_3 x3? | 代表社會整體消費情況,是可支配收入在經濟生活中的實現。當社會消費品零售總額增長時,表明社會消費意愿強烈,部分程度上會導致財政收入中增值稅的增長,當消費增長時,也會引起經濟系統中其他方面發生變動,最終導致財政收入的增長。 |
城鎮居民人均可支配收入 x 4 x_4 x4? | 居民收入越高消費能力越強,同時意味著其工作積極性越高,創造出的財富越多,從而能帶來財政收入更快和持續的增長。 |
城鎮居民人均消費性支出 x 5 x_5 x5? | 居民在消費商品的過程中會產生各種稅費,稅費又是調節生產規模的手段之一。在商品經濟發達的如今,居民消費的越多,對財政收入的貢獻就越大。 |
年末總人口 x 6 x_6 x6? | 在地方經濟發展水平既定的條件下,人均地方財政收入與地方人口數呈反比例變化。 |
全社會固定資產投資額 x 7 x_7 x7? | 全社會固定資產投資是建造和購置固定資產的經濟活動,即固定資產再生產活動。主要通過投資來促進經濟增長,擴大稅源,進而拉動財政稅收收入整體增長。 |
地區生產總值 x 8 x_8 x8? | 表示地方經濟發展水平。一般來講,政府財政收入來源于當期的地區生產總值。在國家經濟政策不變、社會秩序穩定的情況下,地方經濟發展水平與地方財政收入之間存在著密切的相關性,越是經濟發達的地區,其財政收入的規模就越大。 |
第一產業產值 x 9 x_9 x9? | 由于取消農業稅,實施三農政策,使得第一產業產值對財政收入的影響更小。 |
稅收 x 10 x_{10} x10? | 由于其具有征收的強制性、無償性和固定性特點,可以為政府履行其職能提供充足的資金來源。因此,各國都將其作為政府財政收入的最重要的收入形式和來源。 |
居民消費價格指數 x 11 x_{11} x11? | 反映居民家庭購買的消費品及服務價格水平的變動情況,影響城鄉居民的生活支出和國家的財政收入。 |
第三產業與第二產業產值比 x 12 x_{12} x12? | 表示產業結構。第三產業生產總值代表國民經濟水平,是財政收入的主要影響因素,當產業結構逐步優化時,財政收入也會隨之增加。 |
居民消費水平 x 13 x_{13} x13? | 在很大程度上受整體經濟狀況GDP的影響,從而間接影響地方財政收入。 |
(三)分析目標
結合某市財政收入的數據情況,可以實現以下目標。
- 分析、識別影響地方財政收入的關鍵特征。
- 預測2014年和2015年的財政收入。
本案例包括以下步驟。
- 對原始數據進行探索性分析,了解原始特征之間的相關性。
- 利用Lasso特征選擇模型進行特征提取。
- 建立單個特征的灰色預測模型以及支持向量回歸預測模型。
- 使用支持向量回歸預測模型得出2014–2015年財政收入的預測值。
- 對上述建立的財政收入預測模型進行評價。
本案例的總體流程圖如下圖所示。
二、數據準備
本案例采用的數據是某市財政收入數據,均來自某市的統計年鑒。本案例僅對1994–2013年的數據進行分析。獲取數據后,發現影響地方財政收入的特征有很多,在建立模型之前需要判斷財政收入與所給特征之間的相關性、各特征之間的相關性,以此判斷所給特征是否可以用作建模的關鍵特征,不能用作關鍵特征的需要刪除,本案例利用Pearson相關系數判斷各特征之間的相關性。
相關代碼如下。
import numpy as np
import pandas as pddata = pd.read_csv('../data/data.csv') # 讀取數據
# 保留兩位小數,并將結果保存為’.csv’文件
np.round(data.corr(method = 'pearson'), 2).to_csv('../tmp/data_cor.csv')
print('相關系數矩陣為:\n', np.round(data.corr(method = 'pearson'), 2))
數據各特征之間的Pearson相關系數,如下表所示。
x 1 x_1 x1? | x 2 x_2 x2? | x 3 x_3 x3? | x 4 x_4 x4? | x 5 x_5 x5? | x 6 x_6 x6? | x 7 x_7 x7? | x 8 x_8 x8? | x 9 x_9 x9? | x 10 x_{10} x10? | x 11 x_{11} x11? | x 12 x_{12} x12? | x 13 x_{13} x13? | y y y | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x 1 x_1 x1? | 1.00 | 0.95 | 0.95 | 0.97 | 0.97 | 0.99 | 0.95 | 0.97 | 0.98 | 0.98 | -0.29 | 0.94 | 0.96 | 0.94 |
x 2 x_2 x2? | 0.95 | 1.00 | 1.00 | 0.99 | 0.99 | 0.92 | 0.99 | 0.99 | 0.98 | 0.98 | -0.13 | 0.89 | 1.00 | 0.98 |
x 3 x_3 x3? | 0.95 | 1.00 | 1.00 | 0.99 | 0.99 | 0.92 | 1.00 | 0.99 | 0.98 | 0.99 | -0.15 | 0.89 | 1.00 | 0.99 |
x 4 x_4 x4? | 0.97 | 0.99 | 0.99 | 1.00 | 1.00 | 0.95 | 0.99 | 1.00 | 0.99 | 1.00 | -0.19 | 0.91 | 1.00 | 0.99 |
x 5 x_5 x5? | 0.97 | 0.99 | 0.99 | 1.00 | 1.00 | 0.95 | 0.99 | 1.00 | 0.99 | 1.00 | -0.18 | 0.90 | 0.99 | 0.99 |
x 6 x_6 x6? | 0.99 | 0.92 | 0.92 | 0.95 | 0.95 | 1.00 | 0.93 | 0.95 | 0.97 | 0.96 | -0.34 | 0.95 | 0.94 | 0.91 |
x 7 x_7 x7? | 0.95 | 0.99 | 1.00 | 0.99 | 0.99 | 0.93 | 1.00 | 0.99 | 0.98 | 0.99 | -0.15 | 0.89 | 1.00 | 0.99 |
x 8 x_8 x8? | 0.97 | 0.99 | 0.99 | 1.00 | 1.00 | 0.95 | 0.99 | 1.00 | 0.99 | 1.00 | -0.15 | 0.90 | 1.00 | 0.99 |
x 9 x_9 x9? | 0.98 | 0.98 | 0.98 | 0.99 | 0.99 | 0.97 | 0.98 | 0.99 | 1.00 | 0.99 | -0.23 | 0.91 | 0.99 | 0.98 |
x 10 x_{10} x10? | 0.98 | 0.98 | 0.99 | 1.00 | 1.00 | 0.96 | 0.99 | 1.00 | 0.99 | 1.00 | -0.17 | 0.90 | 0.99 | 0.99 |
x 11 x_{11} x11? | -0.29 | -0.13 | -0.15 | -0.19 | -0.18 | -0.34 | -0.15 | -0.15 | -0.23 | -0.17 | 1.00 | -0.43 | -0.16 | -0.12 |
x 12 x_{12} x12? | 0.94 | 0.89 | 0.89 | 0.91 | 0.90 | 0.95 | 0.89 | 0.90 | 0.91 | 0.90 | -0.43 | 1.00 | 0.90 | 0.87 |
x 13 x_{13} x13? | 0.96 | 1.00 | 1.00 | 1.00 | 0.99 | 0.94 | 1.00 | 1.00 | 0.99 | 0.99 | -0.16 | 0.90 | 1.00 | 0.99 |
y y y | 0.94 | 0.98 | 0.99 | 0.99 | 0.99 | 0.91 | 0.99 | 0.99 | 0.98 | 0.99 | -0.12 | 0.87 | 0.99 | 1.00 |
根據相關系數表所示的結果得到以下分析。
居民消費價格指數( x 11 x_{11} x11?)與財政收入( y y y)的線性關系不顯著,呈現一定程度的負相關。其余特征均與財政收入呈現高度的正相關關系。按相關性大小,依次是 x 3 , x 4 , x 5 , x 7 , x 8 , x 10 , x 13 , x 2 , x 9 , x 1 , x 6 x_3, x_4, x_5, x_7, x_8, x_{10}, x_{13}, x_2, x_9, x_1, x_6 x3?,x4?,x5?,x7?,x8?,x10?,x13?,x2?,x9?,x1?,x6? 和 x 12 x_{12} x12?。
同時,各特征之間存在著嚴重的共線性。特征 x 1 , x 4 , x 5 , x 6 , x 8 , x 9 , x 10 x_1, x_4, x_5, x_6, x_8, x_9, x_{10} x1?,x4?,x5?,x6?,x8?,x9?,x10? 與除了 x 11 x_{11} x11?之外的特征均存在嚴重的共線性,特征 x 2 , x 3 , x 7 x_2, x_3, x_7 x2?,x3?,x7? 與除了 x 11 x_{11} x11?和 x 12 x_{12} x12?外的其他特征存在著嚴重的共線性。 x 11 x_{11} x11?與各特征的共線性不明顯, x 12 x_{12} x12?與除了 x 2 , x 3 , x 7 , x 11 x_2, x_3, x_7, x_{11} x2?,x3?,x7?,x11? 之外的其他特征有嚴重的共線性, x 13 x_{13} x13?與除了 x 11 x_{11} x11?之外的各特征有嚴重的共線性。 x 2 x_2 x2?和 x 3 x_3 x3?, x 2 x_2 x2?和 x 13 x_{13} x13?, x 3 x_3 x3?和 x 13 x_{13} x13?等多對特征之間存在完全的共線性。
根據對相關系數表分析可知以下兩點。選取的各特征除了 x 11 x_{11} x11?外,其他特征與 y y y的相關性很強,可以用作財政收入預測分析的關鍵特征,特征之間存在著信息的重復,在建立模型之前需要對特征進行進一步篩選。
三、特征工程
雖然在數據準備過程中對特征進行了初步篩選,但是引入的特征太多,而且這些特征之間存在著信息的重復。為了保留重要的特征,建立精確、簡單的模型,需要對原始特征進一步篩選,考慮到傳統的特征選擇方法存在一定的局限性,本案例采用最近廣泛使用的Lasso特征選擇方法對原始特征進一步篩選。
(一)Lasso回歸
Lasso回歸方法以縮小特征集(降階)為思想,是一種收縮估計方法。Lasso方法可以將特征的系數進行壓縮并使某些回歸系數變為0,進而達到特征選擇的目的,可以廣泛地應用于模型改進與選擇。通過選擇懲罰函數,借用Lasso思想和方法實現特征選擇的目的。模型選擇本質上是尋求模型稀疏表達的過程,而這種過程可以通過優化一個“損失”+“懲罰”的函數問題來完成。
Lasso參數估計如下式所示。
β ^ ( lasso ) = arg?min ? β 2 ∥ y ? ∑ j = 1 p x i β i ∥ 2 + λ ∑ j = 1 p ∣ β i ∣ \hat\beta(\text{lasso}) = \argmin_\beta^2 \left\Vert y-\sum_{j=1}^p x_i\beta_i\right\Vert^2 + \lambda\sum_{j=1}^p|\beta_i| β^?(lasso)=βargmin2? ?y?j=1∑p?xi?βi? ?2+λj=1∑p?∣βi?∣
λ \lambda λ為非負正則參數,控制著模型的復雜程度, λ \lambda λ越大對特征較多的線性模型的懲罰力度就越大,從而最終獲得一個特征較少的模型; λ ∑ j = 1 p ∣ β i ∣ \lambda\sum_{j=1}^p|\beta_i| λ∑j=1p?∣βi?∣稱為懲罰項。調整參數 λ \lambda λ可以采用交叉驗證法,選取交叉驗證誤差最小的 λ \lambda λ值。最后,按照得到的 λ \lambda λ值,用全部數據重新擬合模型即可。
值得注意的是,當原始特征中存在共線性時,Lasso回歸不失為一種很好的處理共線性的方法,它可以有效地對存在共線性的特征進行篩選。
(二)特征選擇
根據相關系數表的結果分析可知,原始數據中各特征之間存在嚴重的共線性。
- 特征 x 1 、 x 4 、 x 5 、 x 6 、 x 8 、 x 9 、 x 10 x_1、x_4、x_5、x_6、x_8、x_9、x_{10} x1?、x4?、x5?、x6?、x8?、x9?、x10?與除了 x 11 x_{11} x11?之外的特征均存在嚴重的共線性。
- 特征 x 2 、 x 3 、 x 7 x_2、x_3、x_7 x2?、x3?、x7?與除了 x 11 x_{11} x11?和 x 12 x_{12} x12?外的其他特征存在著嚴重的共線性。
本案例可以利用Lasso回歸方法進行特征篩選。相關代碼如下。
import pandas as pd
import numpy as np
from sklearn.linear_model import Lassodata = pd.read_csv('../data/data.csv') # 讀取數據
# 調用Lasso()函數,設置λ的值為1000
lasso = Lasso(1000)
lasso.fit(data.iloc[:, 0:13], data['y'])
print('相關系數為:', np.round(lasso.coef_, 5)) # 輸出結果,保留五位小數print('相關系數非零個數為:', np.sum(lasso.coef_ != 0)) # 計算相關系數非零的個數# 返回一個相關系數是否為零的布爾數組
mask = lasso.coef_ != 0
print('相關系數是否為零:', mask)data = data.iloc[:, 0:13]
new_reg_data = data.iloc[:, mask] # 返回相關系數非零的數據
new_reg_data.to_csv('../tmp/new_reg_data.csv') # 存儲數據
print('輸出數據的維度為:', new_reg_data.shape) # 查看輸出數據的維度
各特征對應的系數如下表所示。從表的結果可以看出,利用Lasso回歸方法識別影響財政收入的關鍵影響因素是社會從業人數( x 1 x_1 x1?)、社會消費品零售總額( x 3 x_3 x3?)、城鎮居民人均可支配收入( x 4 x_4 x4?)、城鎮居民人均消費性支出( x 5 x_5 x5?)、全社會固定資產投資額( x 7 x_7 x7?)、地區生產總值( x 8 x_8 x8?)、第一產業產值( x 9 x_9 x9?) 、居民消費水平( x 13 x_{13} x13?)。
x 1 x_1 x1? | x 2 x_2 x2? | x 3 x_3 x3? | x 4 x_4 x4? | x 5 x_5 x5? | x 6 x_6 x6? | x 7 x_7 x7? | x 8 x_8 x8? | x 9 x_9 x9? | x 10 x_{10} x10? | x 11 x_{11} x11? | x 12 x_{12} x12? | x 13 x_{13} x13? |
---|---|---|---|---|---|---|---|---|---|---|---|---|
-0.0001 | 0.000 | 0.124 | -0.010 | 0.065 | 0.000 | 0.317 | 0.035 | -0.001 | 0.000 | 0.000 | 0.000 | -0.040 |
四、模型訓練
為實現對2014年和2015年的財政預測,本案例利用SVR(Support Vector Regression,支持向量回歸)建立預測模型。由于原始數據中沒有提供關鍵特征2014年和2015年的數據,所以本案例利用灰色預測模型預測關鍵特征2014年和2015年的值。利用支持向量回歸(Support Vector Regression,SVR)預測模型和灰色模型預測值預測2014年和2015年的財政收入。
(一)灰色預測模型
灰色預測模型是一種對含有不確定因素的系統進行預測的方法。在建立灰色預測模型之前,需先對原始時間序列進行數據處理,經過數據處理后的時間序列即稱為生成列,灰色系統常用的數據處理方式有累加、累減和加權累加3種。灰色預測模型是利用離散隨機數經過生成變為隨機性被顯著削弱而且較有規律的生成數,建立起的微分方程形式的模型。灰色預測是以灰色模型為基礎的,在眾多的灰色模型中,GM(1,1)模型最為常用。
設特征 X ( 0 ) = { X ( 0 ) ( i ) , i = 1 , 2 , ? , n } X^{(0)}=\{X^{(0)}(i), i=1,2,\cdots,n\} X(0)={X(0)(i),i=1,2,?,n} 為一非負單調原始數據序列,建立灰色預測模型如下。
對 X ( 0 ) X^{(0)} X(0) 進行一次累加得到累加序列 X ( 1 ) = { X ( 1 ) ( k ) , k = 0 , 1 , 2 , ? , n } X^{(1)} = \{X^{(1)}(k), k=0,1,2,\cdots,n\} X(1)={X(1)(k),k=0,1,2,?,n}。
對 X ( 1 ) X^{(1)} X(1) 建立一階線性微分方程,如下式所示,即GM(1,1)模型。
d X ( 1 ) d t + a X ( 1 ) = μ \frac{\mathrm{d}X^{(1)}}{\mathrm{d}t} + aX^{(1)} = \mu dtdX(1)?+aX(1)=μ
求解微分方程,得到預測模型如下式所示。
X ^ ( 1 ) ( k + 1 ) = [ X ( 0 ) ( 1 ) ? μ a ] e ? a k + μ a \hat X^{(1)}(k+1) = \left[X^{(0)}(1)-\frac{\mu}{a}\right]\mathrm{e}^{-ak}+\frac{\mu}{a} X^(1)(k+1)=[X(0)(1)?aμ?]e?ak+aμ?
由于GM(1,1)模型得到的是一次累加量,將GM(1,1)模型所得數據 X ^ ( 1 ) ( k + 1 ) \hat X^{(1)}(k+1) X^(1)(k+1) 經過累減還原為 X ^ ( 0 ) ( k + 1 ) \hat X^{(0)}(k+1) X^(0)(k+1) 即 X ( 0 ) X^{(0)} X(0) 的灰色預測模型如下式所示。
X ^ ( 0 ) ( k + 1 ) = ( e ? a ^ ? 1 ) [ X ( 0 ) ( n ) ? μ ^ a ^ ] e ? a ^ k \hat X^{(0)}(k+1) = (\mathrm{e}^{-\hat a}-1)\left[X^{(0)}(n)-\frac{\hat\mu}{\hat a}\right]\mathrm{e}^{-\hat ak} X^(0)(k+1)=(e?a^?1)[X(0)(n)?a^μ^??]e?a^k
灰色預測模型可以利用后驗差檢驗模型精度,使用后驗差檢驗法的判別規則如下表所示。
P | C | 模型精度 |
---|---|---|
>0.95 | <0.35 | 好 |
>0.80 | <0.5 | 合格 |
>0.70 | <0.65 | 勉強合格 |
<0.70 | >0.65 | 不合格 |
在后驗差檢驗判別參照表中,P和C計算公式如下式所示。
C = σ ( delta ) σ ( X ( 0 ) ) C=\frac{\sigma(\text{delta})}{\sigma(X^{(0)})} C=σ(X(0))σ(delta)? P = S L P=\frac{S}{L} P=LS?
在C的計算公式中, delta = ∣ X ( 0 ) ? X ^ ( 0 ) ∣ \text{delta}=|X^{(0)}-\hat X^{(0)}| delta=∣X(0)?X^(0)∣, σ \sigma σ表示標準差, S S S表示的 ∣ delta ? mean ( delta ) ∣ < 0.6745 ? σ ( X ( 0 ) ) |\text{delta} - \text{mean}(\text{delta})|<0.6745\cdot\sigma(X^{(0)}) ∣delta?mean(delta)∣<0.6745?σ(X(0)) 數量,mean(delta)表示delta的平均值, L L L表示 X ( 0 ) X^{(0)} X(0)的長度。
灰色預測法的通用性比較強些,一般的時間序列場合都可以用,尤其適合那些規律性差且不清楚數據產生機理的情況。
相關代碼如下。
# 自定義灰色預測函數
def GM11(x0): # x0為矩陣形式import numpy as npx1 = x0.cumsum() # 1-AGO序列# 緊鄰均值(MEAN)生成序列z1 = (x1[:len(x1) - 1] + x1[1:]) / 2.0z1 = 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)# 返回灰色預測函數、a、b、首項、方差比、小殘差概率return f, a, b, x0[0], C, P
(二)關鍵特征預測
利用灰色預測模型得到以下特征的2014年和2015年的預測值。
- 社會從業人數( x 1 x_1 x1?)
- 社會消費品零售總額( x 3 x_3 x3?)
- 城鎮居民人均可支配收入( x 4 x_4 x4?)
- 城鎮居民人均消費性支出( x 5 x_5 x5?)
- 年末總人口( x 6 x_6 x6?)
- 全社會固定資產投資額( x 7 x_7 x7?)
- 地區生產總值( x 8 x_8 x8?)
- 居民消費水平( x 13 x_{13} x13?)
相關代碼如下。
import pandas as pd
import numpy as npnew_reg_data = pd.read_csv('../tmp/new_reg_data.csv') # 讀取經過特征選擇后的數據
data = pd.read_csv('../data/data.csv') # 讀取總的數據
new_reg_data.index = range(1994, 2014)
new_reg_data.loc[2014] = None
new_reg_data.loc[2015] = None
Accuracy = [] # 存放灰色預測模型精度
l = ['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13']
for i in l:f = GM11(new_reg_data.loc[range(1994, 2014), i].as_matrix())[0]new_reg_data.loc[2014, i] = f(len(new_reg_data) - 1) # 2014年預測結果new_reg_data.loc[2015, i] = f(len(new_reg_data)) # 2015年預測結果new_reg_data[i] = new_reg_data[i].round(2) # 保留兩位小數C = GM11(new_reg_data.loc[range(1994, 2014), 'x1'].as_matrix())[4]P = GM11(new_reg_data.loc[range(1994, 2014), 'x1'].as_matrix())[5]if P>0.95 and C<0.35:Accuracy.append('好')elif 0.8<P<=0.95 and 0.35<=C<0.5:Accuracy.append('合格')elif 0.7<P<=0.8 and 0.5<=C<0.65:Accuracy.append('勉強合格')else :Accuracy.append('不合格')new_reg_data = new_reg_data.iloc[:, 1:]
new_reg_data.loc['模型精度', :] = Accuracy
outputfile = '../tmp/new_reg_data_GM11.xls' # 灰色預測后保存的路徑
# 提取財政收入列,合并至新數據框中
y = list(data['y'].values)
y.extend([np.nan, np.nan])
new_reg_data.loc[range(1994, 2016),'y'] = y
new_reg_data.to_excel(outputfile) # 結果輸出
# 預測結果展示
print('預測結果為:\n', new_reg_data.loc[[2014, 2015, '模型精度'], :])
(三)SVR模型預測
構建支持向量回歸預測模型,并將關鍵特征灰色預測代碼中的預測結果代入建立的地方財政收入支持向量回歸預測模型,預測2014年和2015年的財政收入。地方財政收入真實值與預測值的對比圖如下圖所示。
相關代碼如下。
from sklearn.svm import LinearSVR
import matplotlib.pyplot as pltdata = pd.read_excel('../tmp/new_reg_data_GM11.xls') # 讀取數據
data = data.drop('Unnamed: 0', axis=1, errors='ignore') # 如果該列存在則刪除,不存在則跳過
data = data.drop(labels='模型精度', axis=0, errors='ignore') # 刪除行
feature = ['x1', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x13'] # 特征所在列
data_train = data.loc[range(1994, 2014)].copy() # 取2014年前的數據建模
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() # 標簽數據
linearsvr = LinearSVR(random_state=123) # 調用LinearSVR()函數
linearsvr.fit(x_train, y_train)# 預測2014年和2015年財政收入,并還原結果。
x = ((data[feature] - data_mean[feature]) / data_std[feature]).as_matrix()
data[u'y_pred'] = linearsvr.predict(x) * data_std['y'] + data_mean['y']
outputfile = '../tmp/new_reg_data_GM11_revenue.xls'
data.to_excel(outputfile)
print('真實值與預測值分別為:\n', data[['y', 'y_pred']])print('預測圖為:', data[['y', 'y_pred']].plot(style = ['b-o', 'r-*'])) # 畫出預測結果圖
plt.xlabel('年份')
plt.xticks(range(1994,2015,2))
plt.show()
五、性能度量
整理關鍵特征灰色預測的結果,如下表所示。從表中可以看出,2014年和2015年關鍵特征的灰色模型預測值精度均較高,可以用于預測2014年和2015年財政收入的關鍵特征數據。
2014預測值 | 2015預測值 | 預測精度等級 | |
---|---|---|---|
x 1 x_1 x1? | 8142148.24 | 8460489.28 | 好 |
x 3 x_3 x3? | 7042.31 | 8166.92 | 好 |
x 4 x_4 x4? | 43611.84 | 47792.22 | 好 |
x 5 x_5 x5? | 35046.63 | 38384.22 | 好 |
x 6 x_6 x6? | 8505522.58 | 8627139.31 | 好 |
x 7 x_7 x7? | 4600.4 | 5214.78 | 好 |
x 8 x_8 x8? | 18686.28 | 21474.47 | 好 |
x 13 x_{13} x13? | 44506.47 | 49945.88 | 好 |
利用關鍵特征灰色預測的結果中的預測值和SVR模型預測2014年和2015年財政收入。整理后如下表所示,y_pred表示預測值。
年份 | y | y_pred | 年份 | y | y_pred | 年份 | y | y_pred |
---|---|---|---|---|---|---|---|---|
1994 | 64.87 | 37.825855 | 2002 | 269.1 | 220.02944 | 2010 | 1399.16 | 1378.7089 |
1995 | 99.75 | 84.460566 | 2003 | 300.55 | 300.82194 | 2011 | 1535.14 | 1536.3989 |
1996 | 88.11 | 95.400722 | 2004 | 338.45 | 383.72498 | 2012 | 1579.68 | 1739.0082 |
1997 | 106.07 | 107.01212 | 2005 | 408.86 | 463.34936 | 2013 | 2088.14 | 2085.4473 |
1998 | 137.32 | 151.49711 | 2006 | 476.72 | 554.94385 | 2014 | 2187.1799 | |
1999 | 188.14 | 188.54074 | 2007 | 838.99 | 691.35772 | 2015 | 2538.0938 | |
2000 | 219.91 | 219.91 | 2008 | 843.14 | 843.01617 | |||
2001 | 271.91 | 230.76462 | 2009 | 1107.67 | 1087.4603 |
支持向量回歸預測模型的代碼結果中已給出地方財政收入真實值與預測值的對比圖。利用回歸模型性能度量指標對地方財政收入預測模型進行性能度量。如下表所示,平均絕對誤差與中值絕對誤差較小,可解釋方差值與R方值十分接近1,從真實值與預測值的對比圖可以看出,預測值和真實值曲線基本重合,表明建立的支持向量回歸模型擬合效果優良,可以用于預測財政收入。
相關代碼如下。
from sklearn.metrics import mean_absolute_error # 平均絕對誤差
from sklearn.metrics import median_absolute_error # 中值絕對誤差
from sklearn.metrics import explained_variance_score # 可解釋方差
from sklearn.metrics import r2_score # R方值
import pandas as pddata = pd.read_excel('../tmp/new_reg_data_GM11_revenue.xls') # 讀取數據
data = data.drop('Unnamed: 0', axis=1, errors='ignore') # 如果該列存在則刪除,不存在則跳過
mean_ab_error = mean_absolute_error(data.loc[range(1994, 2014), 'y'], data.loc[range(1994,2014), 'y_pred'], multioutput = 'raw_values')
median_ab_error = median_absolute_error(data.loc[range(1994, 2014), 'y'], data.loc[range(1994, 2014), 'y_pred'])
explain_var_score = explained_variance_score(data.loc[range(1994, 2014), 'y'], data.loc[range(1994, 2014), 'y_pred'], multioutput = 'raw_values')
r2 = r2_score(data.loc[range(1994, 2014), 'y'], data.loc[range(1994, 2014), 'y_pred'], multioutput = 'raw_values')print('平均絕對誤差:', mean_ab_error, '\n', '中值絕對誤差:', median_ab_error, '\n', '可解釋方差:', explain_var_score, '\n', 'R方值:', r2)
指標 | 指標值 |
---|---|
平均絕對誤差 | 34.26585201 |
中值絕對誤差 | 17.749581395641485 |
可解釋方差 | 0.99086819 |
R方值 | 0.99085796 |
小結
本案例結合某市財政收入原始數據,重點介紹了SVR模型在財政預測方面的應用,主要內容包含數據探索、特征選取、模型構建和性能度量。其中利用Pearson相關系數探對原始數據進行相關性分析,得到與財政收入相關性較高的特征,并且了解到各特征之間存在嚴重的共線性。利用Lasso回歸模型對原始特征進行篩選,得到用于建模的關鍵特征。
針對歷史數據,構建灰色預測模型,對所選關鍵特征2014年和2015年的值進行預測。最后根據所選特征原始數據建立SVR模型,然后利用灰色預測模型對所選特征的預測值進行預測,最終得到2014年和2015年的財政收入預測值。利用回歸模型性能度量指標對SVR模型進行評價,模型精度較高,可以用于指導實際工作。
附:以上文中的數據集及相關資源下載地址:
鏈接:https://pan.quark.cn/s/bc0a61378df2
提取碼:n2Kw