Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
ed:lab_08 [2024/04/09 14:23] pszwed [2.4 Zapisz zbiór z wynikami] |
ed:lab_08 [2024/04/24 23:20] (current) pszwed [4. LogisticRegressionGrid - tworzenie tabeli ocen] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
Celem jest budowa modelu regresji logistycznej pozwalającej przewidywać, | Celem jest budowa modelu regresji logistycznej pozwalającej przewidywać, | ||
Line 14: | Line 14: | ||
=== Zbiory danych === | === Zbiory danych === | ||
- | * {{ : | + | * {{ : |
* {{ : | * {{ : | ||
Line 88: | Line 88: | ||
</ | </ | ||
- | **2.** Regresja logistyczna wymaga, aby atrybutów wejściowe były typu numerycznego. | + | **2.** Regresja logistyczna wymaga, aby atrybutów wejściowe były typu numerycznego. |
* przekonwertuj datę za pomocą funkcji '' | * przekonwertuj datę za pomocą funkcji '' | ||
* Dodaj kolumnę '' | * Dodaj kolumnę '' | ||
Line 110: | Line 110: | ||
</ | </ | ||
- | ===== 2. Analiza | + | ===== 2. LogisticRegressionAnalysis - analiza |
==== 2.1 Budowa modelu i interpretacja współczynników ==== | ==== 2.1 Budowa modelu i interpretacja współczynników ==== | ||
Line 139: | Line 139: | ||
**3.** Zinterpretuj współczynniki równania regresji (napisz kod lub zamieść wykonane obliczenia). Pamiętaj, że timestamp jest wyrażony w sekundach. | **3.** Zinterpretuj współczynniki równania regresji (napisz kod lub zamieść wykonane obliczenia). Pamiętaj, że timestamp jest wyrażony w sekundach. | ||
- | Poniższe wyniki były wygenerowane | + | Poniższe wyniki były wygenerowane |
< | < | ||
Wzrost OcenaC o 1 zwiększa logit o 0.719097, a szanse zdania razy 2.052578 czyli o 105.257821% | Wzrost OcenaC o 1 zwiększa logit o 0.719097, a szanse zdania razy 2.052578 czyli o 105.257821% | ||
Line 240: | Line 240: | ||
Instrukcja '' | Instrukcja '' | ||
- | ===== 3. Ocena wyników ===== | + | ===== 3. LogisticRegressionScores - ocena wyników ===== |
- | Napisz funkcję | + | Napisz funkcję |
* dokona podziału na zbiór treningowy i testowy | * dokona podziału na zbiór treningowy i testowy | ||
Line 249: | Line 249: | ||
<code java> | <code java> | ||
- | static | + | static |
int splitSeed = 123; | int splitSeed = 123; | ||
Dataset< | Dataset< | ||
Line 263: | Line 263: | ||
LogisticRegressionModel lrModel = lr.fit(df_train); | LogisticRegressionModel lrModel = lr.fit(df_train); | ||
+ | ... | ||
+ | return lrModel; | ||
+ | } | ||
</ | </ | ||
- | ==== 3.1 Przeanalizujemy informacje zebrane | + | ==== 3.1 Analiza informacji zebranych |
<code java> | <code java> | ||
Line 283: | Line 285: | ||
{{ : | {{ : | ||
+ | |||
+ | |||
+ | **2.** Pobierz informacje o krzywej ROC. Możesz o niej przeczytać tu: [[https:// | ||
<code java> | <code java> | ||
+ | Dataset< | ||
+ | roc.show(); | ||
</ | </ | ||
+ | < | ||
+ | +--------------------+-------------------+ | ||
+ | | | ||
+ | +--------------------+-------------------+ | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | 0.0| 0.3076923076923077| | ||
+ | | | ||
+ | | | ||
+ | | 0.0| 0.4230769230769231| | ||
+ | | 0.0| 0.4807692307692308| | ||
+ | | | ||
+ | | 0.0| 0.5192307692307693| | ||
+ | | 0.0| 0.5576923076923077| | ||
+ | | 0.0| 0.5961538461538461| | ||
+ | |0.047619047619047616| 0.5961538461538461| | ||
+ | |0.047619047619047616| 0.6153846153846154| | ||
+ | |0.047619047619047616| 0.6730769230769231| | ||
+ | | 0.09523809523809523| 0.6730769230769231| | ||
+ | | 0.14285714285714285| 0.6923076923076923| | ||
+ | +--------------------+-------------------+ | ||
+ | </ | ||
+ | |||
+ | **3.** Wyświetl wykres ROC. Napisz odpowiednią funkcję | ||
<code java> | <code java> | ||
+ | static void plotROC(Dataset< | ||
</ | </ | ||
+ | Oczekiwany wynik: | ||
+ | {{ : | ||
<code java> | <code java> | ||
</ | </ | ||
+ | **3.** Wyświetl miary: | ||
+ | * Accuracy | ||
+ | * FPR | ||
+ | * TPR | ||
+ | * Precision | ||
+ | * Recall | ||
+ | * F-measure | ||
+ | ==== 3.2 Dobór progu prawdopodobieństwa ==== | ||
+ | |||
+ | Krzywą ROC można wykorzystać do doboru progu prawdopodobieństwa. Patrz [[https:// | ||
+ | |||
+ | **1.** Dobierzemy próg według miary // | ||
<code java> | <code java> | ||
+ | Dataset< | ||
+ | df_fmeasures.offset(35).show(); | ||
</ | </ | ||
+ | < | ||
+ | +-------------------+------------------+ | ||
+ | | threshold| | ||
+ | +-------------------+------------------+ | ||
+ | | 0.4627032508959811|0.8869565217391304| | ||
+ | | 0.4382847817892507|0.8793103448275861| | ||
+ | | 0.4034706528697256| 0.888888888888889| | ||
+ | | 0.3858997834933381|0.8813559322033898| | ||
+ | | 0.3461380134069699| 0.859504132231405| | ||
+ | | 0.3143853597224281|0.8524590163934427| | ||
+ | |0.19135299955580787|0.8455284552845529| | ||
+ | | 0.1472470120383692|0.8387096774193548| | ||
+ | |0.13010893832947723| | ||
+ | +-------------------+------------------+ | ||
+ | </ | ||
+ | **2.** Wyznacz programowo najlepszy próg. | ||
+ | * Wpierw wyznacz maksymalną wartość F-measure (przykład kodu poniżej) | ||
+ | * A następnie odpowiadającą jej wartość progu (używając '' | ||
+ | * W powyższej tabelce możesz sprawdzić, czy znalezione zostały właściwe wartości (oczywiście one zależą od sposobu podziału na zbiór treningowy i testowy, a więc ziarna '' | ||
+ | |||
+ | <code java> | ||
+ | double maxFMeasure = df_fmeasures.select(functions.max(" | ||
+ | </ | ||
+ | |||
+ | **3.** Ustaw próg klasyfikatora | ||
+ | |||
+ | <code java> | ||
+ | lrModel.setThreshold(bestThreshold); | ||
+ | </ | ||
+ | |||
+ | ==== 3.3 Ewaluacja na zbiorze testowym ==== | ||
+ | |||
+ | **1.** Wywołaj funkcję predykcji i skonfiguruj ewaluator | ||
+ | |||
+ | <code java> | ||
+ | Dataset< | ||
+ | |||
+ | MulticlassClassificationEvaluator eval = new MulticlassClassificationEvaluator() | ||
+ | .setLabelCol(" | ||
+ | .setPredictionCol(" | ||
+ | </ | ||
+ | |||
+ | **2.** Wyznacz: | ||
+ | * accuracy | ||
+ | * weightedPrecision | ||
+ | * weightedRecall | ||
+ | * f1 | ||
+ | |||
+ | Oczekiwane są wartości rzędu 0.82-0.83 | ||
+ | |||
+ | Nazwy dostępnych metryk: | ||
+ | < | ||
+ | (f1|accuracy|weightedPrecision|weightedRecall|weightedTruePositiveRate| weightedFalsePositiveRate|weightedFMeasure|truePositiveRateByLabel| falsePositiveRateByLabel|precisionByLabel|recallByLabel|fMeasureByLabel| logLoss|hammingLoss)' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== 4. LogisticRegressionGrid - tworzenie tabeli ocen ===== | ||
+ | |||
+ | Celem jest utworzenie tabeli ocen postaci, jak poniżej | ||
+ | |||
+ | < | ||
+ | +--------------+------+----------+--------+--------+ | ||
+ | | ImieNazwisko|OcenaC| | ||
+ | +--------------+------+----------+--------+--------+ | ||
+ | |' | ||
+ | |' | ||
+ | |' | ||
+ | |' | ||
+ | |' | ||
+ | |' | ||
+ | |' | ||
+ | |' | ||
+ | |' | ||
+ | |' | ||
+ | |||
+ | ... | ||
+ | </ | ||
+ | |||
+ | **Uwaga:** wynik może się nieco różnić w zależności od konfiguracji, | ||
+ | |||
+ | **1.** Wytrenuj klasyfikator na zbiorze '' | ||
+ | |||
+ | **2.** Napisz funkcje | ||
+ | |||
+ | <code java> | ||
+ | void addClassificationToGrid(SparkSession spark, LogisticRegressionModel lrModel) | ||
+ | </ | ||
+ | która: | ||
+ | * Wczyta zbiór danych '' | ||
+ | * Przetworzy daty, tak aby stały się wartościami numerycznymi | ||
+ | * Skonfiguruje VectorAssembler | ||
+ | * Wywoła funkcję predykcji zmiennej '' | ||
+ | * Usunie nadmiarowe kolumny | ||
+ | * Za pomocą funkcji '' | ||
+ | * Wyświetli wynik | ||
+ | * Zapisze w pliku '' |