帝国cms网站迁移网站建设管理理论
2026/1/10 5:00:24 网站建设 项目流程
帝国cms网站迁移,网站建设管理理论,百度网站怎么做信息,怀柔高端网站建设浙大疏锦行 用 MLP 神经网络训练#xff0c;并且让代码更规范美观#xff0c;用到之前讲的知识点比如类的 call 方法、模型评估、GPU 训练、模型结构可视化等。 首先#xff0c;梳理步骤#xff1a; 代码重构#xff0c;模块化#xff1a;把预处理、模型构建、训练、评…浙大疏锦行用 MLP 神经网络训练并且让代码更规范美观用到之前讲的知识点比如类的 call 方法、模型评估、GPU 训练、模型结构可视化等。首先梳理步骤代码重构模块化把预处理、模型构建、训练、评估封装成类或函数提升可读性和复用性。引入 PyTorch 构建 MLP适配 GPU/CPU用到__call__方法封装训练和推理。加入模型结构可视化torchinfo。规范的训练流程数据转换为张量、数据加载器、训练循环、验证。完整的评估准确率、F1、混淆矩阵等。代码格式优化注释清晰、命名规范、避免重复导入、路径处理用 os.path 避免转义问题。分模块导入模块去重规范路径配置避免转义数据预处理函数封装原逻辑MLP 模型类继承 nn.Module训练器类带__call__封装训练步骤评估函数规范的分类评估主流程预处理→数据加载→模型初始化→可视化→训练→评估→结果可视化还要注意数据类型转换确保张量类型正确float32数据加载器DataLoader的使用训练时的梯度清零、反向传播评估时的 eval () 和 no_grad ()指标计算准确率、F1、混淆矩阵代码注释清晰命名符合 PEP8比如 home_ownership_mapping而不是混用大小写避免重复代码比如原代码重复导入 pandas要去掉。# 1. 导入模块去重规范 import os import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader, TensorDataset from torchinfo import summary # 模型结构可视化 from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, f1_score, confusion_matrix from sklearn.preprocessing import StandardScaler # 连续特征标准化MLP必备 # 全局配置统一管理 warnings.filterwarnings(ignore) plt.rcParams[font.sans-serif] [SimHei] # 中文显示 plt.rcParams[axes.unicode_minus] False DEVICE torch.device(cuda:0 if torch.cuda.is_available() else cpu) # 设备配置 SEED 42 # 随机种子保证可复现 np.random.seed(SEED) torch.manual_seed(SEED) if torch.cuda.is_available(): torch.cuda.manual_seed(SEED) # 2. 路径配置避免转义跨平台 DATA_PATH rE:\study\PythonStudy\data.csv # r-string避免转义 assert os.path.exists(DATA_PATH), f数据文件不存在{DATA_PATH} # 3. 数据预处理封装为函数复用性强 def preprocess_data(data_path): 数据预处理函数封装所有清洗、编码、缺失值填充逻辑 :param data_path: 数据文件路径 :return: 标准化后的特征矩阵X、标签y # 读取数据 data pd.read_csv(data_path) data2 pd.read_csv(data_path) # 用于独热编码列名对比 # 1. 字符串变量编码 # Home Ownership 标签编码 home_ownership_mapping { Own Home: 1, Rent: 2, Have Mortgage: 3, Home Mortgage: 4 } data[Home Ownership] data[Home Ownership].map(home_ownership_mapping) # Years in current job 标签编码 years_in_job_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_in_job_mapping) # Purpose 独热编码 bool转数值 data pd.get_dummies(data, columns[Purpose]) # 筛选独热编码新增列并转int 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. 缺失值填充连续特征用众数 continuous_features data.select_dtypes(include[int64, float64]).columns.tolist() for feat in continuous_features: mode_val data[feat].mode()[0] data[feat].fillna(mode_val, inplaceTrue) # 3. 特征和标签分离 标准化MLP对特征尺度敏感必做 X data.drop([Credit Default], axis1) y data[Credit Default] scaler StandardScaler() # 标准化均值0方差1 X_scaled scaler.fit_transform(X) return X_scaled, y, X.columns.tolist() # 返回标准化特征、标签、特征名 # 4. MLP模型定义继承nn.Module规范 class CreditDefaultMLP(nn.Module): 信用违约预测MLP模型 :param input_dim: 输入特征维度 :param hidden_dims: 隐藏层维度列表如[128, 64] :param dropout: Dropout概率防止过拟合 def __init__(self, input_dim, hidden_dims[128, 64], dropout0.2): super().__init__() # 构建隐藏层 layers [] prev_dim input_dim for dim in hidden_dims: layers.append(nn.Linear(prev_dim, dim)) layers.append(nn.ReLU()) # 激活函数 layers.append(nn.Dropout(dropout)) # Dropout正则化 prev_dim dim # 输出层二分类用Sigmoid layers.append(nn.Linear(prev_dim, 1)) layers.append(nn.Sigmoid()) self.mlp nn.Sequential(*layers) # 封装层 def forward(self, x): 前向传播nn.Module核心方法 return self.mlp(x) # 5. 训练器类封装训练逻辑用__call__实现单步训练 class MLPTrainer: def __init__(self, model, optimizer, criterion, device): self.model model.to(device) self.optimizer optimizer self.criterion criterion self.device device self.train_losses [] # 记录训练损失 self.val_losses [] # 记录验证损失 def __call__(self, x_batch, y_batch, train_modeTrue): 单步训练/验证__call__让实例可像函数调用 :param x_batch: 批次特征张量 :param y_batch: 批次标签张量 :param train_mode: True训练反向传播False验证无梯度 :return: 批次损失 x_batch x_batch.to(self.device, dtypetorch.float32) y_batch y_batch.to(self.device, dtypetorch.float32).unsqueeze(1) # 适配输出维度 if train_mode: self.model.train() # 训练模式启用Dropout self.optimizer.zero_grad() # 清空梯度 outputs self.model(x_batch) loss self.criterion(outputs, y_batch) loss.backward() # 反向传播 self.optimizer.step() # 更新参数 else: self.model.eval() # 验证模式关闭Dropout with torch.no_grad(): # 关闭梯度省显存 outputs self.model(x_batch) loss self.criterion(outputs, y_batch) return loss.item() # 6. 评估函数规范的分类评估 def evaluate_model(model, dataloader, device): 模型评估计算准确率、F1-score、混淆矩阵 :return: 评估指标字典 model.eval() all_preds [] all_labels [] with torch.no_grad(): for x_batch, y_batch in dataloader: x_batch x_batch.to(device, dtypetorch.float32) outputs model(x_batch) preds (outputs 0.5).int() # Sigmoid输出0.5为正例 all_preds.extend(preds.cpu().numpy().flatten()) all_labels.extend(y_batch.numpy().flatten()) # 计算指标 accuracy accuracy_score(all_labels, all_preds) f1 f1_score(all_labels, all_preds, averageweighted) # 加权F1适配类别不均衡 cm confusion_matrix(all_labels, all_preds) return { accuracy: accuracy, f1_score: f1, confusion_matrix: cm, preds: all_preds, labels: all_labels } # 7. 结果可视化函数封装复用性强 def plot_results(train_losses, val_losses, eval_metrics): 可视化训练损失和评估结果 fig, axes plt.subplots(1, 2, figsize(14, 6)) # 子图1训练/验证损失曲线 axes[0].plot(train_losses, label训练损失, colorblue) axes[0].plot(val_losses, label验证损失, colorred) axes[0].set_xlabel(迭代轮次批次) axes[0].set_ylabel(损失值) axes[0].set_title(MLP训练/验证损失曲线) axes[0].legend() axes[0].grid(True, alpha0.3) # 子图2混淆矩阵 cm eval_metrics[confusion_matrix] sns.heatmap(cm, annotTrue, fmtd, cmapBlues, axaxes[1]) axes[1].set_xlabel(预测标签) axes[1].set_ylabel(真实标签) axes[1].set_title(f混淆矩阵准确率{eval_metrics[accuracy]:.4f}) plt.tight_layout() plt.savefig(credit_default_mlp_results.png, dpi300, bbox_inchestight) plt.show() # 8. 主流程入口函数逻辑清晰 def main(): # Step1数据预处理 print( 开始数据预处理 ) X_scaled, y, feature_names preprocess_data(DATA_PATH) input_dim X_scaled.shape[1] # 输入特征维度 print(f预处理完成输入特征维度{input_dim}样本数{X_scaled.shape[0]}) # Step2划分训练/测试集 转换为TensorDataset X_train, X_test, y_train, y_test train_test_split( X_scaled, y, test_size0.2, random_stateSEED ) # 转换为PyTorch张量 train_dataset TensorDataset(torch.from_numpy(X_train), torch.from_numpy(y_train.values)) test_dataset TensorDataset(torch.from_numpy(X_test), torch.from_numpy(y_test.values)) # 构建DataLoader批量加载 train_loader DataLoader(train_dataset, batch_size32, shuffleTrue) test_loader DataLoader(test_dataset, batch_size32, shuffleFalse) # Step3初始化模型 优化器 损失函数 model CreditDefaultMLP(input_diminput_dim, hidden_dims[128, 64], dropout0.2) optimizer optim.Adam(model.parameters(), lr1e-3) # Adam优化器 criterion nn.BCELoss() # 二分类交叉熵损失适配Sigmoid输出 # Step4模型结构可视化 print(\n 模型结构 ) summary(model, input_size(32, input_dim), deviceDEVICE) # 32batch_size # Step5初始化训练器 trainer MLPTrainer(model, optimizer, criterion, DEVICE) # Step6训练模型 print(\n 开始训练 ) epochs 50 # 训练轮次 for epoch in range(epochs): epoch_train_loss 0.0 # 训练批次 for x_batch, y_batch in train_loader: batch_loss trainer(x_batch, y_batch, train_modeTrue) epoch_train_loss batch_loss avg_train_loss epoch_train_loss / len(train_loader) trainer.train_losses.append(avg_train_loss) # 验证批次 epoch_val_loss 0.0 for x_batch, y_batch in test_loader: batch_loss trainer(x_batch, y_batch, train_modeFalse) epoch_val_loss batch_loss avg_val_loss epoch_val_loss / len(test_loader) trainer.val_losses.append(avg_val_loss) # 打印训练进度 if (epoch 1) % 5 0: print(fEpoch [{epoch1}/{epochs}] | 训练损失{avg_train_loss:.4f} | 验证损失{avg_val_loss:.4f}) # Step7模型评估 print(\n 模型评估 ) eval_metrics evaluate_model(model, test_loader, DEVICE) print(f准确率{eval_metrics[accuracy]:.4f}) print(fF1-score{eval_metrics[f1_score]:.4f}) # Step8结果可视化 plot_results(trainer.train_losses, trainer.val_losses, eval_metrics) # Step9保存模型 torch.save(model.state_dict(), credit_default_mlp.pth) print(\n 训练完成模型已保存为 credit_default_mlp.pth ) # 9. 执行主流程 if __name__ __main__: main()

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询