如何用PyTorch仅通过性别、年龄、体重预测整数测试分数
PyTorch实现基于年龄、体重、性别的测试分数回归(整数输出)
1. 数据预处理
先处理分类特征(性别),将字符串转换为数值编码(比如"male"设为1,"female"设为0),再把所有数据转为PyTorch张量,用Dataset和DataLoader实现批量加载:
import torch from torch.utils.data import Dataset, DataLoader import pandas as pd class ScoreDataset(Dataset): def __init__(self, csv_file): self.data = pd.read_csv(csv_file) # 性别编码 self.data['gender'] = self.data['gender'].map({'male': 1, 'female': 0}) # 提取特征与标签 self.features = self.data[['age', 'weight', 'gender']].values self.labels = self.data['test score'].values def __len__(self): return len(self.data) def __getitem__(self, idx): feature = torch.tensor(self.features[idx], dtype=torch.float32) label = torch.tensor(self.labels[idx], dtype=torch.float32) return feature, label # 加载训练数据 train_dataset = ScoreDataset('train_data.csv') train_loader = DataLoader(train_dataset, batch_size=2, shuffle=True)
2. 定义回归模型
和图像分类不同,回归任务无需最后一层的分类激活函数(如Softmax),用简单全连接层即可,输出维度为1(对应单个测试分数):
class ScorePredictor(torch.nn.Module): def __init__(self): super().__init__() # 输入特征数为3(年龄、体重、性别) self.fc1 = torch.nn.Linear(3, 16) self.fc2 = torch.nn.Linear(16, 8) self.fc3 = torch.nn.Linear(8, 1) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = self.fc3(x) # 最后一层无激活,输出连续值 return x model = ScorePredictor()
3. 训练流程
回归任务常用均方误差损失(MSELoss),优化器选Adam或SGD均可:
criterion = torch.nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) epochs = 100 for epoch in range(epochs): running_loss = 0.0 for features, labels in train_loader: optimizer.zero_grad() outputs = model(features) # 调整标签形状与输出匹配 loss = criterion(outputs, labels.unsqueeze(1)) loss.backward() optimizer.step() running_loss += loss.item() if (epoch+1) % 10 == 0: print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss/len(train_loader):.4f}')
4. 输出整数结果
模型输出是连续浮点值,通过torch.round()取整或直接转换为Python整数即可得到整数形式的预测结果:
# 测试示例:年龄22、体重75、男性 test_feature = torch.tensor([22, 75, 1], dtype=torch.float32) model.eval() with torch.no_grad(): output = model(test_feature.unsqueeze(0)) # 取整后转成整数 int_score = int(torch.round(output).item()) print(f"预测测试分数:{int_score}")
如果测试分数有固定整数区间(如0-100),也可以把任务当作分类处理,但回归+取整的方式更直接适配你的需求。
内容的提问来源于stack exchange,提问作者kabakaba
相关产品推荐
相关产品推荐

