Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Lineaarinen Regressio | Osio
Pytorch-Osaamisen Perusteet ML-Insinöörille

bookLineaarinen Regressio

Käytämme todellista aineistoa lineaarisen regressiomallin toteuttamiseen PyTorchilla. Aineistossa on kaksi saraketta:

  • 'Number of Appliances': kodin laitteiden määrä (syöteominaisuus, X);
  • 'Electricity Bill': vastaava sähkölaskun summa (kohdearvo, Y).

1. Datan lataaminen ja tarkastelu

Aineisto on tallennettu CSV-tiedostoon. Lataamme sen pandas-kirjastolla ja tarkastelemme ensimmäisiä rivejä:

12345
import pandas as pd # Load the dataset bills_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_2/electricity_bills.csv') # Display the first five rows print(bills_df.head())
copy

2. Datan valmistelu PyTorchille

Seuraavaksi tulee erottaa syöte- (X) ja kohde- (Y) sarakkeet, muuntaa ne PyTorch-tensoreiksi ja muotoilla ne 2D-tensoreiksi yhteensopivuuden varmistamiseksi PyTorchin operaatioiden kanssa:

12345678910
import torch import pandas as pd # Load the dataset bills_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_2/electricity_bills.csv') # Extract input (Number of Appliances) and target (Electricity Bill) X = torch.tensor(bills_df['Number of Appliances'].values).float().reshape(-1, 1) Y = torch.tensor(bills_df['Electricity Bill'].values).float().reshape(-1, 1) # Print the shapes of X and Y print(f"Shape of X: {X.shape}") print(f"Shape of Y: {Y.shape}")
copy

3. Lineaarisen mallin määrittely

PyTorchin nn.Linear-moduuli määrittelee täysin yhdistetyn kerroksen, joka suorittaa laskennan y = xWT + b. Se on hermoverkkojen perusrakenneosa ja voidaan yhdistää muihin kerroksiin monimutkaisempien arkkitehtuurien luomiseksi.

Tärkeimmät parametrit ovat:

  • in_features: syöteominaisuuksien määrä (riippumattomat muuttujat);
  • out_features: ulostulo-ominaisuuksien määrä (ennustetut arvot).

Yksinkertaisessa lineaarisessa regressiossa, kuten tässä tapauksessa, ennustetaan yksi ulostulo perustuen yhteen syötteeseen. Tällöin:

  • in_features=1: yksi syötemuuttuja;
  • out_features=1: yksi ennustettu arvo.
import torch.nn as nn
# Define the linear regression model
model = nn.Linear(in_features=1, out_features=1)

4. Häviofunktion ja optimointialgoritmin määrittely

Käytämme keskineliövirhettä (MSE) häviöfunktiona ja stokastista gradienttilaskeutumista (SGD) optimointialgoritmina, jossa oppimisnopeus on 0.005.

MSE-häviö voidaan määritellä käyttämällä nn.MSELoss-luokkaa ja SGD käyttämällä vastaavaa luokkaa torch.optim-moduulista.

import torch.optim as optim
# Define the loss function (MSE)
loss_fn = nn.MSELoss()
# Define the optimizer (SGD)
optimizer = optim.SGD(model.parameters(), lr=0.005)

5. Mallin kouluttaminen

Koulutus sisältää eteenpäin suuntautuvan laskennan ja taaksepäin suuntautuvan laskennan suorittamisen määritellyn määrän epookkeja.

  • Eteenpäin suuntautuva laskenta: tässä vaiheessa lasketaan mallin ennusteet syötteen perusteella ja lasketaan häviö vertaamalla ennusteita todellisiin arvoihin;
  • Taaksepäin suuntautuva laskenta: tässä vaiheessa lasketaan gradientit takaisinkytkennän avulla (häviön perusteella) ja päivitetään mallin painot ja bias optimointialgoritmin avulla, joka tässä tapauksessa on SGD.

Tätä prosessia toistetaan määritellyn määrän epookkeja, jotta häviö minimoituu ja mallin suorituskyky paranee.

1234567891011121314151617181920212223242526272829303132333435
import torch import torch.nn as nn import torch.optim as optim import pandas as pd # Load the dataset bills_df = pd.read_csv('https://staging-content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_2/electricity_bills.csv') # Extract input (Number of Appliances) and target (Electricity Bill) X = torch.tensor(bills_df['Number of Appliances'].values).float().reshape(-1, 1) Y = torch.tensor(bills_df['Electricity Bill'].values).float().reshape(-1, 1) # Define the linear regression model model = nn.Linear(in_features=1, out_features=1) # Define the loss function (MSE) loss_fn = nn.MSELoss() # Define the optimizer (SGD) optimizer = optim.SGD(model.parameters(), lr=0.005) # Training loop epochs = 100 for epoch in range(epochs): # Forward pass Y_pred = model(X) loss = loss_fn(Y_pred, Y) # Backward pass optimizer.zero_grad() # Reset gradients loss.backward() # Compute gradients # Update parameters optimizer.step() if (epoch + 1) % 10 == 0: print(f"Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}") # Final parameters print(f"Trained weight: {model.weight.item()}") print(f"Trained bias: {model.bias.item()}")
copy

Mallin parametreihin, eli painoihin ja harhoihin, pääsee käsiksi käyttämällä .weight ja .bias attribuutteja:

weights = model.weight.item()
biases = model.bias.item()
Note
Huomio

optimizer.zero_grad() on tärkeä, koska se nollaa kaikkien parametrien gradientit ennen takaisinkuljetusta. Ilman tätä vaihetta gradientit kertyisivät edellisistä vaiheista, mikä johtaisi virheellisiin päivityksiin mallin painoissa. Tämä varmistaa, että jokainen taaksepäin suuntautuva vaihe alkaa puhtaalta pöydältä.

question mark

Mikä on nn.Linear-moduulin ensisijainen tarkoitus PyTorchissa lineaarisessa regressiossa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 13

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

bookLineaarinen Regressio

Pyyhkäise näyttääksesi valikon

Käytämme todellista aineistoa lineaarisen regressiomallin toteuttamiseen PyTorchilla. Aineistossa on kaksi saraketta:

  • 'Number of Appliances': kodin laitteiden määrä (syöteominaisuus, X);
  • 'Electricity Bill': vastaava sähkölaskun summa (kohdearvo, Y).

1. Datan lataaminen ja tarkastelu

Aineisto on tallennettu CSV-tiedostoon. Lataamme sen pandas-kirjastolla ja tarkastelemme ensimmäisiä rivejä:

12345
import pandas as pd # Load the dataset bills_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_2/electricity_bills.csv') # Display the first five rows print(bills_df.head())
copy

2. Datan valmistelu PyTorchille

Seuraavaksi tulee erottaa syöte- (X) ja kohde- (Y) sarakkeet, muuntaa ne PyTorch-tensoreiksi ja muotoilla ne 2D-tensoreiksi yhteensopivuuden varmistamiseksi PyTorchin operaatioiden kanssa:

12345678910
import torch import pandas as pd # Load the dataset bills_df = pd.read_csv('https://content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_2/electricity_bills.csv') # Extract input (Number of Appliances) and target (Electricity Bill) X = torch.tensor(bills_df['Number of Appliances'].values).float().reshape(-1, 1) Y = torch.tensor(bills_df['Electricity Bill'].values).float().reshape(-1, 1) # Print the shapes of X and Y print(f"Shape of X: {X.shape}") print(f"Shape of Y: {Y.shape}")
copy

3. Lineaarisen mallin määrittely

PyTorchin nn.Linear-moduuli määrittelee täysin yhdistetyn kerroksen, joka suorittaa laskennan y = xWT + b. Se on hermoverkkojen perusrakenneosa ja voidaan yhdistää muihin kerroksiin monimutkaisempien arkkitehtuurien luomiseksi.

Tärkeimmät parametrit ovat:

  • in_features: syöteominaisuuksien määrä (riippumattomat muuttujat);
  • out_features: ulostulo-ominaisuuksien määrä (ennustetut arvot).

Yksinkertaisessa lineaarisessa regressiossa, kuten tässä tapauksessa, ennustetaan yksi ulostulo perustuen yhteen syötteeseen. Tällöin:

  • in_features=1: yksi syötemuuttuja;
  • out_features=1: yksi ennustettu arvo.
import torch.nn as nn
# Define the linear regression model
model = nn.Linear(in_features=1, out_features=1)

4. Häviofunktion ja optimointialgoritmin määrittely

Käytämme keskineliövirhettä (MSE) häviöfunktiona ja stokastista gradienttilaskeutumista (SGD) optimointialgoritmina, jossa oppimisnopeus on 0.005.

MSE-häviö voidaan määritellä käyttämällä nn.MSELoss-luokkaa ja SGD käyttämällä vastaavaa luokkaa torch.optim-moduulista.

import torch.optim as optim
# Define the loss function (MSE)
loss_fn = nn.MSELoss()
# Define the optimizer (SGD)
optimizer = optim.SGD(model.parameters(), lr=0.005)

5. Mallin kouluttaminen

Koulutus sisältää eteenpäin suuntautuvan laskennan ja taaksepäin suuntautuvan laskennan suorittamisen määritellyn määrän epookkeja.

  • Eteenpäin suuntautuva laskenta: tässä vaiheessa lasketaan mallin ennusteet syötteen perusteella ja lasketaan häviö vertaamalla ennusteita todellisiin arvoihin;
  • Taaksepäin suuntautuva laskenta: tässä vaiheessa lasketaan gradientit takaisinkytkennän avulla (häviön perusteella) ja päivitetään mallin painot ja bias optimointialgoritmin avulla, joka tässä tapauksessa on SGD.

Tätä prosessia toistetaan määritellyn määrän epookkeja, jotta häviö minimoituu ja mallin suorituskyky paranee.

1234567891011121314151617181920212223242526272829303132333435
import torch import torch.nn as nn import torch.optim as optim import pandas as pd # Load the dataset bills_df = pd.read_csv('https://staging-content-media-cdn.codefinity.com/courses/1dd2b0f6-6ec0-40e6-a570-ed0ac2209666/section_2/electricity_bills.csv') # Extract input (Number of Appliances) and target (Electricity Bill) X = torch.tensor(bills_df['Number of Appliances'].values).float().reshape(-1, 1) Y = torch.tensor(bills_df['Electricity Bill'].values).float().reshape(-1, 1) # Define the linear regression model model = nn.Linear(in_features=1, out_features=1) # Define the loss function (MSE) loss_fn = nn.MSELoss() # Define the optimizer (SGD) optimizer = optim.SGD(model.parameters(), lr=0.005) # Training loop epochs = 100 for epoch in range(epochs): # Forward pass Y_pred = model(X) loss = loss_fn(Y_pred, Y) # Backward pass optimizer.zero_grad() # Reset gradients loss.backward() # Compute gradients # Update parameters optimizer.step() if (epoch + 1) % 10 == 0: print(f"Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}") # Final parameters print(f"Trained weight: {model.weight.item()}") print(f"Trained bias: {model.bias.item()}")
copy

Mallin parametreihin, eli painoihin ja harhoihin, pääsee käsiksi käyttämällä .weight ja .bias attribuutteja:

weights = model.weight.item()
biases = model.bias.item()
Note
Huomio

optimizer.zero_grad() on tärkeä, koska se nollaa kaikkien parametrien gradientit ennen takaisinkuljetusta. Ilman tätä vaihetta gradientit kertyisivät edellisistä vaiheista, mikä johtaisi virheellisiin päivityksiin mallin painoissa. Tämä varmistaa, että jokainen taaksepäin suuntautuva vaihe alkaa puhtaalta pöydältä.

question mark

Mikä on nn.Linear-moduulin ensisijainen tarkoitus PyTorchissa lineaarisessa regressiossa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 13
some-alt