更新参数(在多轮训练中会不断更新参数)
前向传播:计算输入数据的预测输出。使用当前的模型参数,将输入数据通过模型进行推理,得到预测值。
计算损失:使用损失函数(如均方误差 MSE、交叉熵损失等)计算预测值与实际目标值之间的误差。损失函数用于评估模型预测的准确性。
反向传播:通过反向传播算法(Backpropagation)计算损失函数相对于模型参数的梯度。反向传播使用链式法则来计算每个参数的梯度,这些梯度表示了损失函数如何随着每个参数的变化而变化。
更新参数:使用优化算法(如梯度下降、Adam、RMSprop等)根据计算出的梯度更新模型参数。优化算法会根据梯度和学习率(learning rate)来调整参数,使得损失函数的值逐步减少。
前向传播:
outputs = model(inputs)
loss = criterion(outputs, targets)
在这一步中,输入数据 inputs 被传入模型 model,得到预测结果 outputs,然后计算预测结果与实际目标 targets 之间的损失。
反向传播:
optimizer.zero_grad()
loss.backward()
optimizer.zero_grad()
用于清除之前计算的梯度,因为 PyTorch 默认会将梯度累加。loss.backward() 计算当前损失函数相对于模型参数的梯度。
更新参数:
optimizer.step()
optimizer.step()
使用计算出的梯度来更新模型参数。
优化器的作用
优化器是用于更新和调整神经网络模型参数的算法。优化器通过计算损失函数的梯度,指导模型参数朝着最小化损失函数的方向调整。优化器在训练过程中不断调整参数,使模型能够更好地拟合数据。
Adam(Adaptive Moment Estimation)
Adam 结合了动量优化和 RMSProp 的优点,自适应地调整每个参数的学习率。
适用于大多数深度学习任务,尤其是处理稀疏数据和非平稳目标。
选择优化器的建议
- SGD with Momentum:对于大多数传统任务,SGD 加动量是一个强大的基线选择。
- Adam:如果你刚开始尝试一个新任务,Adam 是一个很好的默认选择,因为它适用于各种任务并且往往表现良好。
- RMSProp:如果你的数据具有非平稳性,例如在强化学习或时间序列任务中,RMSProp 是一个不错的选择。
- AdaGrad:适用于稀疏数据或特征的任务,如自然语言处理。
- AdamW:如果你需要强正则化效果以防止过拟合,AdamW 是一个值得考虑的选择。
特征工程
包括特征选择、特征创建和特征处理等方面
特征选择
去除低方差特征
递归特征消除(RFE)
嵌入式方法:使用带有特征选择功能的算法(如Lasso、Ridge、决策树)进行特征 选择。
特征创建
特征处理
缺失值处理:
删除包含缺失值的样本或特征。
使用均值、中位数、众数等方法填补缺失值。
数值特征标准化和归一化:
标准化(Standardization):将特征缩放到均值为0,标准差为1的分布。
归一化(Normalization):将特征缩放到[0,1]或[-1,1]区间。
标签编码(Label Encoding):将类别特征转换为整数。
独热编码(One-Hot Encoding):将类别特征转换为稀疏矩阵,每个类别一个独立的二进制特征。
目标编码(Target Encoding):用目标变量的统计量(如均值)来编码类别特征。
特征降维
热编码(ONE_HOT)
one-hot 编码是一种将类别标签转换为二进制向量的过程,每个类别由一个独特的二进制向量表示。在这个向量中,只有一个位置为1,其他位置为0。
Y_train = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
使用 to_categorical 函数进行 one-hot 编码后,结果如下
Y_train_one_hot = to_categorical(Y_train, num_classes=10)
[
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], # 类别 0
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0], # 类别 1
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0], # 类别 2
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0], # 类别 3
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0], # 类别 4
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0], # 类别 5
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0], # 类别 6
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 类别 7
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0], # 类别 8
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1] # 类别 9
]
num_classes 参数指定了总的类别数,即标签的类别数。这个参数确保生成的 one-hot 编码矩阵的列数与类别数一致