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