PyTorch 处理二分类问题¶
在量化研究中,将预测收益率数值的回归问题转换为预测涨跌、预测超额收益的正负等二分类问题是十分常见的。在 PyTorch 中可以修改部分代码,让回归问题的网络结构在二分类问题中也同样适用。
将收益率标签转换为 0 和 1¶
Python
# 由于是分类问题,因此将 y 大于 0 的标签设置为 1,小于 0 的标签设置为 0
trainy[trainy > 0] = 1
trainy[trainy < 0] = 0
testy[testy > 0] = 1
testy[testy < 0] = 0
注意,这里不要转换为1.0
和0.0
,否则可能会报错:
将收益率转换为超额收益率的正负¶
Python
# 由于是超额收益的分类问题,因此将 y 大于 trainy.mean() 的标签设置为 1,小于 trainy.mean() 的标签设置为 0
train_mean_y = trainy.mean().item()
trainy[trainy > train_mean_y] = 1
trainy[trainy < train_mean_y] = 0
test_mean_y = testy.mean().item()
testy[testy > test_mean_y] = 1
testy[testy < test_mean_y] = 0
全连接层最后的激活函数设为sigmoid
,使得最终输出在 0 到 1 之间¶
Python
def forward(self, data):
data_1 = self.Inception_1(data) # N*30
data_2 = self.Inception_2(data) # N*30
pool_cat = torch.cat([data_1, data_2], axis=1) # N*60
# 输出层
data = self.fc(pool_cat)
# 激活函数,使输出值在 0 到 1 之间
data = torch.sigmoid(data)
data = data.to(torch.float)
return data
损失函数设为Binary Cross Entropy
¶
注意,不要设为nn.CrossEntropyLoss()
,否则可能会报错:
这是因为nn.CrossEntropyLoss()
适用于多分类(类别数大于 2)的问题。对于二分类问题,有专门的nn.BCELoss()
作为二元交叉熵损失函数。
BCELOSS: Binary Cross Entropy Loss