贵州省建设厅造价通官方网站,老师做家教的网站,做网站ps的素材,重庆建设工程交易网周末的时候有时间鼓捣的一个小实践#xff0c;主要就是做的多因子回归预测的任务#xff0c;关于时序数据建模和回归预测建模我的专栏和系列博文里面已经有了非常详细的介绍了#xff0c;这里就不再多加赘述了#xff0c;这里主要是一个模型融合的实践#xff0c;这里的数…周末的时候有时间鼓捣的一个小实践主要就是做的多因子回归预测的任务关于时序数据建模和回归预测建模我的专栏和系列博文里面已经有了非常详细的介绍了这里就不再多加赘述了这里主要是一个模型融合的实践这里的数据是仿真生成的领域数据集典型的表格型数据集首先看下数据样例 基础的数据处理实现如所示
import pandas as pd# 读取 data 工作表的内容
sheet_name data
data pd.read_excel(dataset.xlsx, sheet_namesheet_name)# 删除第一列日期列
data1 data.iloc[:, 1:]print(data1.head(20))
接下来随机划分数据集实现如下所示
from sklearn.model_selection import train_test_split
X data.drop(columns[Y]) # 这将删除名为label的列并返回其余部分
y data[Y]
x_train, x_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)
接下来对数据进行归一化处理计算如下所示
# 创建特征标准化的对象
scaler StandardScaler() # 或者使用 MinMaxScaler() 来进行 Min-Max 缩放# 训练标准化对象并转换训练特征
x_train_scaled scaler.fit_transform(x_train)# 假设你有测试数据 x_test 和 y_test对测试特征进行相同的变换
x_test_scaled scaler.transform(x_test)# 输出尺寸
print(训练特征标准化后的尺寸:, x_train_scaled.shape)
print(测试特征标准化后的尺寸:, x_test_scaled.shape)
print(特征列x_train的尺寸:, x_train.shape)
print(标签列y_train的尺寸:, y_train.shape)
print(特征列x_test的尺寸:, x_test.shape)
print(标签列y_test的尺寸:, y_test.shape)
接下来是数据转化处理
def reshape_to_window(data, windowwindow):数据转化n data.shape[0]m data.shape[1]result np.zeros((n - window 1, window, m))for i in range(n - window 1):result[i] data[i:iwindow]return resultx_train reshape_to_window(x_train, window)
y_train y_train.iloc[window-1:]x_test reshape_to_window(x_test, window)
y_test y_test.iloc[window-1:]print(新的x_train形状:, x_train .shape )
print(新的y_train形状:, y_train .shape)
print(新的x_test形状:, x_test.shape)
print(新的y_test形状:, y_test.shape)
接下来基于keras框架初始化搭建模型这里模型部分主要是运用了DCNN和LSTM对其进行融合。首先来整体回归下DCNN和LSTM
DCNN
空洞卷积dilated convolution是一种卷积神经网络Convolutional Neural Network, CNN中的卷积操作它通过在卷积核上添加空洞dilation来扩展感受野receptive field从而提高模型的鲁棒性和泛化能力。
在传统的卷积操作中卷积核只能覆盖一小部分特征图但是通过在卷积核上添加空洞可以让卷积核在相邻的特征图之间滑动从而扩展了卷积核的感受野增强了模型的表达能力。空洞卷积的基本原理是将传统卷积操作的滑动步长stride设置为1然后将卷积核的大小kernel size除以2使得卷积核中心点能够与特征图上任意位置的像素进行卷积运算。
在空洞卷积中每个卷积层都具有不同数量的空洞率dilation rate表示在每个卷积层中添加的空洞数量。空洞率越高则卷积核的感受野越大能够提取更多的特征信息。但是空洞率过高会导致特征图变得稀疏难以捕捉到细节信息。因此在空洞卷积中需要权衡空洞率和特征图的稀疏性。
空洞卷积在深度卷积神经网络中可以应用于多个任务例如图像分类、目标检测、语义分割等。相比于传统的卷积操作空洞卷积能够提高模型的鲁棒性和泛化能力同时减少计算量和参数数量使得模型更加轻量级和高效。
LSTM
LSTMLong Short-Term Memory是一种循环神经网络RNN的变体特别适用于处理序列数据。相较于传统的RNNLSTM在处理时间序列数据时具有更好的性能和稳定性。
LSTM由遗忘门forget gate、输入门input gate、输出门output gate和存储单元cell state组成。遗忘门决定了前一时刻的记忆状态中哪些信息应该被遗忘输入门决定了当前输入的信息中哪些应该被用于计算输出输出门决定了当前时刻的输出而存储单元则用于存储和输出当前时刻的记忆状态。
LSTM的核心思想是通过遗忘门和输入门来控制信息的流动从而在长期依赖和短期依赖之间取得平衡。遗忘门和输入门都是由sigmoid函数和线性层组成的而输出门则是由sigmoid函数、线性层和ReLU函数组成的。这些门控制了信息的流动方向和强度使得LSTM能够处理长期依赖关系。
除了LSTM之外还有GRUGated Recurrent Unit和SRUSimple Recurrent Unit等循环神经网络变体它们在结构和性能上与LSTM类似。LSTM在自然语言处理、语音识别、图像处理等领域都有广泛的应用。
模型部分代码实现如下所示
from tensorflow.keras import backend as K# # 输入参数input_size 176 # 你的输入尺寸
lstm_units 16# 你的LSTM单元数
dropout 0.01 # 你的dropout率# 定义模型结构
inputs Input(shape(window, input_size))# 第一层空洞卷积
model Conv1D(filterslstm_units, kernel_size1, dilation_rate1, activationrelu)(inputs)
# model MaxPooling1D(pool_size1)(model)
# model Dropout(dropout)(model)# 第二层空洞卷积
model Conv1D(filterslstm_units, kernel_size1, dilation_rate2, activationrelu)(model)
# model MaxPooling1D(pool_size1)(model)# 第三层空洞卷积
model Conv1D(filterslstm_units, kernel_size1, dilation_rate4, activationrelu)(model)
# model MaxPooling1D(pool_size1)(model)
# model BatchNormalization()(model)# LSTM层
model LSTM(lstm_units, return_sequencesFalse)(model)# 输出层
outputs Dense(1)(model)# 创建和编译模型
model Model(inputsinputs, outputsoutputs)model.compile(lossmse, optimizeradam, metrics[mse])
model.summary()
摘要输出如下所示 接下来就可以启动模型训练日志输出如下所示 接下来对模型整体训练过程中的loss进行可视化如下所示
plt.figure(figsize(12, 6))
plt.plot(history.history[loss], labelTraining Loss)
plt.title(Model loss)
plt.ylabel(Loss)
plt.xlabel(Epoch)
plt.legend(locupper right)
plt.show()
结果如下所示 接下来对测试集进行预测对比分析如下所示 explained_variance_score解释回归模型的方差得分其值取值范围是[0,1]越接近于1说明自变量越能解释因变量 的方差变化值越小则说明效果越差。 mean_absolute_error平均绝对误差Mean Absolute ErrorMAE用于评估预测结果和真实数据集的接近程度的程度 其其值越小说明拟合效果越好。 mean_squared_error均方差Mean squared errorMSE该指标计算的是拟合数据和原始数据对应样本点的误差的 平方和的均值其值越小说明拟合效果越好。 r2_score判定系数其含义是也是解释回归模型的方差得分其值取值范围是[0,1]越接近于1说明自变量越能解释因 变量的方差变化值越小则说明效果越差。
基于回归模型评测指标对模型进行评估计算核心代码实现如下所示
#!usr/bin/env python
#encoding:utf-8
from __future__ import division
__Author__:沂水寒城
功能计算回归分析模型中常用的四大评价指标
from sklearn.metrics import explained_variance_score, mean_absolute_error, mean_squared_error, r2_scoredef calPerformance(y_true,y_pred):模型效果指标评估y_true真实的数据值y_pred回归模型预测的数据值model_metrics_name[explained_variance_score, mean_absolute_error, mean_squared_error, r2_score] tmp_list[] for one in model_metrics_name: tmp_scoreone(y_true,y_pred) tmp_list.append(tmp_score) print [explained_variance_score,mean_absolute_error,mean_squared_error,r2_score]print tmp_listreturn tmp_listdef mape(y_true, y_pred):return np.mean(np.abs((y_pred - y_true) / y_true)) * 100
from sklearn.metrics import r2_score
RMSE mean_squared_error(y_train_predict, y_train)**0.5
print(训练集上的/RMSE/MAE/MSE/MAPE/R^2)
print(RMSE)
print(mean_absolute_error(y_train_predict, y_train))
print(mean_squared_error(y_train_predict, y_train) )
print(mape(y_train_predict, y_train) )
print(r2_score(y_train_predict, y_train) )RMSE2 mean_squared_error(y_test_predict, y_test)**0.5
print(测试集上的/RMSE/MAE/MSE/MAPE/R^2)
print(RMSE2)
print(mean_absolute_error(y_test_predict, y_test))
print(mean_squared_error(y_test_predict, y_test))
print(mape(y_test_predict, y_test))
print(r2_score(y_test_predict, y_test))结果输出如下所示
训练集上的/RMSE/MAE/MSE/MAPE/R^2
0.011460134959888058
0.00918032687965506
0.00013133469329884847
4.304916429848429
0.9907179432442654
测试集上的/RMSE/MAE/MSE/MAPE/R^2
0.08477191056357428
0.06885029105374023
0.007186276820598636
24.05688263657184
0.4264760739398442
关于回归建模相关的内容感兴趣的话可以参考我前面的文章
《常用数据回归建模算法总结记录》
《sklearn实践之——计算回归模型的四大评价指标explained_variance_score、mean_absolute_error、mean_squared_error、r2_score》