背景:
基于手机的20列特征 -> 预测手机的价格区间(4个区间), 可以用机器学习做, 也可以用 深度学习做(推荐)
ANN案例的实现步骤:
1. 构建数据集.
2. 搭建神经网络.
3. 模型训练.
4. 模型测试.
import torch import torch.nn as nn import pandas as pd from sklearn.model_selection import train_test_split from torch.utils.data import TensorDataset from torch.utils.data import DataLoader import torch.optim as optim import numpy as np import time from sklearn.preprocessing import StandardScaler # 构建数据集 def create_dataset(): # 使用pandas读取数据 data = pd.read_csv('./data/手机价格预测.csv') # 特征值和目标值 x, y = data.iloc[:, :-1], data.iloc[:, -1] # 类型转换:特征值,目标值 x = x.astype(np.float32) y = y.astype(np.int64) # 数据集划分 x_train, x_valid, y_train, y_valid = train_test_split(x, y, train_size=0.8, random_state=88, stratify=y) # 优化①:数据标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_valid = transfer.transform(x_valid) # 构建数据集,转换为pytorch的形式 train_dataset = TensorDataset(torch.from_numpy(x_train), torch.tensor(y_train.values)) valid_dataset = TensorDataset(torch.from_numpy(x_valid), torch.tensor(y_valid.values)) # 返回结果 return train_dataset, valid_dataset, x_train.shape[1], len(np.unique(y)) # 构建网络模型 class PhonePriceModel(nn.Module): def __init__(self, input_dim, output_dim): super(PhonePriceModel, self).__init__() # 优化②:增加网络深度 # 1. 第一层: 输入为维度为 20, 输出维度为: 128 self.linear1 = nn.Linear(input_dim, 128) # 2. 第二层: 输入为维度为 128, 输出维度为: 256 self.linear2 = nn.Linear(128, 256) # 3. 第三层: 输入为维度为 256, 输出维度为: 512 self.linear3 = nn.Linear(256, 512) # 4. 第四层: 输入为维度为 512, 输出维度为: 128 self.linear4 = nn.Linear(512, 128) # 5. 输出层: 输入为维度为 128, 输出维度为: 4 self.linear5 = nn.Linear(128, output_dim) def forward(self, x): # 前向传播过程 x = torch.relu(self.linear1(x)) x = torch.relu(self.linear2(x)) x = torch.relu(self.linear3(x)) x = torch.relu(self.linear4(x)) # 后续CrossEntropyLoss损失函数中包含softmax过程, 所以当前步骤不进行softmax操作 output = self.linear5(x) # 获取数据结果 return output # 编写训练函数 def train(train_dataset, input_dim, class_num): # 固定随机数种子 torch.manual_seed(0) # 初始化数据加载器 dataloader = DataLoader(train_dataset, shuffle=True, batch_size=8) # 初始化模型 model = PhonePriceModel(input_dim, class_num) # 损失函数 CrossEntropyLoss = softmax + 损失计算 criterion = nn.CrossEntropyLoss() # 优化③:使用Adam优化方法, 优化④:学习率变为1e-4 optimizer = optim.Adam(model.parameters(), lr=1e-4) # 遍历每个轮次的数据 num_epoch = 50 for epoch_idx in range(num_epoch): # 训练时间 start = time.time() # 计算损失 total_loss = 0.0 total_num = 0 # 遍历每个batch数据进行处理 for x, y in dataloader: model.train() output = model(x) # 计算损失 loss = criterion(output, y) # 梯度清零 optimizer.zero_grad() # 反向传播 loss.backward() # 参数更新 optimizer.step() # 损失计算 total_num += len(y) total_loss += loss.item() * len(y) # 打印损失变换结果 print('epoch: %4s loss: %.2f, time: %.2fs' % (epoch_idx + 1, total_loss / total_num, time.time() - start)) # 模型保存 torch.save(model.state_dict(), './model/phone-price-model2.pth') def evaluate(valid_dataset, input_dim, class_num): # 加载模型和训练好的网络参数 model = PhonePriceModel(input_dim, class_num) # load_state_dict:将加载的参数字典应用到模型上 # load:加载用来保存模型参数的文件 model.load_state_dict(torch.load('./model/phone-price-model2.pth')) # 构建加载器 dataloader = DataLoader(valid_dataset, batch_size=8, shuffle=False) # 评估测试集 correct = 0 # 遍历测试集中的数据 for x, y in dataloader: # 将其送入网络中 # model.eval() output = model(x) # 获取预测类别结果 y_pred = torch.argmax(output, dim=1) # 获取预测正确的个数 correct += (y_pred == y).sum() # 求预测精度 print('Acc: %.5f' % (correct / len(valid_dataset))) if __name__ == '__main__': train_dataset, valid_dataset, input_dim, class_num = create_dataset() train(train_dataset, input_dim, class_num) evaluate(valid_dataset, input_dim, class_num)
Pytorch实现基础的价格分类模型
| Title | Pytorch实现基础的价格分类模型 |
|---|---|
| Framework | PyTorch |
| User | wy8817399@vip.qq.com |
| Id | 42 |
| Created | 2/4/26, 6:21 PM |
| Modified | 2/4/26, 6:22 PM |
| Published | Yes |
Content