数据集处理重采样等操作(DataLoad)

本文介绍了如何在MindSpore中使用WeightedRandomSampler进行加权重采样,以调整模型训练中不同样本的重要性。权重列表决定了每个样本被抽样的概率,当列表长度与数据集不同时,采样会进行循环覆盖。
摘要由CSDN通过智能技术生成

WeightedRandomSampler 重采样方法

import mindspore.dataset as ds
weights = [0.9, 0.01, 0.4, 0.8, 0.1, 0.1, 0.3] #weights貌似是要小于等于数据集的长度

dataset_path = "../../../mindspore_learning/MNIST_Data/train"
sampler = ds.WeightedRandomSampler(weights, 5) #5表示采样的数量,就是后面dataset的长度

# 定义数据集和采样器
dataset = ds.MnistDataset(dataset_path, sampler=sampler)
print(len(dataset))


有时候数据集中的不同样本对模型的训练贡献是不同的,因此可以使用加权采样来调整样本的抽样概率。WeightedRandomSampler 就是这样一种采样器,它根据提供的权重列表来决定每个样本被抽样的概率。

比如数据集有1万条数据,然后这个weights的长度也是1万,sampler = ds.WeightedRandomSampler(weights, 10000),dataset = ds.MnistDataset(dataset_path, sampler=sampler),最终dataset得到了这10000条数据, 但是和数据集的数据是不一样的

在mindone代码里的使用方法

  ds=de.GeneratorDataset(dataset,column_names=dataset_column_names,sampler=de.WeightedRandomSampler([0.9,0.01,0.4,0.8,0.9,0.01,0.4,0.8],8),num_parallel_workers=min(32, num_parallel_workers),python_multiprocessing=python_multiprocessing)

#下面注释掉的是之前的代码
        # ds = de.GeneratorDataset(
        #     dataset,
        #     column_names=dataset_column_names,
        #     num_parallel_workers=min(32, num_parallel_workers),
        #     shuffle=shuffle,
        #     python_multiprocessing=python_multiprocessing,
        # )

当权重列表的长度与数据集大小不一致时,WeightedRandomSampler 会按照权重列表的长度进行取余操作,以确保在每个 epoch 内能够完整覆盖数据集。具体来说,如果权重列表的长度小于数据集大小,那么这个权重列表将在整个数据集上循环使用。

例如,如果您的数据集大小为1000,而权重列表的长度为8,那么 WeightedRandomSampler 在每个 epoch 中将按照如下顺序使用这8个权重来对数据集进行采样。

首先,需要加载 SEED 数据集,可以使用 MNE 库来加载和预处理。其中,SEED 数据集包括了三种情绪(愉快、中性和悲伤)的脑电信号。 ```python import mne from mne.datasets import eegbci # 加载 SEED 数据集 subject = 1 runs = [6, 10, 14] # 每种情绪对应的运行编号 raw_fnames = eegbci.load_data(subject, runs) raw = mne.io.read_raw_edf(raw_fnames[0], preload=True) ``` 接下来,需要对数据进行预处理,包括去除眼电和肌电干扰、滤波、重采样等。这里,可以使用 MNE 库提供的函数来完成这些操作。 ```python # 去除眼电和肌电干扰 raw.set_eeg_reference('average') raw.filter(1, 50, fir_design='firwin') raw.notch_filter(np.arange(60, 241, 60), filter_length='auto', phase='zero') # 重采样 raw.resample(128, npad='auto') ``` 然后,需要对数据进行特征提取,可以使用常见的脑电信号特征,如功率谱密度、小波系数等。在这里,我们使用功率谱密度作为特征。 ```python from mne.time_frequency import psd_welch # 提取功率谱密度特征 psds, freqs = psd_welch(raw, fmin=1, fmax=50, n_fft=2048, n_overlap=1024, n_per_seg=2048) ``` 接下来,需要将特征和标签分别存储到 X 和 y 变量中,用于训练和测试分类器。 ```python # 将特征和标签存储到 X 和 y 变量中 X = psds.reshape(len(psds), -1) y = np.concatenate([np.zeros(len(psds) // 3), np.ones(len(psds) // 3), np.full(len(psds) // 3, 2)]) ``` 最后,可以使用 sklearn 库提供的 SVM 分类器来进行情绪分类。这里使用交叉验证来评估分类器的性能。 ```python from sklearn.model_selection import cross_val_score from sklearn.svm import SVC # 训练 SVM 分类器并进行交叉验证 clf = SVC(kernel='linear', C=1, random_state=42) scores = cross_val_score(clf, X, y, cv=5) print('Accuracy:', np.mean(scores)) ``` 上述代码中,我们使用线性核函数训练 SVM 分类器,并使用 5 折交叉验证来评估分类器的性能。最后,输出分类器的平均准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值