• 【深度学习】分类问题探究(多标签分类转为多个二分类,等)


    深度学习】分类问题探究(多标签分类转为多个二分类,等)

    1. 介绍

    机器学习和深度学习中,分类问题有多种类型。以下列举了一些常见的分类类型,并提供了相应的例子:

    • 二分类(Binary classification):将样本分为两个互斥的类别。例如,垃圾邮件分类器可以将电子邮件分为垃圾邮件和非垃圾邮件两类。
    • 多分类(Multiclass classification):将样本分为多个互斥的类别。例如,手写数字识别可以将手写数字图像分为0到9的十个类别。
    • 多标签分类(Multilabel classification):针对每个样本,可以同时分配多个标签。例如,图像标签分类可以将一张图像分为多个标签,如“汽车”、“树木”和“天空”。
    • 层次分类(Hierarchical classification):将样本根据层次结构分为多个类别。这些类别之间存在嵌套关系,形成树状结构。例如,生物学中的分类系统就是一个层次分类的例子,从一级分类到更具体的分类。
    • 基于规则的分类(Rule-based classification):使用一组规则来进行分类。规则可以基于特征值的阈值、逻辑判断等条件。例如,根据天气条件和交通状况,制定交通工具选择的规则。
    • 序列分类(Sequence classification):对序列数据进行分类,根据输入序列的特征将其分为不同的类别。例如,语音识别中的说话人识别可以将输入的语音序列归属于不同的人。
    • 异常检测(Anomaly detection):识别在数据集中与大多数样本不同的异常样本。例如,在网络入侵检测中,识别可能是攻击的网络流量。

    这些是分类问题中的一些常见类型,每种类型都有其独特的特点和应用场景。选择适当的分类类型取决于具体的问题和数据集。最典型的当属前三个。

    2. 一些解析

    2.1 关于多标签分类 to 多个二分类

    多分类问题都能转化为多个二分类问题。二分类模型相比于多分类模型,识别准确率会提升(类别越多,错误识别的概率会越高),但是将多分类转化为二分类,模型的复杂度会变高,如果对识别准确率要求非常高,可以采用多个二分类进行识别,如果准确率要求不是那么高,采用多分类模型即可。因此,可以根据具体场景来进行选择,将多分类转化为多个二分类。

    多标签分类可以转化为多个二分类任务,每个二分类任务对应一个标签。效果的好坏取决于具体的问题和数据集。

    • 将多标签分类转化为多个二分类任务的优点是,每个任务相对独立,可以使用不同的模型或算法来处理不同的标签。这样可以充分利用每个标签的特征和关联性,提高分类准确性。此外,由于每个任务都是二分类,可能更容易找到适合的模型和优化方法。
    • 然而,将多标签分类转化为多个二分类任务也存在一些挑战。首先,可能存在标签之间的相关性,单独对每个标签进行二分类可能无法充分考虑标签之间的关联。其次,如果某些标签类别不平衡,即其中一个类别样本数量较少时,二分类任务可能会面临样本不平衡的问题。此外,将问题转化为多个二分类任务会增加计算和存储开销。
    • 因此,选择哪种方法取决于具体的问题和数据集。有时,多标签分类本身的模型或算法可能已经能够取得很好的效果。在其他情况下,将多标签分类转化为多个二分类任务可能能够提供更好的性能。需要根据具体情况进行实验和评估,找到最适合的方法。
    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.utils.data import DataLoader, Dataset
    
    # 自定义数据集类
    class MultiLabelDataset(Dataset):
        def __init__(self, X, y):
            self.X = torch.tensor(X, dtype=torch.float32)
            self.y = torch.tensor(y, dtype=torch.float32)
    
        def __len__(self):
            return len(self.X)
        
        def __getitem__(self, idx):
            return self.X[idx], self.y[idx]
    
    # 自定义模型类
    class BinaryClassifier(nn.Module):
        def __init__(self, input_size):
            super(BinaryClassifier, self).__init__()
            self.fc = nn.Linear(input_size, 1)
            
        def forward(self, x):
            x = self.fc(x)
            return x
    
    # 训练函数
    def train_model(model, train_loader, criterion, optimizer, num_epochs):
        model.train()
        for epoch in range(num_epochs):
            running_loss = 0.0
            for inputs, labels in train_loader:
                optimizer.zero_grad()
                outputs = model(inputs)
                loss = criterion(outputs.squeeze(), labels)
                loss.backward()
                optimizer.step()
                running_loss += loss.item()
            print(f"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss / len(train_loader)}")
    
    # 测试函数
    def test_model(model, test_loader, threshold=0.5):
        model.eval()
        with torch.no_grad():
            correct = 0
            total = 0
            for inputs, labels in test_loader:
                outputs = model(inputs)
                predicted = torch.sigmoid(outputs.squeeze()) > threshold
                total += labels.size(0)
                correct += (predicted == labels).sum().item()
        print(f"Accuracy: {correct / total}")
    
    # 生成示例的多标签分类数据集
    X, y = make_multilabel_classification(n_samples=100, n_features=10, n_labels=3, random_state=1)
    
    # 数据集划分为训练集和测试集
    train_dataset = MultiLabelDataset(X[:80], y[:80])
    test_dataset = MultiLabelDataset(X[80:], y[80:])
    
    # 创建数据加载器
    train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
    test_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)
    
    # 创建模型、损失函数和优化器
    model = BinaryClassifier(input_size=10)
    criterion = nn.BCEWithLogitsLoss()
    optimizer = optim.Adam(model.parameters(), lr=0.001)
    
    # 训练并测试模型
    train_model(model, train_loader, criterion, optimizer, num_epochs=10)
    test_model(model, test_loader)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    上述代码中,

    • 首先定义了一个自定义的数据集类MultiLabelDataset,用于加载数据。然后,定义了一个简单的二分类模型BinaryClassifier,该模型使用线性全连接层进行二分类任务。接下来,定义了训练函数train_model和测试函数test_model,用于训练和评估模型。
    • 在主程序中,使用make_multilabel_classification生成示例的多标签分类数据集。然后,将数据集划分为训练集和测试集,并创建对应的数据加载器。接着,创建模型、损失函数和优化器。最后,调用train_model进行模型训练,并调用test_model评估模型在测试集上的准确率。
    • 代码仅提供了一个简单的示例,实际使用时可能需要更复杂的模型和优化策略。另外,还可以根据具体情况进行超参数的调整以获得更好的效果。

    2.2 continue

  • 相关阅读:
    iOS UIKit
    Ubuntu安装截图工具Shutter及使用
    Apache Tomcat安装配置
    一起用Go做一个小游戏(上)
    数据结构之顺序表
    linux学习笔记
    上拉加载更多异步请求?
    Java 注解及其底层原理
    【LeetCode】【剑指offer】【二叉树的深度(一)】
    数据结构——三路划分(快排优化)
  • 原文地址:https://blog.csdn.net/qq_51392112/article/details/133417461