2024-programowanie-w-python.../zajecia4/sklearn cz. 1.ipynb
2024-12-07 11:54:47 +01:00

11 KiB

Kkolejna część zajęć będzie wprowadzeniem do szeroko używanej biblioteki w Pythonie: sklearn. Zajęcia będą miały charaktere case-study poprzeplatane zadaniami do wykonania. Zacznijmy od załadowania odpowiednich bibliotek.

# ! pip install matplotlib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline

Zacznijmy od załadowania danych. Na dzisiejszych zajęciach będziemy korzystać z danych z portalu gapminder.org.

df = pd.read_csv('gapminder.csv', index_col=0)

Dane zawierają różne informacje z większość państw świata (z roku 2008). Poniżej znajduje się opis kolumn:

  • female_BMI - średnie BMI u kobiet
  • male_BMI - średnie BMI u mężczyzn
  • gdp - PKB na obywatela
  • population - wielkość populacji
  • under5mortality - wskaźnik śmiertelności dzieni pon. 5 roku życia (na 1000 urodzonych dzieci)
  • life_expectancy - średnia długość życia
  • fertility - wskaźnik dzietności

zad. 1 Na podstawie danych zawartych w df odpowiedz na następujące pytania:

  • Jaki był współczynniki dzietności w Polsce w 2018?
  • W którym kraju ludzie żyją najdłużej?
  • Z ilu krajów zostały zebrane dane?

zad. 2 Stwórz kolumnę gdp_log, która powstanie z kolumny gdp poprzez zastowanie funkcji log (logarytm).

Hint 1: Wykorzystaj funkcję apply (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html#pandas.Series.apply).

Hint 2: Wykorzystaj fukcję log z pakietu np.

Naszym zadaniem będzie oszacowanie długości życia (kolumna life_expectancy) na podstawie pozostałych zmiennych. Na samym początku, zastosujemy regresje jednowymiarową na fertility.

y = df['life_expectancy'].values
X = df['fertility'].values

print("Y shape:", y.shape)
print("X shape:", X.shape)

Będziemy korzystać z gotowej implementacji regreji liniowej z pakietu sklearn. Żeby móc wykorzystać, musimy napierw zmienić shape na dwuwymiarowy.

y = y.reshape(-1, 1)
X = X.reshape(-1, 1)

print("Y shape:", y.shape)
print("X shape:", X.shape)

Jeszcze przed właściwą analizą, narysujmy wykres i zobaczny czy istnieje "wizualny" związek pomiędzy kolumnami.

df.plot.scatter('fertility', 'life_expectancy')

zad. 3 Zaimportuj LinearRegression z pakietu sklearn.linear_model.

Tworzymy obiekt modelu regresji liniowej.

model = LinearRegression()

Trening modelu ogranicza się do wywołania metodu fit, która przyjmuje dwa argumenty:

model.fit(X, y)

Współczynniki modelu:

print("Wyraz wolny (bias):", model.intercept_)
print("Współczynniki cech:", model.coef_)

zad. 4 Wytrenuj nowy model model2, który będzie jako X przyjmie kolumnę gdp_log. Wyświetl parametry nowego modelu.

Mając wytrenowany model możemy wykorzystać go do predykcji. Wystarczy wywołać metodę predict.

X_test = X[:5,:]
y_test = y[:5,:]
output = model.predict(X_test)

for i in range(5):
    print("input: {}\t predicted: {}\t expected: {}".format(X_test[i,0], output[i,0], y_test[i,0]))

Sprawdzenie jakości modelu - metryki: $MSE$

Istnieją 3 metryki, które określają jak dobry jest nasz model:

from sklearn.metrics import mean_squared_error

rmse = np.sqrt(mean_squared_error(y, model.predict(X)))
print("Root Mean Squared Error: {}".format(rmse))
# Import necessary modules
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

# Create training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state=42)

# Create the regressor: reg_all
reg_all = LinearRegression()

# Fit the regressor to the training data
reg_all.fit(X_train, y_train)

# Predict on the test data: y_pred
y_pred = reg_all.predict(X_test)

# Compute and print R^2 and RMSE
print("R^2: {}".format(reg_all.score(X_test, y_test)))
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print("Root Mean Squared Error: {}".format(rmse))

Regresja wielu zmiennych

Model regresji liniowej wielu zmiennych nie różni się istotnie od modelu jednej zmiennej. Np. chcąc zbudować model oparty o dwie kolumny: fertility i gdp wystarczy zmienić X (cechy wejściowe):

X = df[['fertility', 'gdp']]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, random_state=42)

print(X.shape)

model_mv = LinearRegression()
model_mv.fit(X_train, y_train)

print("Wyraz wolny (bias):", model_mv.intercept_)
print("Współczynniki cech:", model_mv.coef_)

y_pred = model_mv.predict(X_test)

rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print("Root Mean Squared Error: {}".format(rmse))

zad. 6

  • Zbuduj model regresji liniowej, która oszacuje wartność kolumny life_expectancy na podstawie pozostałych kolumn.
  • Wyświetl współczynniki modelu.
  • Oblicz wartości metryki rmse na zbiorze trenującym.

zad. 7

Zaimplementuj metrykę $RMSE$ jako fukcję rmse (szablon poniżej). Fukcja rmse przyjmuje dwa parametry typu list i ma zwrócić wartość metryki $RMSE$ .

def rmse(expected, predicted):
    """
    argumenty:
    expected (type: list): poprawne wartości
    predicted (type: list): oszacowanie z modelu
    """
    pass
    

y = df['life_expectancy'].values
X = df[['fertility', 'gdp']].values

test_model = LinearRegression()
test_model.fit(X, y)

predicted = list(test_model.predict(X))
expected = list(y)

print(rmse(predicted,expected))
print(np.sqrt(mean_squared_error(predicted, expected)))