pytorch之线性回归第一关
时间: 2023-07-03 21:08:57 浏览: 112
好的,让我们开始第一关线性回归。在这个任务中,我们将使用PyTorch来实现一个简单的线性回归模型,以预测房价。首先,我们需要加载数据集并进行预处理。
```python
import torch
import torch.nn as nn
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
# 加载数据集
data = pd.read_csv('house_prices.csv')
x = data.iloc[:, :-1].values
y = data.iloc[:, -1:].values
# 特征缩放
scaler = MinMaxScaler(feature_range=(-1, 1))
x = scaler.fit_transform(x)
y = scaler.fit_transform(y)
# 转换为张量
x = torch.from_numpy(x).float()
y = torch.from_numpy(y).float()
print(x.shape)
print(y.shape)
```
我们首先使用Pandas加载数据集,然后将特征和标签分别存储在`x`和`y`变量中。接下来,我们使用`MinMaxScaler`对特征和标签进行缩放,以将它们归一化到`-1`到`1`之间。最后,我们将数据转换为PyTorch张量。
接下来,我们需要定义模型。在这个任务中,我们将使用一个简单的线性模型,它只有一个输入和一个输出。
```python
# 定义模型
class LinearRegression(nn.Module):
def __init__(self, input_dim, output_dim):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(input_dim, output_dim)
def forward(self, x):
out = self.linear(x)
return out
input_dim = x.shape[1]
output_dim = y.shape[1]
model = LinearRegression(input_dim, output_dim)
```
在这里,我们定义了一个名为`LinearRegression`的类,并继承了`nn.Module`。我们在类的构造函数中定义了一个线性层,它将输入特征映射到输出标签。在前向传递方法中,我们将输入`x`传递到线性层中,并返回输出`out`。
最后,我们需要定义损失函数和优化器。
```python
# 损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
```
我们使用均方误差作为损失函数,并使用随机梯度下降作为优化器。
现在我们已经完成了第一关,让我们训练模型并查看结果。
```python
# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
# 前向传播
outputs = model(x)
loss = criterion(outputs, y)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1) % 100 == 0:
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
# 预测结果
predicted = model(x).detach().numpy()
predicted = scaler.inverse_transform(predicted)
# 显示结果
import matplotlib.pyplot as plt
plt.plot(y, label='True')
plt.plot(predicted, label='Predicted')
plt.legend()
plt.show()
```
在这里,我们使用了一个简单的循环来迭代模型。对于每个epoch,我们先进行前向传播,然后计算损失并进行反向传播和优化。最后,我们将预测结果反缩放并将其可视化。
恭喜你完成了第一关线性回归!
阅读全文