Import Required Libraries¶
import pandas as pd
import numpy as np
Load Dataset¶
data = {
'Outlook': ['Rainy', 'Rainy', 'Overcast', 'Sunny', 'Sunny', 'Sunny', 'Overcast', 'Rainy', 'Rainy', 'Sunny', 'Rainy', 'Overcast', 'Overcast', 'Sunny'],
'Temperature': ['Hot', 'Hot', 'Hot', 'Mild', 'Cool', 'Cool', 'Cool', 'Mild', 'Cool', 'Mild', 'Mild', 'Mild', 'Hot', 'Mild'],
'Humidity': ['High', 'High', 'High', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'Normal', 'Normal', 'High', 'Normal', 'High'],
'Windy': ['False', 'True', 'False', 'False', 'False', 'True', 'True', 'False', 'False', 'False', 'True', 'True', 'False', 'True'],
'Play': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No']
}
df = pd.DataFrame(data)
df
Task 1: Calculate Prior Probabilities¶
Funckia calculate_prior prijíma na vstupe:
- df: dataset
- target_col: názov cieľového atribútu
Upravte ju tak, aby jej výstupom bol dict obsahujúci apriórne pravdepodobnosti pre jednotlivé triedy cieľového atribútu.
def calculate_prior(df: pd.DataFrame, target_col: str) -> dict[str, float]:
class_counts = {cls: count for cls, count in df[target_col].value_counts().items()} # slovník s pármi trieda: početnosť
dataset_length = len(df) # dĺžka datasetu
prior = {} # Tuto vložiť výstupné pravdepodobnosti v pároch key: value (názov triedy: pravdepodobnosť)
# TODO: vypočítať pre každú triedu apriórnu pravdepodobnosť
return prior # napr. {"trieda1": 0.4, "trieda2": 0.6}
Task 2: Calculate Likelihood¶
Funkcia calculate_likelihood prijíma na vstupe:
- df: dataset
- feature_col: názov popisného atribútu
- feature_val: konkrétna hodnota atribútu feature_col
- target_col: názov cieľového atribútu
- target_val: trieda cieľového atribútu
Upravte ju tak, aby na výstupe vrátila podmienenú pravdepodobnosť výskytu danej hodnoty feature_val pri triede target_val.
Pozor! Podmienená pravdepodobnosť nemôže mať výslednú hodnotu 0, inak sa táto 0 v neskorších výpočtoch prenesie na celkový výsledok. Ako sa dá tejto situácii predísť?
def calculate_likelihood(df: pd.DataFrame, feature_col: str, feature_val: str, target_col, target_val) -> float:
df_target = df[df[target_col] == target_val] # záznamy datasetu, kde trieda == target_val
df_target_features = df_target[df_target[feature_col] == feature_val] # záznamy df_target, kde atribút feature_col == feature_val
likelihood = 0.0 # P(feature_val | target_val)
# TODO: vypočítať likelihood
return likelihood
Task 3: Calculate Posterior Probability¶
Funkcia calculate_posterior prijíma na vstupe:
- df: dataset
- X: dict obsahujúci popisné atribúty jedného záznamu (vo formáte {"atr1": "val1", "atr2": "val2"})
- target_col: názov cieľového atribútu
Upravte ju tak, aby jej výstupom bol dict obsahujúci výsledné pravdepodobnosti pre jednotlivé triedy cieľového atribútu.
def calculate_posterior(df: pd.DataFrame, X: dict[str, str], target_col: str) -> dict[str, float]:
prior = calculate_prior(df, target_col)
posteriors = {} # {class_label: posterior_score}
for cls in prior:
posteriors[cls] = 1
for feature_col, feature_val in X.items():
# TODO: pre každú triedu cieľového atribútu vypočítajte výslednú pravdepodobnosť
continue
return posteriors
Task 4: Predict¶
Funkcia predict prijíma na vstupe:
- df: dataset
- X: dict obsahujúci popisné atribúty jedného záznamu (vo formáte {"atr1": "val1", "atr2": "val2"})
- target_col: názov cieľového atribútu
Upravte ju tak, aby jej výstupom bol názov triedy s najvyššou výslednou pravdepodobnosťou.
def predict(df: pd.DataFrame, X: dict[str, str], target_col: str) -> str:
# TODO: vypočítať výsledné pravdepodobnosti pre vstupný záznam a vrátiť názov najpravdepodobnejšej triedy
# HINT: Pri dicte s formátom {"trieda": 0.6, "trieda2": 0.4} si viete pomôcť funkciou max(slovnik, key=slovnik.get)
return
Test Your Implementation¶
# Test sample: Sunny, Hot, Normal, False -> should predict Yes
test_sample = {'Outlook': 'Sunny', 'Temperature': 'Hot', 'Humidity': 'Normal', 'Windy': 'False'}
print("Prior probabilities:", calculate_prior(df, 'Play'))
print("Prediction:", predict(df, test_sample, 'Play'))