8  Generatívne metódy klasifikácie

8.1 Úvod

  • Diskriminačné metódy ako napr. logistická regresia modelujú podmienenú pravdepodobnosť Pr[Y=y|\vec X= \mathbf{x}] priamo.

  • Generatívne metódy idú na problém nepriamo:

    1. Najprv sa modeluje rozdelenie vysvetľujúcich premenných \vec X=(X_1,X_2,\ldots,X_p) zvlášť pre každú hodnotu odozvy Y.
    2. Pomocou Bayesovej vety sa potom konvertuje na podmienené rozdelenie odozvy.
  • Ak je rozdelenie \vec X normálne, oba prístupy dávajú veľmi podobný výsledok, generatívny je však

    • s menším počtom údajov presnejší,
    • pri dokonalej separácii hodnôt netrpí nestabilitou odhadu parametrov (tak ako logistická regresia).
  • Generatívny prístup je jednoducho a prirodzene rozšíriteľný na viac ako 2 triedy.

  • Nech

    • odozva Y je kvalitatívna (nominálna alebo ordinálna) premenná s oborom hodnôt \mathcal H(Y)=\{c_1,\ldots,c_K\}, kde K\geq2,
    • \pi_k je pravdepodobnosť, že náhodne zvolené pozorovanie patrí do triedy k, teda Pr[Y=c_k]. V bayesovskom kontexte sa nazýva apriórnou.
    • Funkcia f_k bude označovať
      • (v prípade vektora diskrétnych náhodných premenných \vec X) pravdepodobnostnú funkciu, f_k(\mathbf{x})= Pr[\vec X = \mathbf{x}|Y=c_k],
      • (v spojitom prípade) hustotu pravdepodobnosti, čiže f_k(\mathbf{x})dx_1dx_2\ldots dx_p= Pr[\vec X=\mathbf{x}|Y=c_k],
      takže bude nadobúdať veľké hodnoty, ak pre pozorovanie z k-tej triedy bude \vec X\approx\mathbf{x}, a naopak, malé, ak hodnoty \vec X sú ďaleko od \mathbf{x}.
  • Potom podľa Bayesovej vety platí vzťah pre pravdepodobnosť, že pozorovanie \vec X=\mathbf{x} patrí do k-tej triedy, Pr[Y=c_k|\vec X=\mathbf{x}] = \frac{\pi_k f_k(\mathbf{x})}{\sum_{\ell=1}^K \pi_\ell f_\ell(\mathbf{x})}. Nazýva sa aj aposteriórnou pravdepodobnosťou.

  • To znamená, že namiesto priameho odhadu Pr[Y=c_k|\vec X=\mathbf{x}] (ako pri diskriminatívnom prístupe) nám stačí odhadnúť \pi_k, f_k a dosadiť do vzťahu.

    • Odhad apriórnej pravdepodobnosti je jednoducho iba relatívna početnosť (podiel počtu pozorovaní v konkrétnej skupine ku počtu všetkých), teda \pi_k=\frac{n_k}{n}.
    • Odhad hustoty f_k je však už náročnejší, a aby sa dal rozumne rýchlo vypočítať, budeme potrebovať zjednodušujúce predpoklady.
  • V nasledujúcom si preberieme tri (generatívne) klasifikátory, ktoré používajú rôzne odhady hustoty f_k.

8.2 Lineárna diskriminačná analýza

8.2.1 Jeden prediktor

  • V lineárnej diskriminačnej analýze (LDA) predpokladáme, že f_k je hustota normálneho rozdelenia, f_k(x) = \frac{1}{\sqrt{2\pi}\sigma_k}\exp\left(-\frac{(x-\mu_k)^2}{2\sigma_k^2}\right), kde \mu_k a \sigma_k^2 sú stredná hodnota a rozptyl prediktoru X v k-tej triede.

  • Ďalej predpokladáme, že \sigma_1=\ldots=\sigma_K=\sigma.

  • Po dosadení takto špecifikovanej hustoty do Bayesovej vety dostávame Pr[Y=c_k|X=x] = \frac{\pi_k \frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu_k)^2}{2\sigma^2}\right)}{\sum_{\ell=1}^K \pi_\ell \frac{1}{\sqrt{2\pi}\sigma}\exp\left(-\frac{(x-\mu_\ell)^2}{2\sigma^2}\right)}.

  • Keďže (bayesovský) klasifikátor zaradí pozorovanie X=x do tej triedy, ktorej zodpovedá najvyššia aposteriórna pravdepodobnosť, stačí pravdepodobnosť nahradiť jednoduchšou funkciou. Tou je tzv. diskriminačná funkcia \delta_k. Vznikne logaritmovaním vzťahu pre Pr[Y=c_k|X=x] a vynechaním členov spoločných pre všetky triedy, takže proporcionalita medzi skupinami zostáva zachovaná, \delta_k(x) \propto Pr[Y=c_k|X=x]. Po úpravách dostávame \delta_k(x) = x\frac{\mu_k}{\sigma^2} - \frac{\mu_k^2}{2\sigma^2} + \ln\pi_k. Diskriminačná funkcia je lineárna v premennej x, čo vysvetľuje názov metódy.

  • Parametre skutočného rozdelenia sotvakedy poznáme. Najlepšie odhady, čo máme, sú výberový priemer a (vážený) rozptyl \begin{split} \hat\mu_k &= \frac1{n_k}\sum_{i:\ y_i=c_k}x_i\ , \\ \hat\sigma^2 &= \frac1{n-K}\sum_{k=1}^K\ \sum_{i:\ y_i=c_k}(x_i-\hat\mu_k)^2=\frac1{n-K}\sum_{k=1}^K(n_k-1)\sigma_k^2\ . \end{split}

Ilustrácia (LDA)
  • Pre K=2 a \pi_1=\pi_2, z rovnice \delta_1(x)=\delta_2(x) dostaneme intuitívnu hranicu (decision boundary) medzi triedami v bode x=\frac{\mu_1+\mu_2}{2}.
  • Teoretická hodnota rozhodovacej hranice pre rozdelenia N(-1.25,1^2) a N(1.25,1^2) je teda nula.
Kód
pars <- list(list(mean=-1.25, sd=1),
             list(mean=1.25, sd=1))

ggplot() + 
  geom_function(fun = dnorm, args = pars[[1]], color = 2, linewidth = 1.5) +
  geom_function(fun = dnorm, args = pars[[2]], color = 4, linewidth = 1.5) +
  geom_vline(xintercept = 0, linetype=2) +
  xlab("x") + ylab("f(x)") +
  xlim(-5, 5)

  • Odhad hranice bude závisieť od náhodného výberu z rozdelení.
Kód
# data
set.seed(4)
dat <- list("k=1" = data.frame(x = rnorm(20, mean = pars[[1]]$mean, sd = pars[[1]]$sd)),
            "k=2" = data.frame(x = rnorm(20, mean = pars[[2]]$mean, sd = pars[[2]]$sd))
           ) |> 
  dplyr::bind_rows(.id = "class")
# súhrny
tmp1 <- dat |> 
  dplyr::group_by(class) |> 
  dplyr::summarise(mu = mean(x),
                   s2 = var(x),
                   n = dplyr::n()
                   ) |> 
  dplyr::ungroup()
tmp2 <- tmp1 |> 
  dplyr::summarise(mu = weighted.mean(mu, w = n),
                   s2 = weighted.mean(s2, w = n-1), # pooled variance
                   n = sum(n)
                   )
# priesečník
tmp2$boundary <- tmp2$mu - diff(log(tmp1$n/tmp2$n)) * tmp2$s2 / diff(tmp1$mu)

# report
dplyr::full_join(tmp1, rbind(tmp2), dplyr::join_by(mu, s2, n)) |> 
  pander::pander()
class mu s2 n boundary
k=1 -0.8737 0.6421 20 NA
k=2 1.556 0.8149 20 NA
NA 0.3411 0.7285 40 0.3411
Kód
# graf vyhladenej empirickej hustoty
dat |> 
  ggplot() + aes(x = x, fill = class) +
  geom_density(alpha = 0.5, adjust = 1.5) +
  geom_vline(xintercept = tmp2$boundary, linetype = 3)
# graf diskriminačných funkcií
LDfun <- Vectorize(
  function(x, mu, s2, pi) x * mu/s2 - mu^2/(2*s2) + log(pi),
  vectorize.args = "x")
xgrid <- c(-3,3)
LDfun(xgrid, mu = tmp1$mu, s2 = tmp2$s2, pi = tmp1$n/tmp2$n) |> 
  t() |> as.data.frame() |> setNames(tmp1$class) |> 
  cbind(x = xgrid) |> 
  tidyr::pivot_longer(-x, names_to = "class", values_to = "delta") |> 
  ggplot() + aes(x = x, y = delta, group = class, color = class) + geom_line() +
  geom_vline(xintercept = tmp2$boundary, linetype = 3)

8.2.2 Viac prediktorov

  • Rozšírenie modelu o ďalšie vysvetľujúce premenné so sebou prináša zahrnutie predpokladov nielen o ich marginálnom ale aj o ich združenom rozdelení pravdepodobnosti.
  • LDA predpokladá združené normálne rozdelenie, ktoré v sebe implicitne obsahuje aj normálne marginálne rozdelenia.
  • Nech \vec{X}=(X_1,\ldots,X_p) je náhodný vektor vysvetľujúcich premenných. Potom jeho rozdelenie pre Y=c_k je formálne \vec{X}\sim N(\boldsymbol{\mu}_k,\mathbf{\Sigma}) s hustotou definovanou vzťahom f_k(\mathbf{x})=\frac1{(2\pi)^{p/2}|\mathbf{\Sigma}|^{1/2}}\exp\left(-\frac12(\mathbf{x}-\boldsymbol{\mu}_k)^T\mathbf{\Sigma}^{-1}(\mathbf{x}-\boldsymbol{\mu}_k)\right), kde parameter
    • \boldsymbol{\mu}_k=E[\vec{X}|Y=c_k] je vektor stredných hodnôt a
    • \mathbf{\Sigma}=cov[\vec{X}|Y=c_1]=\ldots=cov[\vec{X}|Y=c_K] je p\times p kovariančná matica.
Ilustrácia (2D normálne rozdelenie)
  • Príklad hustoty dvojrozmerného združeného normálneho rozdelenia s identickými varianciami a
    • diagonálnou kovariančnou maticou (na obrázku vľavo),
    • kladnou kovarianciou (vpravo).

  • Diskriminačná funkcia potom nadobudne tvar \delta_k(\mathbf{x}) = \mathbf{x}^T\mathbf{\Sigma}^{-1}\boldsymbol{\mu}_k - \frac12\boldsymbol{\mu}_k^T\mathbf{\Sigma}^{-1}\boldsymbol{\mu}_k + \ln\pi_k
Ilustrácia (LDA)
  • Príklad pre 3 triedy a 2 prediktory so strednými hodnotami \boldsymbol{\mu}_1=(1,2.5)^T, \boldsymbol{\mu}_2=(2.5,1)^T, \boldsymbol{\mu}_3=(-1.25,-1.25)^T a kovariančnou maticou \mathbf{\Sigma}=\begin{pmatrix} 1 & 0.5 \\ 0.5 & 1 \end{pmatrix}. Z každého rozdelenia pochádza 20 pozorovaní, čiarkované sú teoretické rozhodovacie hranice, plné sú určené na základe pozorovaní.

8.3 Kvadratická diskriminačná analýza

  • Kvadratická diskriminačná analýza, QDA, zovšeobecňuje LDA v tom, že umožňuje každej skupine mať vlastnú kovariančnú maticu \mathbf{\Sigma}_k=cov[\vec{X}|Y=c_k], takže (\vec X|Y=c_k)\sim N(\boldsymbol{\mu}_k,\mathbf{\Sigma}_k).
  • V dôsledku toho má diskriminačná funkcia tvar \begin{split} \delta_k(\mathbf{x}) &= -\frac12(\mathbf{x}-\boldsymbol{\mu}_k)^T\mathbf{\Sigma}_k^{-1}(\mathbf{x}-\boldsymbol{\mu}_k) - \frac12\ln|\mathbf{\Sigma}_k^{-1}| + \ln\pi_k \\ &= -\frac12 \mathbf{x}^T\mathbf{\Sigma}_k^{-1}\mathbf{x} + \mathbf{x}^T\mathbf{\Sigma}_k^{-1}\boldsymbol{\mu}_k - \frac12 \boldsymbol{\mu}_k^T\mathbf{\Sigma}_k^{-1}\boldsymbol{\mu}_k - \frac12\ln|\mathbf{\Sigma}_k^{-1}| + \ln\pi_k \end{split} čiže je kvadratickou funkciou argumentu x.
  • Pri QDA treba odhadnúť Kp(p+1) parametrov, zatiaľčo pri LDA iba Kp parametrov. Voľba medzi nimi je často otázkou bias-variance kompromisu.
  • Zhruba sa však dá povedať, že LDA zvolíme pri menšom počte dát, kedy je dôležité redukovať rozptyl modelu. Naproti tomu QDA sa odporúča pri veľkej trénovacej vzorke (takže rozptyl modelu nie je veľký problém), alebo vtedy, keď je zjavný rozdiel medzi kovariančnými maticami v jednotlivých triedach.
Ilustrácia (LDA, QDA)
  • Príklad s 2 triedami a 2 prediktormi: čiarkovanou fialovou je skutočná hranica medzi triedami, bodkovanou čiernou LDA a plnou zelenou QDA rozhodovacia hranica. Všimnime si rozdiel v tvare/orientácii mraku bodov na pravom obrázku.

8.4 Naivný Bayesov klasifikátor

  • Namiesto predpokladu, že združená hustota f_k je z konkrétnej parametrickej triedy (z normálneho rozdelenia v prípade diskriminačnej analýzy), naivný Bayesov klasifikátor predpokladá iba nezávislosť prediktorov X_1,\ldots,X_p, čiže f_k(\mathbf{x}) = f_{k1}(x_1)\cdot f_{k2}(x_2)\cdot\ldots\cdot f_{kp}(x_p) kde f_{kj} je hustota rozdelenia premennej X_j ak Y=c_k.
  • To znamená, že už netreba odhadovať parametre združeného rozdelenia zodpovedné za vzťahy medzi prediktormi (v prípade normálneho rozdelenia to boli kovariancie).
  • Nezávislosti prediktorov samozrejme veľmi neveríme, preto názov naivný, no tento predpoklad slúži na uľahčenie výpočtu a často vedie k slušným výsledkom. Voľba je opäť otázkou bias-variance kompromisu.
  • Odhad f_{kj} závisí od typu premennej, máme niekoľko možností.
    • Ak je X_j kvantitatívna, potom môžeme predpokladať normalitu (X_j|Y=c_k)\sim N(\mu_{kj},\sigma_{kj}^2). Vtedy je to špeciálny prípad QDA s diagonálnymi kovariančnými maticami. Namiesto normálneho však môžeme predpokladať akékoľvek iné parametrické, spojité rozdelenie.
    • Ak je X_j kvantitatívna, ale nechceme model viazať predpokladom o parametrickej triede rozdelenia, môžeme použiť histogram alebo jadrový odhad hustoty.
    • Ak je X_j kvalitatívna, potom nám stačí rozdelenie odhadnúť relatívnou početnosťou v skupinách.

8.5 Geometrický pohľad na LDA

8.5.1 Hľadanie vhodného podpriestoru

8.5.1.1 Problém

  • Klasifikačný problém sa dá riešiť aj geometricky. Je základom špeciálneho prípadu LDA, ktorý sa volá Kanonická diskriminačná analýza (canonical discrimination analysis, CDA). Vyžaduje rovnaké apriórne pravdepodobnosti aj kovariančné matice naprieč skupinami.
  • Pre jednoduchosť majme dva prediktory X_1,X_2 a trojhodnotovú odozvu Y (t.j. 3 skupiny).
  • Z prieskumného/popisného hľadiska hľadáme taký podpriestor, v ktorom by boli skupiny dobre rozlíšiteľné.
  • Projekcia na jednu či druhú os nie je vo všeobecnosti najlepšia.

  • Hľadáme takú os (sprostredkovanú takým vektorom \mathbf{u}), že lineárna kombinácia Z=u_1X_1 + u_2X_2 pomôže skupiny oddeliť najlepšie

8.5.1.2 Rozptyl v skupinách a medzi skupinami

  • Celková variancia sa dá rozložiť na varianciu vo vnútri skupín (angl. within) a varianciu medzi skupinami (angl. between): \mathbf{V} = \mathbf{W} + \mathbf{B} kde
    • celková variancia je daná vzťahom \mathbf{V}=\frac1{n-1}\mathbf{X}^T\mathbf{X},
    • variancia vo vnútri skupín sa skladá z jednotlivých variančných matíc, \mathbf{W}=\sum_{k=1}^K\frac{n_k-1}{n-1}\mathbf{W}_k pričom \mathbf{W}_k=\frac1{n_k-1}\mathbf{X}_k^T\mathbf{X}_k,
    • variancia medzi skupinami vyjadruje variabilitu centroidov \mathbf{g}_k jednotlivých skupín okolo globálneho centroidu (ťažiska) \mathbf{g}, takže platí \mathbf{B}=\sum_{k=1}^K\frac{n_k}{n-1}(\mathbf{g}_k-\mathbf{g})(\mathbf{g}_k-\mathbf{g})^T kde \mathbf{g}=\sum_{k=1}^K\frac{n_k}{n} \mathbf{g}_k, a \mathbf{g}_k=(\bar{x}_{k1},\ldots,\bar{x}_{kp})^T, pričom \bar{x}_{kj} je priemer j-tej premennej v k-tej skupine.

8.5.1.3 Reformulácia problému

  • Z rozkladu celkovej variancie dostávame aj rozklad kvadratickej formy \mathbf{u}^T\mathbf{V}\mathbf{u} = \mathbf{u}^T\mathbf{W}\mathbf{u} + \mathbf{u}^T\mathbf{B}\mathbf{u}
  • Algebraicky, hľadáme takú lineárnu kombináciu prediktorov, ktorá (ideálne)
    • minimalizuje rozptyl vo vnútri skupín: \min\{\mathbf{u}^T\mathbf{W}\mathbf{u}\}
    • maximalizuje rozptyl medzi skupinami: \max\{\mathbf{u}^T\mathbf{B}\mathbf{u}\}

  • To je však (vo všeobecnosti) nemožné dosiahnuť súčasne.

  • Východiskom z patovej situáce je kompromis.

8.5.1.4 Kompromisné kritérium

  • Sú dve možnosti:
    • korelačný pomer \max\left\{\frac{\mathbf{u}^T\mathbf{B}\mathbf{u}}{\mathbf{u}^T\mathbf{V}\mathbf{u}}\right\}
    • F-pomer \max\left\{\frac{\mathbf{u}^T\mathbf{B}\mathbf{u}}{\mathbf{u}^T\mathbf{W}\mathbf{u}}\right\}
  • Oba optimalizačné problémy sa riešia rovnako, ukážeme si prvý z nich.
  • Najprv je výhodné zaviesť normalizačné obmedzenie \mathbf{u}^T\mathbf{V}\mathbf{u}=1. Problém sa zmení na hľadanie extrému funkcie s podmienkou, a to metódou Lagrangeových multiplikátorov,

\begin{split} L(\mathbf{u}) = \mathbf{u}^T\mathbf{B}\mathbf{u} - \lambda(\mathbf{u}^T\mathbf{V}\mathbf{u}-1) & \\ \frac{\partial L(\mathbf{u})}{\partial \mathbf{u}} = 2\mathbf{B}\mathbf{u} - 2\lambda\mathbf{V}\mathbf{u} \qquad\qquad & \\ \qquad\qquad 2\mathbf{B}\hat{\mathbf{u}} - 2\lambda\mathbf{V}\hat{\mathbf{u}} & = 0 \\ \mathbf{B}\mathbf{u} & = \lambda\mathbf{V}\mathbf{u} \\ \mathbf{V}^{-1}\mathbf{B}\mathbf{u} & = \lambda\mathbf{u} \end{split} takže náš hľadaný optimálny vektor \mathbf{u} je vlastný vektor matice \mathbf{V}^{-1}\mathbf{B}.
(Pre detaily riešenia problému zovšeobecnených vlastných čísel pozri Ghojogh et al., 2022.)

8.5.1.5 Šikmá projekcia

  • Princíp hľadania vhodného podpriestoru využíva aj tzv. analýza hlavných komponentov (angl. principal component analysis, PCA), čo je metóda učenia bez asistencie. Hľadá takú lineárnu transformáciu, aby osi boli orientované v smere postupne od najväčšieho rozptylu údajov až po najmenší rozptyl.
  • Diskriminačná analýza môže v špeciálnom prípade pripomínať PCA vykonanú na centroidoch, avšak na rozdiel od nej, diskriminačná analýza body jednotlivých pozorovaní zobrazuje na osi šikmo, v smere hlavnej poloosi elipsoidu spoľahlivosti, čiže v smere vektora \mathbf{u}.

  • Po nájdení prvej významnej osi (canonical axis) asociovanej s prvým optimálnym vektorom \mathbf{u} môžeme hľadať druhú, ktorá je s predošlou nekorelovaná a je čo najviac diskriminačná (v smere čo najväčšieho rozptylu, aby sa ukázali ďalšie rozdiely medzi triedami odozvy), atď.
  • Najväčší počet hľadaných osí sa rovná \min(K-1,p).

8.5.2 Vzdialenosť a klasifikácia

8.5.2.1 Metrika

  • Euklidovská vzdialenosť ľubovoľných dvoch vektorov \mathbf{a},\mathbf{b}\in\mathbb{R}^p sa dá vyjadriť pomocou skalárneho súčinu (a jednoduchej metriky danej jednotkovou maticou \mathbf{I}_p)
    d^2(\mathbf{a},\mathbf{b})=(\mathbf{a}-\mathbf{b})^T(\mathbf{a}-\mathbf{b})=(\mathbf{a}-\mathbf{b})^T\mathbf{I}_p(\mathbf{a}-\mathbf{b})
  • Vo všeobecnosti môže byť vzdialenosť daná nejakou metrikou, ktorú reprezentuje matica \mathbf{M}, d_\mathbf{M}^2(\mathbf{a},\mathbf{b})=(\mathbf{a}-\mathbf{b})^T\mathbf{M}(\mathbf{a}-\mathbf{b})
  • Keď chceme zaradiť určitý bod \mathbf{x}_i do jednej z tried, musíme porovnať vzdialenosti k ich centroidom \mathbf{g}_k a vybrať tú najmenšiu. Namiesto euklidovskej metriky, ktorá nerešpektuje korelačnú štruktúru v skupinách, sa použije Mahalanobisova metrika s maticou \mathbf{W}^{-1}, pre ktorú je vzdialnosť daná d^2(\mathbf{x}_i,\mathbf{g}_k)=(\mathbf{x}_i-\mathbf{g}_k)^T\mathbf{W}^{-1}(\mathbf{x}_i-\mathbf{g}_k)
  • Napríklad, na nasledujúcom obrázku body \mathbf{x}_i,\mathbf{x}_\ell ležia na tom istom elipsoide (t.j. vrstevnici hustoty rozdelenia). Mahalanobisova vzdialenosť je rovnaká, avšak euklidovská nie.

8.5.2.2 Klasifikácia

  • Keď rozvinieme vzťah pre Mahalanobisovu vzdialenosť, \begin{split} d^2(\mathbf{x}_i,\mathbf{g}_k) &= (\mathbf{x}_i-\mathbf{g}_k)^T\mathbf{W}^{-1}(\mathbf{x}_i-\mathbf{g}_k) \\ &= \underbrace{\mathbf{x}_i^T\mathbf{W}^{-1}\mathbf{x}_i}_{\text{konšt.}} - \underbrace{2\mathbf{x}_i^T\mathbf{W}^{-1}\mathbf{g}_k + \mathbf{g}_k^T\mathbf{W}^{-1}\mathbf{g}_k}_{\text{závisí od } k} \end{split} okamžite vidno podobnosť s diskriminačnou funkciou LDA.

8.6 Príklady

8.6.1 Lineárna diskriminačná analýza

Príklad (kosatce)
  • Príklad s rozmermi korunného lupienku kosatcov: 2 prediktory (šírka a dĺžka lupienku), 3 triedy.
Kód
# odhad modelu
fit <- MASS::lda(Species ~ Petal.Width + Petal.Length, data = iris)
fit
Call:
lda(Species ~ Petal.Width + Petal.Length, data = iris)

Prior probabilities of groups:
    setosa versicolor  virginica 
 0.3333333  0.3333333  0.3333333 

Group means:
           Petal.Width Petal.Length
setosa           0.246        1.462
versicolor       1.326        4.260
virginica        2.026        5.552

Coefficients of linear discriminants:
                  LD1       LD2
Petal.Width  2.402394  5.042599
Petal.Length 1.544371 -2.161222

Proportion of trace:
   LD1    LD2 
0.9947 0.0053 
  • Výstup z funkcie MASS::lda obsahuje
    • odhady apriórnych pravdepodobností \pi_k,
    • skupinové priemery \mu_{kj} (centroidy \boldsymbol{\mu}_k=(\mu_{k1},\mu_{k2}) ktoré poznáme aj ako \mathbf{g}_k),
    • transformačné vektory \mathbf{u}_i (stĺpce) a nakoniec
    • percento vysvetlenosti medzi-skupinovej variability jednotlivými diskriminantami. Tu by nám na klasifikáciu zjavne stačil iba prvý z nich.
  • Zobrazíme východiskovú situáciu s vypočítanými centroidmi.
Kód
# zobrazenie tried v priestore prediktorov aj s centroidmi
centr.df <- fit |> 
  getElement("means") |> # treba ich ešte
  tibble::as_tibble(rownames = "Species") 

iris |> 
  ggplot() + 
  aes(x = Petal.Width, y = Petal.Length, color = Species) + 
  geom_point() + 
  geom_point(data = centr.df, shape = 4, size = 3, show.legend = FALSE)

  • Vidno, že triedy sú pomerne dobre vymedzené, ale v priestore lineárnych diskriminantov bude separácia ešte presnejšia.
  • Pomocou tzv. biplotu (pozri detailnú publikáciu Greenacre, 2010) zobrazíme oba priestory premietnuté na sebe.
Kód
# prvky transformačných vektorov "u" pre zobrazenie v priestore prediktorov
trans.df <- fit |> 
  coef() |>   #  to isté ako getElement("scaling")
#  apply(2, function(x) x/sqrt(sum(x^2))) |>  # konverzia na jednotkové vektory (voliteľné)
  t() |> 
  as.data.frame() |> 
#  setNames(fit$scaling |> rownames()) |>   # lebo apply zruší názvy riadkov
  cbind(variable = fit$scaling |> colnames())

# biplot
iris |> 
  purrr::map_if(is.numeric, scale) |>   # centrovanie a škálovanie
  as.data.frame() |> 
  ggplot() + aes(x = Petal.Width, y = Petal.Length) + 
  geom_point(aes(color = Species)) +
  geom_segment(aes(x = 0, y = 0, xend = Petal.Width, yend = Petal.Length), 
               data = trans.df,
               arrow = arrow(length = unit(0.5, "char"))
               ) +
  geom_text(aes(x = Petal.Width, y = Petal.Length, label = variable), 
            data = trans.df, 
            nudge_x = 0.5) 
# biplot pomocou externého balíku
# library(devtools)
# install_github('fawda123/ggord')
# ggord::ggord(fit, iris$Species, size = 2)

# prvky transformačných vektorov "u" pre zobrazenie v priestore diskriminantov
trans.df <- fit |> 
  getElement("scaling") |> 
  as.data.frame() |> 
  tibble::rownames_to_column(var = "variable")

# výpočet hodnôt diskriminantov (aj pomocou predict(fit)$x)
LD <- iris[,4:3] |> 
  as.matrix() |> 
  (`%*%`)(fit$scaling) |>   # transformácia dát do priestoru diskriminantov
  apply(2, scale, center = TRUE, scale = FALSE) |> # centrovanie diskriminantov
  cbind.data.frame(iris[5])  

# biplot v priestore diskriminantov  
LD |> 
  ggplot() + aes(LD1, LD2) + 
  geom_point(aes(color = Species)) +
  geom_segment(aes(x = 0, y = 0, xend = LD1, yend = LD2), 
               data = trans.df,
               arrow = arrow(length = unit(0.5, "char"))
               ) +
  geom_text(aes(x = LD1, y = LD2, label = variable), 
            data = trans.df, 
            nudge_y = -0.5) + 
  stat_ellipse(aes(fill = Species), geom = "polygon", alpha = 0.2) +
  ylim(-3, 6)

  • Vyhladená hustota hodnôt diskriminantov napovie, ako vyzerá výsledná, aposteriórna pravdepodobnosť jednotlivých tried.
Kód
# hustota pravdepodobnosti podľa tried v priestore diskriminantov
LD |> 
  tidyr::pivot_longer(-Species, names_to = "diskriminant", values_to = "value") |> 
  ggplot() + aes(x = value, fill = Species) + geom_density(alpha = 0.5, adjust = 2) + facet_wrap(~diskriminant)

Kód
# empirická hustota v triedach pre prvý diskriminant vstavanou funkciou
# MASS::ldahist(iris[3:4], iris$Species)
  • Nakoniec v pravidelnej mriežke hodnôt prediktorov (šírky a dĺžky lupienkov) vykonáme predpovede a zobrazíme delenie priestoru, takže je možná aj vizuálna klasifikácia.
Kód
# predikcia v trénovacej vzorke (obsahuje triedy, ich pravdepodobnosti aj hodnoty diskriminantov)
# pred <- predict(fit)
# (urpbiť: vykresliť pravdepodobnosti pre jednotlivé triedy a diskrimininanty ako alternatívu ku vyhladeným frekvenčným polynómom hore)


# nové dáta a predpovede
xgrid <- expand.grid(Petal.Length = seq(1,7,0.01), Petal.Width = seq(0,2.5,0.01)) 
pred <- cbind.data.frame(
  xgrid, 
  class = predict(fit, newdata = xgrid) |> getElement("class")
)
# zobrazenie oblastí klasifikácie do jednotlivých tried
pred |> 
  ggplot() + aes(x = Petal.Width, y = Petal.Length) + geom_tile(aes(fill = class), alpha = 0.3) +
  geom_point(aes(color = Species), data = iris) +
  ggtitle("Hranice tried podľa LDA")

Kód
# externým balíkom
# klaR::partimat(Species ~ Petal.Width + Petal.Length, data = iris, method = "lda")

8.6.2 Kvadratická diskriminačná analýza

Príklad (kosatce)
  • Rovnaký príklad, ale tentokrát umožníme triedam mať svoju vlastnú kovariančnú maticu. Delenie priestoru sa zásadne zmení, pretože hranice už nie sú lineárne, ale kvadratické.
Kód
# kvadratická diskriminačná analýza
fit <- MASS::qda(Species ~ Petal.Width + Petal.Length, data = iris)
fit
Call:
qda(Species ~ Petal.Width + Petal.Length, data = iris)

Prior probabilities of groups:
    setosa versicolor  virginica 
 0.3333333  0.3333333  0.3333333 

Group means:
           Petal.Width Petal.Length
setosa           0.246        1.462
versicolor       1.326        4.260
virginica        2.026        5.552
Kód
# nové dáta a predpovede
xgrid <- expand.grid(Petal.Length = seq(1,7,0.01), 
                     Petal.Width = seq(0,2.5,0.01)
                     ) 
pred <- cbind.data.frame(
  xgrid, 
  class = predict(fit, newdata = xgrid) |> getElement("class")
)
# zobrazenie oblastí klasifikácie do jednotlivých tried
pred |> 
  ggplot() + aes(x = Petal.Width, y = Petal.Length) + geom_tile(aes(fill = class), alpha = 0.3) +
  geom_point(aes(color = Species), data = iris) +
  ggtitle("Hranice tried podľa QDA")

8.6.3 Naivný Bayesov klasifikátor

Príklad (kosatce)
  • Tentokrát uvoľníme požiadavku normality, a na druhej strane zavedieme obmedzenie – nezávislosť prediktorov.
  • Z tých známejších balíkov sú dostupné funkcie klaR::NaiveBayes a e1071::naiveBayes, avšak z hladiska funkcionality, rýchlosti, užívateľskej prívetivosti aj (minimálnej) externej závislosti je najlepší balík naivebayes.
Kód
# --- balíkom klaR
# fit <- klaR::NaiveBayes(Species ~ Petal.Width + Petal.Length, data = iris, usekernel = T, adjust = 2.) # výstup je neformátovaný, list
# plot(fit)

# --- balíkom e1071
# fit <- e1071::naiveBayes(Species ~ Petal.Width + Petal.Length, data = iris)
# výstup tvorí vektor apriórnych pravdepodobností a pod názvom "Conditional probabilities" stredná hodnota a štandardná odchýlka prediktorov v jednotlivých triedach (žiaľ neoznačné).

# --- balíkom naivebayes
# odhad modelu s predpokladom normálneho (parametrického) a vyhladeného (neparametrického) rozdelenia. Argument adjust násobí prednastavenú šírku pásma jadrového vyhladenia.
fit <- list(
  gauss = naivebayes::naive_bayes(Species ~ Petal.Width + Petal.Length, data = iris),
  kernel = naivebayes::naive_bayes(Species ~ Petal.Width + Petal.Length, data = iris,
                                 usekernel = TRUE, adjust = 2)
)
  • Najprv zobrazíme (vyhladenú) hustotu v triedach.
Kód
# zobrazenie vyhladenej hustoty v jednotlivých triedach
fit$kernel |> plot(arg.num = list(lwd = 2))

  • Následne zobrazíme delenie priestoru podľa jednotlivých modelov (predpokladov).
Kód
xgrid <- expand.grid(Petal.Length = seq(1,7,0.02), 
                     Petal.Width = seq(0,2.5,0.02)
                     ) 

fit |> 
  purrr::map_dfc(predict, newdata = xgrid, type = "class") |> 
  cbind(xgrid) |> 
  tidyr::pivot_longer(c(gauss, kernel), names_to = "distrib", values_to = "class") |> 
   ggplot() + aes(x = Petal.Width, y = Petal.Length) + geom_tile(aes(fill = class), alpha = 0.3) +
  geom_point(aes(color = Species), data = iris) +
  facet_wrap(~distrib) +
  ggtitle("Hranice tried NB podľa predpokladu rozdelenia prediktorov")

8.7 Zdroje

  • James, Witten, Hastie, Tibshirani (2021): An Introduction to Statistical Learning - with Applications in R. 2nd ed. Springer. https://www.statlearning.com/
  • Sanchez, G., Marzban, E. (2020) All Models Are Wrong: Concepts of Statistical Learning. https://allmodelsarewrong.github.io
  • Venables, W. N. and Ripley, B. D. (2002) Modern Applied Statistics with S. Fourth edition. Springer.