美文网首页
操练代码之回归分析

操练代码之回归分析

作者: 万州客 | 来源:发表于2024-08-20 10:29 被阅读0次

之前,主要是用sklearn之类的来实现回归算法 ,现在转pytorch,适应一下。

一,代码

import torch
import numpy as np
import pandas as pd
from torch.utils.data import DataLoader, TensorDataset
import time

start = time.perf_counter()

o_train = pd.read_csv('./回归分析/train.csv')
o_test = pd.read_csv('./回归分析/test.csv')

all_features = pd.concat((o_train.loc[:, 'Area':'Neighborhood'], o_test.loc[:, 'Area':'Neighborhood']))
all_labels = pd.concat((o_train.loc[:, 'Price'], o_test.loc[:, 'Price']))

numeric_feats = all_features.dtypes[all_features.dtypes != 'object'].index
object_feats = all_features.dtypes[all_features.dtypes == 'object'].index

all_features[numeric_feats] = all_features[numeric_feats].apply(lambda x: (x-x.mean())/(x.std()))
all_features = pd.get_dummies(all_features, prefix=object_feats, dummy_na=True)
all_features = all_features.fillna(all_features.mean())

mean = all_labels.mean()
std = all_labels.std()
all_labels = (all_labels - mean)/std

num_train = o_train.shape[0]
train_features = all_features[:num_train].values.astype(np.float32)
test_features = all_features[num_train:].values.astype(np.float32)
train_labels = all_labels[:num_train].values.astype(np.float32)
test_labels = all_labels[num_train:].values.astype(np.float32)


train_features = torch.from_numpy(train_features)
train_labels = torch.from_numpy(train_labels).unsqueeze(1)

test_features = torch.from_numpy(test_features)
test_labels = torch.from_numpy(test_labels).unsqueeze(1)
train_set = TensorDataset(train_features, train_labels)
test_set = TensorDataset(test_features, test_labels)

train_data = DataLoader(dataset=train_set, batch_size=64, shuffle=True)
test_data = DataLoader(dataset=test_set, batch_size=64, shuffle=False)

class Net(torch.nn.Module):
    def __init__(self, n_feature, n_output):
        super(Net, self).__init__()
        self.layer1 = torch.nn.Linear(n_feature, 600)
        self.layer2 = torch.nn.Linear(600, 1200)
        self.layer3 = torch.nn.Linear(1200, n_output)

    def forward(self, x):
        x = self.layer1(x)
        x = torch.relu(x)
        x = self.layer2(x)
        x = torch.relu(x)
        x = self.layer3(x)
        return x

net = Net(44, 1)
optimizer = torch.optim.Adam(net.parameters(), lr=1e-4)
criterion = torch.nn.MSELoss()

losses = []
eval_losses = []

for i in range(100):
    train_loss = 0
    net.train()
    for tdata, tlabel in train_data:
        y_ = net(tdata)
        loss = criterion(y_, tlabel)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        train_loss = train_loss + loss.item()
    losses.append(train_loss/len(train_data))

    eval_loss = 0
    net.eval()
    for edata, elabel in test_data:
        y_ = net(edata)
        loss = criterion(y_, elabel)
        eval_loss = eval_loss + loss.item()
    eval_losses.append(eval_loss/len(test_data))
    print('训练次数:{},训练集损失:{},测试集损失:{}'.format(i, train_loss/len(train_data), eval_loss/len(test_data)))


y_ = net(test_features)
y_pre = y_ * std + mean
print('测试集预测值:{}'.format(y_pre.squeeze().detach().cpu().numpy()))

print('模型平均误差:{}'.format((abs(y_pre-(test_labels*std+mean)).mean().cpu().item())))
end = time.perf_counter()
print('模型运行时间:{}'.format(end-start))

二,效果


2024-08-21 10_27_31-.png

相关文章

网友评论

      本文标题:操练代码之回归分析

      本文链接:https://www.haomeiwen.com/subject/ryuvkjtx.html