Neuronales Netz zum Schätzen des Immobilienwerts


import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd


df = pd.read_csv("Hausdaten.csv")

X = torch.tensor(df[["mm2"]].values, dtype=torch.float32)
y = torch.tensor(df[["Price"]].values, dtype=torch.float32)

# 2. Neuronales Netz definieren
#    1 -> 16 -> 1 (Hidden Layer, ReLU)
model = nn.Sequential(
    nn.Linear(1, 16),
    nn.ReLU(),
    nn.Linear(16, 1)
)

# 3. Verlustfunktion & Optimierer
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1)

# 4. Training
epochs = 5000
for epoch in range(epochs):
    y_pred = model(X)
    loss = criterion(y_pred, y)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch % 50 == 0:
        print(f"Epoch {epoch}, Loss: {loss.item():.4f}")

# 5. Ergebnisse
with torch.no_grad():
    y_fit = model(X)

print(model[2].weight)
print(model[2].bias)

# 6. Plot
plt.xlabel("Wohnfläche mm 2")
plt.ylabel("Preis Haus")
plt.title("Immoblienpreise")
ax = plt.gca()
ax.ticklabel_format(style='plain', axis='y')
ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x, pos: f"{x:,.0f}".replace(",", ".")))
plt.scatter(X.numpy(), y.numpy(), label="Daten Häuser")
plt.plot(X.numpy(), y_fit.numpy(), color="red", label="Geschätzter Preis")
plt.legend()
plt.show()