欢迎访问宙启技术站
智能推送

Python中的策略性采样器:根据需求选择样本数据

发布时间:2024-01-05 22:10:56

在Python中,策略性采样器是一种根据特定策略选择样本数据的方法。它根据需求自动选择部分数据进行训练或分析,以提高效率和准确性。下面我们将介绍一些常见的策略性采样器,并提供使用例子。

1. 随机采样器(Random Sampler):随机从数据集中选择样本,不考虑任何特定的策略。这是最简单的采样方法之一,适用于不需要特定数据分布的情况。下面是一个使用随机采样器的例子:

from torch.utils.data import Dataset, DataLoader, RandomSampler

class MyDataset(Dataset):
    def __init__(self, data):
        self.data = data
        
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, idx):
        return self.data[idx]
        
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
dataset = MyDataset(data)
sampler = RandomSampler(dataset)
dataloader = DataLoader(dataset, sampler=sampler, batch_size=2)

for batch in dataloader:
    print(batch)

2. 权重采样器(Weighted Random Sampler):根据样本的权重选择数据,使得某些样本被选中的概率更高。这种采样方法常用于类别不平衡的情况。下面是一个使用权重采样器的例子:

from torch.utils.data import WeightedRandomSampler

class MyDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets
        
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, idx):
        return self.data[idx], self.targets[idx]
        
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
targets = [0, 1, 0, 1, 1, 1, 0, 1, 0, 1]
dataset = MyDataset(data, targets)
class_sample_count = [1, 4]  # 类别0的权重为1,类别1的权重为4
weights = [class_sample_count[i] for i in targets]
sampler = WeightedRandomSampler(weights, len(dataset))
dataloader = DataLoader(dataset, sampler=sampler, batch_size=2)

for batch in dataloader:
    print(batch)

3. 分层采样器(Stratified Sampler):根据样本标签的分布选择数据,保持样本分布在采样后的数据集中的一致性。这种采样方法常用于分类任务中,以确保训练集和测试集的标签分布相似。下面是一个使用分层采样器的例子:

from torch.utils.data import SubsetRandomSampler, DataLoader
from sklearn.model_selection import train_test_split
import numpy as np

class MyDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets
        
    def __len__(self):
        return len(self.data)
    
    def __getitem__(self, idx):
        return self.data[idx], self.targets[idx]
        
data = np.random.randn(100, 10)  # 100个样本,每个样本有10个特征
targets = np.random.choice(range(5), 100)  # 5个类别,随机选择标签
dataset = MyDataset(data, targets)
train_idxs, test_idxs = train_test_split(range(len(dataset)), test_size=0.2, stratify=targets)
train_sampler = SubsetRandomSampler(train_idxs)
test_sampler = SubsetRandomSampler(test_idxs)
train_dataloader = DataLoader(dataset, sampler=train_sampler, batch_size=2)
test_dataloader = DataLoader(dataset, sampler=test_sampler, batch_size=2)

for batch in train_dataloader:
    print("Train batch:", batch)
    
for batch in test_dataloader:
    print("Test batch:", batch)

这些策略性采样器在不同的场景中能够提高模型的效率和准确性。你可以根据特定的需求选择合适的采样器,并根据需要进行自定义。使用合适的采样器可以使得训练或分析过程更加高效和精确。