灰度预测+LinearSVR和AERIMA预测财政收入
一、灰度预测+LinearSVR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd import numpy as np from sklearn.linear_model import Lasso inputfile = './data/data.csv' # 输入的数据文件 data = pd.read_csv(inputfile) # 读取数据 lasso = Lasso( 1000 ) # 调用Lasso()函数,设置λ的值为1000 lasso.fit(data.iloc[:, 0 : 13 ],data[ 'y' ]) data = data.iloc[:, 0 : 13 ] mask = lasso.coef_ ! = 0 # 返回一个相关系数是否为零的布尔数组 outputfile = './tmp/new_reg_data.csv' # 输出的数据文件 new_reg_data = data.iloc[:, mask] # 返回相关系数非零的数据 new_reg_data.to_csv(outputfile) # 存储数据 print ( '输出数据的维度为:' ,new_reg_data.shape) # 查看输出数据的维度 |
- LinearSVR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import matplotlib.pyplot as plt from sklearn.svm import LinearSVR inputfile = './tmp/new_reg_data_GM11.xls' # 灰色预测后保存的路径 data = pd.read_excel(inputfile) # 读取数据 feature = [ 'x1' , 'x3' , 'x4' , 'x5' , 'x6' , 'x7' , 'x8' , 'x13' ] # 属性所在列 data_train = data.iloc[ 0 : 20 ].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].values # 属性数据 y_train = data_train[ 'y' ].values # 标签数据 linearsvr = LinearSVR() # 调用LinearSVR()函数 linearsvr.fit(x_train,y_train) x = ((data[feature] - data_mean[feature]) / data_std[feature]).values # 预测,并还原结果。 data[ 'y_pred' ] = linearsvr.predict(x) * data_std[ 'y' ] + data_mean[ 'y' ] outputfile = './tmp/new_reg_data_GM11_revenue.xls' # SVR预测后保存的结果 data.to_excel(outputfile) print ( '真实值与预测值分别为:\n' ,data[[ 'y' , 'y_pred' ]]) fig = data[[ 'y' , 'y_pred' ]].plot(subplots = True , style = [ 'b-o' , 'r-*' ]) # 画出预测结果图 plt.show() |
二、AERIMA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import pandas as pd # 参数初始化 discfile = 'C:/Users/86136/Documents/python大数据分析/课本源代码以及数据/chapter6/demo/data/data.csv' # 读取数据 data = pd.read_csv(discfile) # 时序图 import matplotlib.pyplot as plt plt.rcParams[ 'font.sans-serif' ] = [ 'SimHei' ] # 用来正常显示中文标签 plt.rcParams[ 'axes.unicode_minus' ] = False # 用来正常显示负号 data.plot() plt.show() # 自相关图 from statsmodels.graphics.tsaplots import plot_acf plot_acf(data[ 'y' ]).show() 对y(财政收入)进行平稳性检验 # 平稳性检测 from statsmodels.tsa.stattools import adfuller as ADF print ( '原始序列的ADF检验结果为:' , ADF(data[ 'y' ])) # 返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore # 差分后的结果 D_data = data.diff().dropna() feature = [ 'x1' , 'x2' , 'x3' , 'x4' , 'x5' , 'x6' , 'x7' , 'x8' , 'x9' , 'x10' , 'x11' , 'x12' , 'x13' , 'y' ] # 属性所在列 D_data.columns = feature D_data.plot() # 时序图 plt.show() plot_acf(D_data[ 'y' ]).show() # 自相关图 from statsmodels.graphics.tsaplots import plot_pacf plot_pacf(D_data[ 'y' ]).show() # 偏自相关图 print ( '差分序列的ADF检验结果为:' , ADF(D_data[ 'y' ])) # 平稳性检测 # 白噪声检验 from statsmodels.stats.diagnostic import acorr_ljungbox print ( '差分序列的白噪声检验结果为:' , acorr_ljungbox(D_data[ 'y' ], lags = 1 )) # 返回统计量和p值 from statsmodels.tsa.arima_model import ARIMA # 定阶 data[ 'y' ] = data[ 'y' ].astype( float ) pmax = int ( len (D_data) / 10 ) # 一般阶数不超过length/10 qmax = int ( len (D_data) / 10 ) # 一般阶数不超过length/10 bic_matrix = [] # BIC矩阵 for p in range (pmax + 1 ): tmp = [] for q in range (qmax + 1 ): try : # 存在部分报错,所以用try来跳过报错。 tmp.append(ARIMA(data[ 'y' ], (p, 1 ,q)).fit().bic) except : tmp.append( None ) bic_matrix.append(tmp) bic_matrix = pd.DataFrame(bic_matrix) # 从中可以找出最小值 p,q = bic_matrix.stack().idxmin() # 先用stack展平,然后用idxmin找出最小值位置。 print ( 'BIC最小的p值和q值为:%s、%s' % (p,q)) model = ARIMA(data[ 'y' ], (p, 1 ,q)).fit() # 建立ARIMA(0, 1, 1)模型 print ( '模型报告为:\n' , model.summary2()) print ( '预测未来2年,其预测结果、标准误差、置信区间如下:\n' , model.forecast( 2 )) |
三、结论
灰色预测算法+SVR算法预测的模型效果更好
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?