全连接网络实现回归【房价预测的数据】

也是分为data,model,train,test

python 复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim


class FCNet(nn.Module):
    def __init__(self):
        super(FCNet,self).__init__()
        self.fc1 = nn.Linear(331,200)
        self.fc2 = nn.Linear(200,150)
        self.fc3 = nn.Linear(150,100)
        self.fc4 = nn.Linear(100,1)
        #因为是回归问题,所以输出是1
        
        
    def forward(self,x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = self.fc4(x)
        return x
    
    
class FCNet3(nn.Module):
    def __init__(self):
        super(FCNet3,self).__init__()
        self.fc1 = nn.Linear(331,200)
        self.fc2 = nn.Linear(200,100)
        self.fc3 = nn.Linear(100,1)
        
        
    def forward(self,x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x



# print(net)
python 复制代码
import pandas as pd
import os
import torch



# my_device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

if torch.cuda.is_available():
    my_device = torch.device('cuda')
else:
    my_device = torch.device('cpu')

training_data = pd.read_csv('./kaggle_house_pred_train.csv')
testing_data = pd.read_csv('./kaggle_house_pred_test.csv')

#拼在一起,方便后面统一处理
all_features = pd.concat(( training_data.iloc[:,1:-1], testing_data.iloc[:,1:]))
# print("train_data.shape:",training_data.shape)
# print("test_data.shape:",testing_data.shape)
# print("all_features:",all_features.shape)
# print(training_data.iloc[:5,:8])

#处理:把一些不是数值的那些特征值进行转换,并且归一化,还有就是把空值填充为0
numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index
# print(numeric_features)

all_features[numeric_features] = all_features[numeric_features].apply(lambda x: (x - x.mean()) / (x.std()))
#all_features[numeric_features] = all_features[numeric_features]
all_features[numeric_features] = all_features[numeric_features].fillna(0)

all_features = pd.get_dummies(all_features, dummy_na = True)
#df = all_features.to_csv('./newdata.csv')
print("all_features:",all_features)

#把数据分成训练数据和测试数据
n_train = training_data.shape[0]
#all_features = all_features.astype('float')
train_features = torch.tensor(all_features[:n_train].values, dtype = torch.float32)
test_features = torch.tensor(all_features[n_train:].values, dtype = torch.float32)
train_labels = torch.tensor(training_data.SalePrice.values.reshape(-1, 1), dtype = torch.float32)
print("train_features.shape:", train_features.shape)
print("test_features.shape:", test_features.shape)
print("train_labels:", train_labels.shape)
#保存转换之后的数据
new_train_data = pd.DataFrame(train_features.numpy()).to_csv('./train_data_normalization.csv')
new_train_labels = pd.DataFrame(train_labels.numpy()).to_csv('./train_labels_normal.csv')


train_dataset = torch.utils.data.TensorDataset(train_features,train_labels)
train_dataloadr = torch.utils.data.DataLoader(train_dataset,batch_size=32,shuffle = True,num_workers = 0,pin_memory = True)

#因为要测试 所有就没有真实标签了,dataloader也可以直接只放数据,后面测试时候就是inputs = data
test_dataset = torch.utils.data.TensorDataset(test_features)
test_dataloadr = torch.utils.data.DataLoader(test_dataset,batch_size=32,shuffle = True,num_workers = 0,pin_memory = True)

#print(len(train_dataloadr))
# print(len(test_dataloadr))
#print(train_labels)
python 复制代码
import torch
import torch.nn as nn
import torch.functional as F
import torch.optim as optim
from Model import FCNet
import data
import matplotlib.pyplot as plt


if torch.cuda.is_available():
    my_device = torch.device('cuda:0')
else:
    my_device = torch.device('cpu')

print(my_device)
net = FCNet().to(my_device)
#print(net)

criterion = nn.MSELoss()
optimizer = optim.Adam(net.parameters(),lr=0.0001)

epochs = 2000

def train(train_loader):
    train_loss = []
    for epoch in range(epochs):
        loss_sum = 0
        for i, data in enumerate(train_loader):
            inputs,labels = data
            print(data)
            inputs,labels = inputs.to(my_device),labels.to(my_device)
            optimizer.zero_grad()
            outputs = net(inputs)
            print('outputs=',outputs)
            print('labels=',labels)
            #因为是回归问题,所以直接放到loss中就可以了
            loss = criterion(outputs,labels)
            # print(loss.item())
            loss.backward()
            optimizer.step()
            loss_sum += loss.item()
            if i%32 == 31:
                print('Batch {}'.format(i+1),'Loss {}'.format(loss_sum/100))
        train_loss.append(loss_sum)
    torch.save(net.state_dict(),'./f4_weights_epoch2000.pth')
    plt.plot(range(epochs),train_loss)
    plt.show()
        
train(data.train_dataloadr)
python 复制代码
import pandas as pd
import data
import torch
from Model import FCNet


if torch.cuda.is_available():
    my_device = torch.device('cuda:0')
else:
    my_device = torch.device('cpu')
    

test_data = data.testing_data
test_features = data.test_features

def test(test_features):
    test_features = test_features.to(my_device)
    preds = net(test_features).detach().to('cpu').numpy()
    print(preds.squeeze().shape)
    
    test_data['SalePrice'] = pd.Series(preds.squeeze())
    return pd.concat([test_data['Id'],test_data['SalePrice']],axis=1)


net = FCNet().to(my_device)
net.load_state_dict(torch.load('./f4_weights_epoch2000.pth'))
res = test(test_features)
res.to_csv('./f4_test_res.csv',index=False)

预测结果还挺接近的

相关推荐
tellmewhoisi几秒前
机器学习:集成学习4(XGBoost 的API)
人工智能·机器学习·集成学习
只猪侠GGBond6 分钟前
从“会诊断”到“能验证”:AI FaultLab 的修复验证闭环设计
人工智能
m4Rk_16 分钟前
【论文阅读】Agent 记忆机制(81):EMR——用情景记忆避免 Agent 在多步推理中反复绕圈
论文阅读·人工智能·学习·开源·github
Zldaisy3d17 分钟前
中科院力学所完成太空增减材制造失重飞行试验
人工智能·制造
帝王铠18 分钟前
【AI】一些AI时代的想法闲聊
人工智能
szxinmai主板定制专家26 分钟前
RK3588+FPGA异构架构|高速数据采集+边缘AI落地应用全解析
人工智能·嵌入式硬件·fpga开发·架构·zynq
李福春1 小时前
降SpringAI阿里第1掌-亢龙有悔-识势选型
人工智能·架构·腾讯云架构师同盟
李航19831 小时前
给自己的图形引擎,配上了AI渲染,做设计真是太方便了
人工智能·python·计算机视觉·ai·ai编程
m0_466525291 小时前
数字认证参加第十四届用户体验大会,分享标准建设思路
大数据·人工智能·科技
康实训1 小时前
2026数字化AI智慧实训建设方案
大数据·人工智能·实训室·实训室建设