otrnovec / PorcupAIne

Repository for the PLIN081 (Advanced ML Methods) course. More info about the course can be found here: https://is.muni.cz/auth/predmet/phil/podzim2024/PLIN081
1 stars 0 forks source link

comment on num_cat_model.ipynb #14

Open janmalyy opened 1 day ago

janmalyy commented 1 day ago

Ahoj, zkouším, jak funguje tahle funkce. Jestli to chápu dobře, nedá se komentovat kód, kterej není označený jako pull request, takže to udělám přes tyhle Issues.

Chtěl jsem si spustit ten kód, ale je tam error. Mohl bych to opravit, ale nechci ti do toho šahat, nevím, kterou variantu jsi chtěl. Jde o to, že pd.get_dummies spadne s KeyError, protože vybíráš sloupce, které v tom dataframu nejsou. Buď je potřeba vybírat ty s názvem končícím _codes, nebo do dataframu features přidat i ty původní.

from sklearn.preprocessing import MinMaxScaler

# Výběr rysů a cílové proměnné
features = data[['project_name', 'district_codes', 'year', 'budget', 'project_category_codes', 'status_codes', 'district_codes']]  # Nahraď názvy sloupců podle svých dat
print(features.columns)
target = data['support_status']  # Cílová proměnná

# Zpracování kategoriálních rysů
features = pd.get_dummies(features, columns=['project_category', 'district']) # ma se kodovat i project_name?

# Normalizace číselných rysů
scaler = MinMaxScaler()
features[['year', 'budget', 'project_category_codes', 'status_codes', 'district_codes']] = scaler.fit_transform(features[['year', 'budget', 'project_category_codes', 'status_codes', 'district_codes']])
janmalyy commented 1 day ago

hm... a taky bych upravil to, jak dělíš data na trénovací a testovací. máš tam X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42), což je fajn default funkce, ale my chceme trénovat na datech z roku 2017-2022, testovat při vyvíjení, tedy teď, na datech z roku 2023 a na data z roku 2024 zatím ještě vůbec nešahat. ty tam používáš všechny dohromady...

já jsem to dělil takto:

def split_train_val_test(dataframe):
    """
    Splits the PaRo dataset based on years.
    Train data are from 2017 to 2022, validation data are from 2023 and test data are from 2024
    @returns: train, val, test dataset in this order
    """
    return dataframe[(dataframe["year"] != 2023) & (dataframe["year"] != 2024)], dataframe[dataframe["year"] == 2023], dataframe[dataframe["year"] == 2024]

a pak teda ještě balancuju ten dataset takto

def balance_dataset(dataset: pd.DataFrame) -> pd.DataFrame:
    """
    Balance the dataset by randomly under-sampling class 1 to ensure each class has an equal amount of data.
    """
    only_1 = dataset[dataset["status"] == 1]
    sample_size = len(dataset[dataset["status"] == 0])
    random_same_length_only_1 = only_1.sample(n=sample_size)
    return pd.concat([random_same_length_only_1, dataset[dataset["status"] == 0]])

nebo místo tohoto undersamplování můžeš použít při tom grid search scoring=f1-score, tak nějak, prostě jiný než accuracy

janrygl commented 1 day ago

Technická poznámka:

Pokud byste chtěli současně mít možnost komentovat přímo do kódu a nekopírovat to, lze dočasně otevřít si novou větev z historického commitu (git log vám ukáže historii commitů, git checkout commitId vás na něj přepne, git checkout -b comparison_branch vám vytvoří historickou verzi, a pak git push a pull request z masteru/jiné větve do této větve vám ukáže rozdíly, které jdou komentovat).