网站还没完成 能备案吗,建信网证书查询平台,电子商务平台电工交易专区,网站设浙大疏锦行
一、核心定位
类核心角色核心作用Dataset「数据容器」/「数据加工厂」定义单条数据的读取、预处理逻辑#xff08;如从 CSV 读一行、编码、填充、标准化#xff09;#xff0c;支持按索引取数DataLoader「数据搬运工」/「批量调度器」封装 Dataset#xff0c;…浙大疏锦行一、核心定位类核心角色核心作用Dataset「数据容器」/「数据加工厂」定义单条数据的读取、预处理逻辑如从 CSV 读一行、编码、填充、标准化支持按索引取数DataLoader「数据搬运工」/「批量调度器」封装Dataset实现批量加载、数据打乱、多线程读取、分批迭代解决显存和效率问题简单来说Dataset解决 “单条数据怎么来” 的问题DataLoader解决 “怎么把数据批量喂给模型” 的问题。二、Dataset类详解PyTorch 提供了内置Dataset如TensorDataset、ImageFolder但实际项目中必须自定义Dataset需继承torch.utils.data.Dataset并实现两个核心方法__len__()返回数据集的总条数让DataLoader知道有多少数据__getitem__(idx)根据索引idx返回单条数据特征 标签是预处理的核心。1. 自定义Dataset实战import torch from torch.utils.data import Dataset, DataLoader import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler class CreditDefaultDataset(Dataset): 信用违约预测自定义Dataset :param data_path: CSV数据路径 :param is_train: 是否为训练集用于区分训练/测试的标准化 :param scaler: 标准化器训练集拟合测试集复用 def __init__(self, data_path, is_trainTrue, scalerNone): self.data_path data_path self.is_train is_train self.scaler scaler # 1. 读取数据 预处理复用你之前的逻辑 self.data self._preprocess_data() # 2. 分离特征和标签 self.X self.data.drop([Credit Default], axis1).values # 特征数组 self.y self.data[Credit Default].values # 标签数组 # 3. 标准化训练集拟合scaler测试集复用 if self.is_train: self.scaler StandardScaler() self.X self.scaler.fit_transform(self.X) else: assert self.scaler is not None, 测试集必须传入训练集的scaler self.X self.scaler.transform(self.X) def _preprocess_data(self): 封装你之前的预处理逻辑编码、填充缺失值 data pd.read_csv(self.data_path) data2 pd.read_csv(self.data_path) # 1. 字符串变量编码 # Home Ownership 标签编码 home_mapping {Own Home:1, Rent:2, Have Mortgage:3, Home Mortgage:4} data[Home Ownership] data[Home Ownership].map(home_mapping) # Years in current job 标签编码 years_mapping { 1 year:1, 1 year:2, 2 years:3, 3 years:4, 4 years:5, 5 years:6, 6 years:7, 7 years:8, 8 years:9, 9 years:10, 10 years:11} data[Years in current job] data[Years in current job].map(years_mapping) # Purpose 独热编码 bool转int data pd.get_dummies(data, columns[Purpose]) new_cols [col for col in data.columns if col not in data2.columns] for col in new_cols: data[col] data[col].astype(int) # Term 映射 重命名 term_mapping {Short Term:0, Long Term:1} data[Term] data[Term].map(term_mapping) data.rename(columns{Term: Long Term}, inplaceTrue) # 2. 缺失值填充连续特征用众数 cont_feats data.select_dtypes(include[int64, float64]).columns.tolist() for feat in cont_feats: mode_val data[feat].mode()[0] data[feat].fillna(mode_val, inplaceTrue) return data def __len__(self): 返回数据集总条数必须实现 return len(self.X) def __getitem__(self, idx): 根据索引返回单条数据必须实现 :param idx: 数据索引int :return: (特征tensor, 标签tensor) # 取单条数据numpy数组 x self.X[idx] y self.y[idx] # 转换为PyTorch张量MLP需要float32类型 x_tensor torch.from_numpy(x).float() y_tensor torch.from_numpy(np.array(y)).float() # 二分类标签用float适配BCELoss return x_tensor, y_tensor2.Dataset核心方法解释方法作用__init__初始化读取数据、预处理、分离特征 / 标签、标准化核心预处理逻辑都在这里__len__返回数据总条数DataLoader会用这个方法知道 “有多少批数据”__getitem__按索引取单条数据是DataLoader批量加载的基础每次取 1 条再拼 batch自定义方法如_preprocess_data封装预处理逻辑让代码更整洁非必须但推荐三、DataLoader类详解DataLoader是Dataset的 “上层封装”核心作用是把Dataset中的单条数据拼成批次并提供高效读取能力。1. 核心参数参数作用训练集 / 测试集建议dataset传入自定义的Dataset实例必须-batch_size每批数据的条数如 32、64训练集32/64测试集可更大如 128shuffle是否打乱数据避免模型学习顺序训练集True测试集Falsenum_workers多线程读取数据加速Windows0Linux/Mac4/8根据 CPU 核数drop_last是否丢弃最后一批不足batch_size的数据训练集True测试集Falsepin_memory是否锁定内存GPU 训练时加速数据传输GPU 训练TrueCPUFalse2.DataLoader实战# 数据路径替换为你的实际路径 DATA_PATH rE:\study\PythonStudy\python60-days-challenge-master\data.csv # Step1创建训练集Dataset拟合scaler train_dataset CreditDefaultDataset(data_pathDATA_PATH, is_trainTrue) # 提取训练集的scaler供测试集复用 train_scaler train_dataset.scaler # Step2划分训练/测试集可选如果Dataset已包含全量数据这里拆分 # 注意也可以在Dataset中直接划分这里用切片示例 train_size int(0.8 * len(train_dataset)) test_size len(train_dataset) - train_size train_subset, test_subset torch.utils.data.random_split( train_dataset, [train_size, test_size], generatortorch.Generator().manual_seed(42) ) # 测试集Dataset复用训练集的scaler test_dataset CreditDefaultDataset(data_pathDATA_PATH, is_trainFalse, scalertrain_scaler) # Step3创建DataLoader核心 train_loader DataLoader( datasettrain_subset, batch_size32, shuffleTrue, # 训练集打乱 num_workers0, # Windows建议设0避免多线程报错 drop_lastTrue, # 丢弃最后一批不足32条的数据 pin_memoryTrue if torch.cuda.is_available() else False # GPU加速 ) test_loader DataLoader( datasettest_subset, batch_size64, shuffleFalse, # 测试集不打乱 num_workers0, drop_lastFalse, pin_memoryTrue if torch.cuda.is_available() else False ) # Step4迭代DataLoader训练/测试时的核心用法 # 示例遍历训练集批次 print( 训练集批次示例 ) for batch_idx, (x_batch, y_batch) in enumerate(train_loader): print(f批次 {batch_idx1}) print(f 特征形状{x_batch.shape} (batch_size{x_batch.shape[0]}, 特征数{x_batch.shape[1]})) print(f 标签形状{y_batch.shape}) # 训练时将批次数据移到GPU → 前向传播 → 反向传播 if batch_idx 2: # 只打印前3批 break # 示例遍历测试集批次 print(\n 测试集批次示例 ) for batch_idx, (x_batch, y_batch) in enumerate(test_loader): print(f批次 {batch_idx1}特征形状{x_batch.shape}标签形状{y_batch.shape}) if batch_idx 1: break3.DataLoader迭代逻辑解释enumerate(train_loader)会逐批返回(批次索引, (特征批次, 标签批次))特征批次形状(batch_size, 特征数)如 32 个样本20 个特征 →(32, 20)标签批次形状(batch_size,)如 32 个样本 →(32,)训练时每批数据会被喂给模型outputs model(x_batch)。