DL所提方法验证步骤


一个成熟的,可以解决问题的模型应该分为两步:

  1. 模型搭建:按照想法将模型搭建起来,使得模型可以正常运行。
  2. 模型优化:初生的模型效果往往很差,现在需要模型优化。
  3. 对比试验:针对性的设置对比试验,与经典方法比较。

1. 模型搭建

模型搭建可以很简陋,只求能基本实现想法,不要求精度问题。
模型搭建大致分为如下步骤:
0. 数据集准备。

  1. 模型环境装配。(tensorflow,pytorch)
  2. 数据提取与准备
  3. 各功能模块搭建
  4. 评价指标的选取:
  5. 结果可视化

1.1 环境配置

pytorch/cuda/tensorflow

1.2 数据提取与准备

原始数据提取:提取原始数据的某些,行/列/信息。
pd.read_csv('path')

1.2.1 数据格式转换

  1. 数据格式转换,方便后续的数据处理。在现有数据类型难以处理时,优先想到转换类型。
    如,将 难以处理的 DF数据 转为array数组。
  • 转为数组:np.array(X)数组数据方便索引。
  • 转为list:.tolist(X)list是一维量。
  • 转为张量:torch.tensor(y)
  • 将多维数组展开为一维数据:X.flatten() X.shape()=(2,3) ---> X.shape()=(6,)
  • 改变数组形状:np.reshape(m,n)将数组形状转为 M*n。

1.2.2 数据归一化处理

数据归一化处理以消除量纲的影响
常见的有:① Max-Min 归一化 ② 均值归一化

(一)Max-Min 归一化
使用封装好的Sklearn模块进行:

from sklearn import preprocessing

min_max_scaler = preprocessing.MinMaxScaler()
data_nomal = min_max_scaler.fit_transform(data)

1.2.3 数据分割

将数据分组,方便后续训练速度的提高。
定义分组函数1(此分组元素以数组形式存在):

def array_tolist(arr):  # 将数组分割为指定大小数组块
    n = len(arr)
    s=[]
    for i in n:
        c=arr[i: i+size]
        s.append(c)
    return s

定义分组函数2(此分组元素是展开的 即1维 形式存在):

def arr_size(arr, size):  # 将数组分割为指定大小数组块
    s=[]
    for i in range(0, int(len(arr))+1, size):
        c = arr[i: i+size]
        c = c.flatten()
        s.append(c)
    return s

1.2.4 给数据赋予标签(分类问题)

建立0填充数组(矩阵),并依次赋值:

# 添加标签 y ,即 0-5 共6种标签,每种标签的数量为 对应状态节点 的数量,即共有250个标签
y = []
for i in range(len(data_nomal)):    # 健康批次 有节点 1150 个
    y.append(0)
for i in range(len(data_Fault01)):  # 1号故障 有节点 1000 个
    y.append(1)
for i in range(len(data_Fault02)):  # 2号故障 有节点 1000 个
    y.append(2)
for i in range(len(data_Fault03)):  # 3号故障 有节点 1000 个
    y.append(3)    
for i in range(len(data_Fault04)):  # 4号故障 有节点 1000 个
    y.append(4)
for i in range(len(data_Fault05)):  # 5号故障 有节点 1000 个
    y.append(5)  

# 将y转换为tensor张量,数据类型为long
y = torch.tensor(y)
y = y.long()
y.shape

1.2.5 数据降噪

1.2.6 热独码与掩码处理

1.3 各功能模块的搭建

1.4 评价指标的选取

根据任务类型与特点选取模型评价指标:
(一)(多)分类问题:
经典的模型评估指标如:confusion matrix混淆矩阵;AUROC以及f1-score等
参考链接:https://zhuanlan.zhihu.com/p/448692454

1.5 结果可视化

绘制混淆矩阵
绘制loss图
绘制acc图

2. 模型优化

在已有模型的骨架上,进行超参数调整/增加一些部件(方法)。总而言之,是小修小补。

模型优化的手段:

  1. 特征提取(特征降维)
  2. 超参数调整(神经网络的层数,每层神经元的大小)
  3. 增加神经网络的步骤:卷积/池化
  4. 增加神经网络的种类(CNN/RNN/LSTM)
  5. 添加时髦的方法:transformer/注意力机制

2.1 特征工程

初级的模型中,往往是将原始数据(或仅仅经过简单处理如降噪)直接送入模型,其效果未知。
模型优化是高度依赖经验的。参考链接:https://www.zhihu.com/question/41631631/answer/1129785528
有如下几种特征工程:
(一)将原始数据进行数据降维:
输入的数据,单个节点有 7个 测量值 即7维特征,那么降至5维,可以显著提升模型效果。
保留维数的主旨是,最大程度的保留原始特征
数据降维的方法:
① PCA降维 ② 自编码器降维

2.1.1 PCA降维

使用封装的sklearn模块:

# 使用 PCA 特征提取降维
X = X  # X.shape[1] = 7
pca = PCA(n_components=5)  # PCA接受的参数为降至 n 维,这里是 7维 降至 5维
X = pca.fit_transform(X)   # 调用 PCA
pca_vct = pca.explained_variance_ratio_  # 给出各分量特征占比的多少,据此决定保留多少分量。选取档次有 90%,96%,99%(前n项分量占比和)
X.shape

2.1.2 自编码器降维

(二)节点特征代替节点原始信息输入模型
比如在寿命预测的任务中,计算节点的峰度/偏度/均方根等11个信息,以此作为11维特征输入。

2.2 超参数的调整

经典的超参数包括:神经网络的层数,单层神经元数量,激活函数,学习率。
也包括一些技巧:dropout

2.2.1 神经网络的层数

层数越多,学习到的信息越多,但计算量相应增大,且对反向传播很不利。
研究表明,单个神经网络的最优层数一般为 3层,建议取值 2-4 层

2.2.2 单层神经元个数

这个是关键信息!!!
当输入数据量大时,较少的神经元难以学到有效信息。同理,输入数据少时,过多的神经元也难以学习。
神经元数量的选择与输入数据的多少有关,成正相关。
神经元数量取值一般为:4,16,32,64,128,256,512,1024
神经元数量的增加,同样会显著提升计算量。

2.2.3 激活函数

根据不同的任务类型,选择不同的激活函数。
为每一层网络设置独特的激活函数。

2.2.4 学习率

设置学习率自适应函数,以此自动调节学习率。

2.2.5 dropout

dropout 可以显著的抑制过拟合,提升模型效果。
可以在每一层设置dropout。

相关