DL所提方法验证步骤
一个成熟的,可以解决问题的模型应该分为两步:
- 模型搭建:按照想法将模型搭建起来,使得模型可以正常运行。
- 模型优化:初生的模型效果往往很差,现在需要模型优化。
- 对比试验:针对性的设置对比试验,与经典方法比较。
1. 模型搭建
模型搭建可以很简陋,只求能基本实现想法,不要求精度问题。
模型搭建大致分为如下步骤:
0. 数据集准备。
- 模型环境装配。(tensorflow,pytorch)
- 数据提取与准备
- 各功能模块搭建
- 评价指标的选取:
- 结果可视化
1.1 环境配置
pytorch/cuda/tensorflow
1.2 数据提取与准备
原始数据提取:提取原始数据的某些,行/列/信息。
pd.read_csv('path')
1.2.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. 模型优化
在已有模型的骨架上,进行超参数调整/增加一些部件(方法)。总而言之,是小修小补。
模型优化的手段:
- 特征提取(特征降维)
- 超参数调整(神经网络的层数,每层神经元的大小)
- 增加神经网络的步骤:卷积/池化
- 增加神经网络的种类(CNN/RNN/LSTM)
- 添加时髦的方法: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。