神经网络实例——波士顿房价预测(pytorch)

神经网络实例——波士顿房价预测

!!!个人主页:个人主页
!!!推荐一款模拟面试、刷题神器,从基础到大厂面试题:点击此处进入牛客网注册学习吧
!!!今日的努力,明日的未来

一、导入必要的包

import pandas as pd
import torch
from torch import nn
from torch.utils import data

二、导入必要的数据

train_data = pd.read_csv('../data/house_price_train.csv')
# 提取出特征值
all_features = train_data.iloc[:, 1:-1]
# 标准化数值特征,numeric_features是在统计数据类型不为“object”的数据的索引
numeric_features = all_features.dtypes[all_features.dtypes != 'object'].index
# ???
all_features[numeric_features] = all_features[numeric_features].apply(
    lambda x: (x - x.mean()) / (x.std()))
all_features[numeric_features] = all_features[numeric_features].fillna(0)
# pd.get_dummies是在用于特征提取,dummy_na=True即在填充NANS,增加一列
all_features = pd.get_dummies(all_features, dummy_na=True)
all_features.shape
# 最后数据就由原来的(1460, 331)变为了(1460, 81)

三、将数据转换为 tensor 格式

# 将数据转换为 tensor 格式
n_train = train_data.shape[0]
# 1460
# 接下来就是将adarray类型的数据转化为torch,float32
train_features = torch.tensor(all_features.values, dtype=torch.float32)
train_labels = torch.tensor(train_data.SalePrice.values.reshape(-1, 1), dtype=torch.float32)

四、构造一个pytorch数据迭代器

# 构造一个pytorch数据迭代器

n_train = train_data.shape[0]
batch_size = 64
# 对数据进行封装
dataset = data.TensorDataset(train_features, train_labels)
# 对数据进行加载,batch_size是批量取出时的样本量,并且读取是随机的
data_iter = data.DataLoader(dataset, batch_size, shuffle=True)
# 返回迭代器的下一个数据
next(iter(data_iter))


神经网络实例——波士顿房价预测(pytorch)_第1张图片

五、定义模型

# 定义模型
num_inputs = train_features.shape[1]
# 331
net = nn.Sequential(nn.Linear(num_inputs, 1))

#  Sequential类将多个层串联在一起。 当给定输入数据时,Sequential实例将数据传入到第一层, 然后将第一层的输出作为第二层的输入,以此类推。以实现一个线性层,nn.Linear()两个参数代表输入和输出的大小

六、初始化模型参数

# 初始化模型参数

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)
        nn.init.zeros_(m.bias)
net.apply(init_weights);
# nn.init.normal_就是按照正态分布对m.weight随赋值
# nn.init.zeros_(m.bias)就是使用常数0对m.bias赋值

七、定义损失函数

# 定义损失函数
loss = nn.MSELoss()
# 这是一个均方损失函数,loss(x,y) = (x-y)^2

八、定义优化算法

# 定义优化算法

trainer = torch.optim.SGD(net.parameters(), lr=0.02)
# torch.optim.SGD是随机梯度下降算法
# net.parameters()即要训练的参数
# ir:是指学习率即步长

九、训练模型

# 训练模型
num_epochs = 100
for epoch in range(num_epochs):
    for X, y in data_iter:
        trainer.zero_grad()
        l = loss(net(X) ,y)
        l.backward()
        trainer.step()
    with torch.no_grad():
        l = loss(net(train_features), train_labels)
        print(f'epoch {epoch + 1}, loss {l:f}')
# trainer.zero_grad()每一次backword之前,都要将梯度参数设置为0
# l即均方误差,.backward()进行反向传播
# 在每一个迭代周期里,我们都要器完整的遍历一遍数据集,不停的从中获取一个小批量的输入和相应的标签,对于每一个小批量,都会进行:
   # -通过调用net(X)生成预测并计算损失l(前向传播)。
   # -通过进行反向传播来计算梯度。
   # -通过调用优化器来更新模型参数。
# 然后为了更好的衡量训练效果,我们计算每个迭代周期后的损失,兵打印他来监督训练过程
net(train_features[10]), train_labels[10]

-通过调用优化器来更新模型参数。

然后为了更好的衡量训练效果,我们计算每个迭代周期后的损失,兵打印他来监督训练过程


```python
net(train_features[10]), train_labels[10]

你可能感兴趣的:(python,大数据与人工智能)