class: center, middle, inverse, title-slide # Fitting ### Maschinelles Lernen mit R
The R Bootcamp
### April 2020 --- layout: true <div class="my-footer"> <span style="text-align:center"> <span> <img src="https://raw.githubusercontent.com/therbootcamp/therbootcamp.github.io/master/_sessions/_image/by-sa.png" height=14 style="vertical-align: middle"/> </span> <a href="https://therbootcamp.github.io/"> <span style="padding-left:82px"> <font color="#7E7E7E"> www.therbootcamp.com </font> </span> </a> <a href="https://therbootcamp.github.io/"> <font color="#7E7E7E"> Maschinelles Lernen mit R | April 2020 </font> </a> </span> </div> --- .pull-left45[ # Fitting <p style="padding-top:1px"></p> <ul> <li class="m1"><span>Modelle sind eigentlich <high>Familie von Modellen</high>, wobei jede Parameterkombination ein unterschiedliches Modell definiert</span></li> <li class="m2"><span>Ein Modell zu fitten bedeutet, von der Familie von Modellen dasjenige zu <high>identifizieren welches die Daten am besten abbildet</high>.</span></li> </ul> ] .pull-right45[ <br><br> <p align = "center"> <img src="image/curvefits.png" height=480px><br> <font style="font-size:10px">angepasst von <a href="https://www.explainxkcd.com/wiki/index.php/2048:_Curve-Fitting">explainxkcd.com</a></font> </p> ] --- # Welches Modelle ist besser? <img src="Fitting_files/figure-html/unnamed-chunk-2-1.png" width="90%" style="display: block; margin: auto;" /> --- # Welches Modelle ist besser? <img src="Fitting_files/figure-html/unnamed-chunk-3-1.png" width="90%" style="display: block; margin: auto;" /> --- # Loss function .pull-left45[ <ul> <li class="m1"><span>Eines <high>zentrales Konzepte</high> in der Statistik und im maschinellen Lernen.</span></li> <li class="m2"><span>Die Loss Funktion ist eine <high>Zusammenfassung der durch ein Modell begangenen Fehler</high>.</span></li> </ul> <p style="padding-top:7px"> `$$\Large Loss = f(Fehler)$$` <p style="padding-top:7px"> <u>Zwei Zwecke</u> <table style="cellspacing:0; cellpadding:0; border:none;"> <tr> <td> <b>Zweck</b> </td> <td> <b>Beschreibung</b> </td> </tr> <tr> <td bgcolor="white"> Fitting </td> <td bgcolor="white"> Finde Parameter, die die Verlustfunktion minimieren. </td> </tr> <tr> <td> Evaluation </td> <td> Berechne den Verlust für ein gefittetes Modell. </td> </tr> </table> ] .pull-right45[ <img src="Fitting_files/figure-html/unnamed-chunk-4-1.png" width="90%" style="display: block; margin: auto;" /> ] --- class: center, middle <high><h1>Regression</h1></high> <font color = "gray"><h1>Decision Trees</h1></font> <font color = "gray"><h1>Random Forests</h1></font> --- # Regression .pull-left45[ In der [Regression](https://de.wikipedia.org/wiki/Regressionsanalyse), wird ein <high>Kriterium</high> `\(y\)` modelliert, als <high>Summe</high> der <high>Features</high> `\(x_1, x_2, ...\)` <high>mal Gewichte</high> `\(b_1, b_2, ...\)` plus `\(b_0\)`, der sogenannte Intercept oder Ordinatenabschnitt. <p style="padding-top:10px"></p> `$$\large \hat{y} = b_{0} + b_{1} \times x_1 + b_{2} \times x2 + ...$$` <p style="padding-top:10px"></p> Ein Regressionskoeffizient `\(b_{i}\)` gibt an, wie stark sich `\(\hat{y}\)` <high>verändert</high>, wenn sich `\(x_{i}\)` um 1 verändert. Ceteris paribus, je <high>extremer</high> `\(b_{i}\)`, desto <high>wichtiger</high> ist `\(x_{i}\)` für die Vorhersage von `\(y\)` <font style="font-size:12px">(Cave: die Skala von `\(x_{i}\)` beeinflusst `\(b_i\)`!).</font> Wenn `\(b_{i} = 0\)`, heisst das, `\(x_{i}\)` <high>bringt keinen Zusatznutzen</high> bei der Vorhersage von `\(y\)`. ] .pull-right45[ <img src="Fitting_files/figure-html/unnamed-chunk-5-1.png" width="90%" style="display: block; margin: auto;" /> ] --- # Loss function in der Regression .pull-left45[ <p> <ul style="margin-bottom:-20px"> <li class="m1"><span><b>Mean Squared Error (MSE)</b> <br><br> <ul class="level"> <li><span><high>Mittlere Quadratsumme der Abweichungen</high> zwischen vorhergesagten und tatsächlichen Werten.</span></li> </ul> </span></li> </ul> $$ MSE = \frac{1}{n}\sum_{i \in 1,...,n}(y_{i} - \hat{y}_{i})^{2}$$ <ul> <li class="m2"><span><b>Mean Absolute Error (MAE)</b> <br><br> <ul class="level"> <li><span><high>Mittlere absolute Abweichungen</high> zwischen vorhergesagten und tatsächlichen Werten.</span></li> </ul> </span></li> </ul> $$ MAE = \frac{1}{n}\sum_{i \in 1,...,n} \lvert y_{i} - \hat{y}_{i} \rvert$$ </p> ] .pull-right45[ <img src="Fitting_files/figure-html/unnamed-chunk-6-1.png" width="90%" style="display: block; margin: auto;" /> ] --- .pull-left45[ # Fitting <p style="margin-top:20px"> <ul style="margin-bottom:-20px"> <li class="m1"><span><b>Analytisch</b> <br><br> <ul class="level"> <li><span>In gewissen Fällen, können die Parameterwerte <high>direkt berechnet</high> werden, z.B., mit der <i>Normalgleichung</i>:</span></li> </ul> </span></li> </ul> <br> $$ \large \boldsymbol b = (\boldsymbol X^T\boldsymbol X)^{-1}\boldsymbol X^T\boldsymbol y$$ <ul> <li class="m2"><span><b>Numerisch</b> <br><br> <ul class="level"> <li><span>In den meisten Fällen, müssen die Parameter jedoch mittels <high>gerichtetem trial and error</high> Verfahren gefunden werden, z.B., mittels <i>gradient descent</i>:</span></li> </ul> </span></li> </ul> <br> $$ \large \boldsymbol b_{n+1} = \boldsymbol b_{n}+\gamma \nabla F(\boldsymbol b_{n})$$ </p> ] .pull-right45[ <br><br> <p align = "center"> <img src="image/gradient.png" height=420px><br> <font style="font-size:10px">angepasst von <a href="https://me.me/i/machine-learning-gradient-descent-machine-learning-machine-learning-behind-the-ea8fe9fc64054eda89232d7ffc9ba60e">me.me</a></font> </p> ] --- .pull-left45[ # Fitting <p style="margin-top:20px"> <ul style="margin-bottom:-20px"> <li class="m1"><span><b>Analytisch</b> <br><br> <ul class="level"> <li><span>In gewissen Fällen, können die Parameterwerte <high>direkt berechnet</high> werden, z.B., mit der <i>Normalgleichung</i>:</span></li> </ul> </span></li> </ul> <br> $$ \large \boldsymbol b = (\boldsymbol X^T\boldsymbol X)^{-1}\boldsymbol X^T\boldsymbol y$$ <ul> <li class="m2"><span><b>Numerisch</b> <br><br> <ul class="level"> <li><span>In den meisten Fällen, müssen die Parameter jedoch mittels <high>gerichtetem trial and error</high> Verfahren gefunden werden, z.B., mittels <i>gradient descent</i>:</span></li> </ul> </span></li> </ul> <br> $$ \large \boldsymbol b_{n+1} = \boldsymbol b_{n}+\gamma \nabla F(\boldsymbol b_{n})$$ </p> ] .pull-right45[ <br><br2> <p align = "center"> <img src="image/gradient1.gif" height=250px><br> <font style="font-size:10px">angepasst von <a href="https://dunglai.github.io/2017/12/21/gradient-descent/ ">dunglai.github.io</a></font><br> <img src="image/gradient2.gif" height=250px><br> <font style="font-size:10px">angepasst von <a href="https://dunglai.github.io/2017/12/21/gradient-descent/ ">dunglai.github.io</a></font> </p> ] --- # Zwei Problemtypen .pull-left5[ <ul> <li class="m1"><span><b>Regression</b></span></li> <br> <ul class="level"> <li><span>Vorhersage eines <high>numerischen, kontinuierlichen Kriteriums</high>.</span></li><br> <li><span><i>Vorhersage des Cholesterinspiegels mit Alter</i></span></li> </ul><br> <li class="m2"><span><b>Klassifikation</b></span></li> <br> <ul class="level"> <li><span>Vorhersage eines <high>kategorialen, diskreten Kriteriums</high>.</span></li><br> <li><span><i>Vorhersage, ob Herzinfarkt ja oder nein</i></span></li> </ul><br> </ul> ] .pull-right4[ <p align = "center"> <img src="image/twotypes.png" height=440px><br> </p> ] --- # Logistische Regression .pull-left45[ <ul style="margin-bottom:-20px"> <li class="m1"><span>In der <a href="https://de.wikipedia.org/wiki/Logistische_Regression">logistischen Regression</a>, modellieren wir eine kategoriale Variable <font style="font-size:22px"><mono>y ∈ (0,1)</mono></font> als <high>gewichtete Summe der Features</high>, wobei wir die Vorhersage mit einer <high>logistischen Linkfunktion</high> transformieren:</span></li> </ul> <p style="padding-top:10px"></p> `$$\large \hat{y} = logistisch(b_{0} + b_{1} \times x_1 + ...)$$` <p style="padding-top:10px"></p> <ul style="margin-bottom:-20px"> <li class="m2"><span>Die logistische Funktion <high>bildet Vorhersagen auf den Bereich von 0 und 1</high> – die beiden Kategorien – ab.</span></li> </ul> <p style="padding-top:10px"></p> $$ logistisch(x) = \frac{1}{1+exp(-x)}$$ ] .pull-right45[ <img src="Fitting_files/figure-html/unnamed-chunk-7-1.png" width="90%" style="display: block; margin: auto;" /> ] --- # Logistische Regression .pull-left45[ <ul style="margin-bottom:-20px"> <li class="m1"><span>In der <a href="https://de.wikipedia.org/wiki/Logistische_Regression">logistischen Regression</a>, modellieren wir eine kategoriale Variable <font style="font-size:22px"><mono>y ∈ (0,1)</mono></font> als <high>gewichtete Summe der Features</high>, wobei wir die Vorhersage mit einer <high>logistischen Linkfunktion</high> transformieren:</span></li> </ul> <p style="padding-top:10px"></p> `$$\large \hat{y} = logistisch(b_{0} + b_{1} \times x_1 + ...)$$` <p style="padding-top:10px"></p> <ul style="margin-bottom:-20px"> <li class="m2"><span>Die logistische Funktion <high>bildet Vorhersagen auf den Bereich von 0 und 1</high> – die beiden Kategorien – ab.</span></li> </ul> <p style="padding-top:10px"></p> $$ logistisch(x) = \frac{1}{1+exp(-x)}$$ ] .pull-right45[ <img src="Fitting_files/figure-html/unnamed-chunk-8-1.png" width="90%" style="display: block; margin: auto;" /> ] --- # Loss in Klassifikation .pull-left45[ <ul style="margin-bottom:-20px"> <li class="m1"><span><b>Distanz</b></span></li> <ul class="level"> <li><span>LogLoss wird i.A.R. <high>zum Fitten von Parametern</high>, verwendet, und wie MSE und MAE auch zur Evaluation.</span></li> </ul> </ul> `$$\small LogLoss = -\frac{1}{n}\sum_{i}^{n}(log(\hat{y})y+log(1-\hat{y})(1-y))$$` `$$\small MSE = \frac{1}{n}\sum_{i}^{n}(y-\hat{y})^2; \: MAE = \frac{1}{n}\sum_{i}^{n} \lvert y-\hat{y} \rvert$$` <ul> <li class="m2"><span><b>Übereinstimmung</b></span></li> <ul class="level"> <li><span>0-1 loss evaluiert die Übereinstimmung zwischen <high>vorhergesagter Klasse und tatsächlicher Klasse </high>, was im Vergleich <high>leicht zu interpretieren</high> ist.</span></li> </ul> </ul> `$$\small Loss_{01}=\frac{1}{n}\sum_i^n I(y \neq \lfloor \hat{y} \rceil)$$` ] .pull-right45[ <img src="Fitting_files/figure-html/unnamed-chunk-9-1.png" width="90%" style="display: block; margin: auto;" /> ] --- # Wahrheitsmatrix .pull-left45[ <ul style="margin-bottom:-20px"> <li class="m1"><span>Die Wahrheitsmatrix (<i>confusion matrix</i>) <high>enthält die Anzahl einer bestimmten Klasse zugeordneter Werte</high> als Funktion der tatsächlichen Klasse.</span></li> <li class="m2"><span>Anhand der Wahrheitsmatrix können unterschiedliche <high>statistische Gütekriterien</high> berechnet werden.</span></li> </ul> <br> <u> Wahrheitsmatrix</u> <font style="font-size:22px"> <table style="cellspacing:0; cellpadding:0; border:none;"> <col width=20%> <col width=40%> <col width=40%> <tr> <td> </td> <td> <eq><b>y = 1</b></eq> </td> <td> <eq><b>y = 0</b></eq> </td> </tr> <tr> <td bgcolor="white"> <eq><b>ŷ = 1</b></eq> </td> <td bgcolor="white"> <font color="#6ABA9A"> Richtig positiv (RP)</font> </td> <td bgcolor="white"> <font color="#EA4B68"> Falsch positiv (FP)</font> </td> </tr> <tr> <td> <eq><b>ŷ = 0</b></eq> </td> <td> <font color="#EA4B68"> Falsch negativ (FN)</font> </td> <td> <font color="#6ABA9A"> Richtig negativ (RN)</font> </td> </tr> </table> </font> ] .pull-right45[ <b>Genauigkeit</b>: Prozentsatz richtiger Vorhersagen <i>über alle Fälle hinweg</i>. `$$\small Richt. = \frac{RP + RN}{ RP + RN + FN + FP} = 1-Loss_{01}$$` <p style="padding-top:10px"></p> <b>Sensitivität</b>: Prozentsatz richtiger Vorhersagen <i>über tatsächlich positive Fälle hinweg</i>. `$$\small Sensitivität = \frac{RP}{ RP +FN }$$` <b>Spezifität</b>: Prozentsatz richtiger Vorhersagen <i>über tatsächlich negative Fälle hinweg</i>. <p style="padding-top:10px"></p> `$$\small Spezifität = \frac{RN}{ RN + FP }$$` ] --- # Wahrheitsmatrix .pull-left45[ <ul style="margin-bottom:-20px"> <li class="m1"><span>Die Wahrheitsmatrix (<i>confusion matrix</i>) <high>enthält die Anzahl einer bestimmten Klasse zugeordneter Werte</high> als Funktion der tatsächlichen Klasse.</span></li> <li class="m2"><span>Anhand der Wahrheitsmatrix können unterschiedliche <high>statistische Gütekriterien</high> berechnet werden.</span></li> </ul> <br> <u> Wahrheitsmatrix</u> <font style="font-size:22px"> <table style="cellspacing:0; cellpadding:0; border:none;"> <col width=20%> <col width=40%> <col width=40%> <tr> <td> </td> <td> <eq><b>Krank</b></eq> </td> <td> <eq><b>Gesund</b></eq> </td> </tr> <tr> <td bgcolor="white"> <eq><b>"Krank"</b></eq> </td> <td bgcolor="white"> <font color="#6ABA9A"> RP = 3</font> </td> <td bgcolor="white"> <font color="#EA4B68"> FP = 1</font> </td> </tr> <tr> <td> <eq><b>"Gesund"</b></eq> </td> <td> <font color="#EA4B68"> FN = 1</font> </td> <td> <font color="#6ABA9A"> RN = 2</font> </td> </tr> </table> </font> ] .pull-right45[ <b>Genauigkeit</b>: Prozentsatz richtiger Vorhersagen <i>über alle Fälle hinweg</i>. `$$\small Richt. = \frac{RP + RN}{ RP + RN + FN + FP} = 1-Loss_{01}$$` <p style="padding-top:10px"></p> <b>Sensitivität</b>: Prozentsatz richtiger Vorhersagen <i>über tatsächlich positive Fälle hinweg</i>. `$$\small Sensitivität = \frac{RP}{ RP +FN }$$` <b>Spezifität</b>: Prozentsatz richtiger Vorhersagen <i>über tatsächlich negative Fälle hinweg</i>. <p style="padding-top:10px"></p> `$$\small Spezifität = \frac{RN}{ RN + FP }$$` ] --- class: center, middle <br><br> <h1><a>Regressionsmodelle fitten in <mono>caret</mono></h1> --- # `caret`s Haupfunktionen .pull-left45[ <table style="cellspacing:0; cellpadding:0; border:none;"> <tr> <td> <b>Funktion</b> </td> <td> <b>Beschreibung</b> </td> </tr> <tr> <td bgcolor="white"> <mono>trainControl()</mono> </td> <td bgcolor="white"> Wähle Spezifikationen dafür, wie das Modell gefittet werden soll. </td> </tr> <tr> <td> <mono>train()</mono> </td> <td> Spezifiziere das Modell und finde die <i>besten</i> Parameterschätzwerte. </td> </tr> <tr> <td bgcolor="white"> <mono>postResample()</mono> </td> <td bgcolor="white"> Evaluiere die Modellperformanz (Fitting oder Vorhersage) für Regressionsprobleme. </td> </tr> <tr> <td> <mono>confusionMatrix()</mono> </td> <td bgcolor="white"> Evaluiere die Modellperformanz (Fitting oder Vorhersage) für Klassifikationsprobleme. </td> </tr> </table> ] .pull-right45[ ```r # Schritt 1: Definiere Kontrollparameter # trainControl() ctrl <- trainControl(...) # Schritt 2: Fitte und exploriere Modell # train() mod <- train(...) summary(mod) mod$finalModel # bestes Modell # Schritt 3: Beurteile Fit # predict(), postResample(), # confusionMatrix() fit <- predict(mod) postResample(fit, truth) confusionMatrix(fit, truth) ``` <!-- Caret documentation: [http://topepo.github.io/caret/](http://topepo.github.io/caret/) --> <!-- <iframe src="http://topepo.github.io/caret/" height="480px" width = "500px"></iframe> --> ] --- # `trainControl()` .pull-left45[ <ul> <li class="m1"><span><mono>trainControl()</mono> steuert, <high>wie <mono>caret</mono> ein Modell fittet</high>.</span></li> <li class="m2"><span>Bis zur Session <b>Optimisierung</b> verwenden wir <highm>method = "none"</highm>.</span></li> </ul> <br> ```r # Fitte das Modell ohne fortgeschrittene # Tuningmethoden der Parameter ctrl <- trainControl(method = "none") # zeige Dokumentation ?trainControl ``` ] .pull-right45[ <img src="image/traincontrol_help.jpg" width="100%" style="display: block; margin: auto;" /> ] --- # `train()` .pull-left4[ <ul> <li class="m1"><span><mono>train()</mono> ist <mono>caret</mono>'s <high>Zugpferd</high>, wenn es um Fitting geht. Es können <high>über 200 Modelle</high> mit nur leichten Änderungen im <high>method</high> Argument gefittet werden.</span></li> </ul> <table style="cellspacing:0; cellpadding:0; border:none;"> <tr> <td> <b>Argument</b> </td> <td> <b>Beschreibung</b> </td> </tr> <tr> <td bgcolor="white"> <mono>form</mono> </td> <td bgcolor="white"> Modellformel, zur Spezifikation von Kriterium und Features. </td> </tr> <tr> <td> <mono>data</mono> </td> <td> Datensatz für die Parameterschätzung. </td> </tr> <tr> <td bgcolor="white"> <mono>method</mono> </td> <td bgcolor="white"> Der Modellalgorithmus. </td> </tr> <tr> <td> <mono>trControl</mono> </td> <td bgcolor="white"> Kontrollparameter für den Fittingprozess. </td> </tr> <tr> <td bgcolor="white"> <mono>tuneGrid</mono>, <mono>preProcess</mono> </td> <td bgcolor="white"> Coole Dinge für später. </td> </tr> </table> ] .pull-right5[ ```r # Fitte eine Regression zur Vorhersage des # Einkommens eink_mod <- train(form = einkommen ~ ., # Formel data = basel, # Daten method = "glm", # Regression trControl = ctrl) # Kontroll- # parameter eink_mod ``` ``` Generalized Linear Model 6120 samples 19 predictor No pre-processing Resampling: None ``` ] --- # `train()` .pull-left4[ <ul> <li class="m1"><span><mono>train()</mono> ist <mono>caret</mono>'s <high>Zugpferd</high>, wenn es um Fitting geht. Es können <high>über 200 Modelle</high> mit nur leichten Änderungen im <high>method</high> Argument gefittet werden.</span></li> </ul> <table style="cellspacing:0; cellpadding:0; border:none;"> <tr> <td> <b>Argument</b> </td> <td> <b>Beschreibung</b> </td> </tr> <tr> <td bgcolor="white"> <mono>form</mono> </td> <td bgcolor="white"> Modellformel, zur Spezifikation von Kriterium und Features. </td> </tr> <tr> <td> <mono>data</mono> </td> <td> Datensatz für die Parameterschätzung. </td> </tr> <tr> <td bgcolor="white"> <mono>method</mono> </td> <td bgcolor="white"> Der Modellalgorithmus. </td> </tr> <tr> <td> <mono>trControl</mono> </td> <td bgcolor="white"> Kontrollparameter für den Fittingprozess. </td> </tr> <tr> <td bgcolor="white"> <mono>tuneGrid</mono>, <mono>preProcess</mono> </td> <td bgcolor="white"> Coole Dinge für später. </td> </tr> </table> ] .pull-right5[ ```r # Fitte random forest zur Vorhersage von # Einkommen eink_mod <- train(form = einkommen ~ ., # Formel data = basel, # Daten method = "rf", # Random Forest trControl = ctrl) # Kontroll- # parameter eink_mod ``` ``` Random Forest 6120 samples 19 predictor No pre-processing Resampling: None ``` ] --- .pull-left4[ # `train()` <ul> <li class="m1"><span><mono>train()</mono> ist <mono>caret</mono>'s <high>Zugpferd</high>, wenn es um Fitting geht. Es können <high>über 200 Modelle</high> mit nur leichten Änderungen im <high>method</high> Argument gefittet werden.</span></li> <li class="m2"><span>Alle 200+ Modelle findest du <a href="http://topepo.github.io/caret/available-models.html">hier</a>.</span></li> </ul> ] .pull-right5[ <br><br> <iframe width="600" height="480" src="https://topepo.github.io/caret/available-models.html" frameborder="0"></iframe> ] --- # `train()` .pull-left4[ <ul style="margin-bottom:-20px"> <li class="m1"><span>Das Kriterium muss die richtige Klasse haben: <br><br> <ul class="level"> <li><span><high><mono>numeric</mono></high> Kriterium → <high>Regression</high><br></span></li> <li><span><high><mono>factor</mono></high> Kriterium → <high>Klassifkation</high><br></span></li> </ul> </span></li> </ul> <br> ``` # A tibble: 5 x 5 Ausfall Alter Geschlecht Karten Bildung <dbl> <dbl> <chr> <dbl> <dbl> 1 0 45 M 3 11 2 1 36 F 2 14 3 0 76 F 5 12 4 1 25 M 2 17 5 1 36 F 3 12 ``` ] .pull-right5[ ```r # Regressionsproblem loan_mod <- train(form = Ausfall ~ ., data = Loans, method = "glm", trControl = ctrl) # Klassifikationsproblem load_mod <- train(form = factor(Ausfall) ~ ., data = Loans, method = "glm", trControl = ctrl) ``` ] --- # <mono>.$finalModel</mono> .pull-left4[ <ul> <li class="m1"><span>Die <mono>train()</mono> Funktion gibt eine <mono>list</mono>e zurück. Diese enthält ein <mono>finalModel</mono> Element - das ist unser <high>bestes gefittetes Model</high>.</span></li> <li class="m2"><span>Greife auf das Modell mit <mono>.$finalModel</mono> zu und <high>exploriere</high> das Objekt mit generischen Funktionen:</span></li> </ul> <br> <table style="cellspacing:0; cellpadding:0; border:none;"> <tr> <td> <b>Funktion</b> </td> <td> <b>Beschreibung</b> </td> </tr> <tr> <td bgcolor="white"> <mono>summary()</mono> </td> <td bgcolor="white"> Überblick über die wichtigsten Resultate. </td> </tr> <tr> <td bgcolor="white"> <mono>names()</mono> </td> <td bgcolor="white"> Zeige Namen aller benannten Elemente (häufig mit `$` ansteuerbar). </td> </tr> </table> ] .pull-right5[ ```r # Fitte Regressionsmodell eink_mod <- train(form = einkommen ~ alter + groesse, data = basel, # Daten method = "glm", # Regression trControl = ctrl) # Kontrollparameter # Zeige benannte Elemente names(eink_mod$finalModel) ``` ``` [1] "coefficients" "residuals" "fitted.values" [4] "effects" "R" "rank" [ reached getOption("max.print") -- omitted 28 entries ] ``` ] --- # <mono>.$finalModel</mono> .pull-left4[ <ul> <li class="m1"><span>Die <mono>train()</mono> Funktion gibt eine <mono>list</mono>e zurück. Diese enthält ein <mono>finalModel</mono> Element - das ist unser <high>bestes gefittetes Model</high>.</span></li> <li class="m2"><span>Greife auf das Modell mit <mono>.$finalModel</mono> zu und <high>exploriere</high> das Objekt mit generischen Funktionen:</span></li> </ul> <br> <table style="cellspacing:0; cellpadding:0; border:none;"> <tr> <td> <b>Funktion</b> </td> <td> <b>Beschreibung</b> </td> </tr> <tr> <td bgcolor="white"> <mono>summary()</mono> </td> <td bgcolor="white"> Überblick über die wichtigsten Resultate. </td> </tr> <tr> <td bgcolor="white"> <mono>names()</mono> </td> <td bgcolor="white"> Zeige Namen aller benannten Elemente (häufig mit `$` ansteuerbar). </td> </tr> </table> ] .pull-right5[ ```r # Fitte Regressionsmodell eink_mod <- train(form = einkommen ~ alter + groesse, data = basel, # Daten method = "glm", # Regression trControl = ctrl) # Kontrollparameter # Zugriff auf spezifische Elemente eink_mod$finalModel$coefficients ``` ``` (Intercept) alter groesse 877.2395 149.0087 0.6194 ``` ] --- # <mono>.$finalModel</mono> .pull-left4[ <ul> <li class="m1"><span>Die <mono>train()</mono> Funktion gibt eine <mono>list</mono>e zurück. Diese enthält ein <mono>finalModel</mono> Element - das ist unser <high>bestes gefittetes Model</high>.</span></li> <li class="m2"><span>Greife auf das Modell mit <mono>.$finalModel</mono> zu und <high>exploriere</high> das Objekt mit generischen Funktionen:</span></li> </ul> <br> <table style="cellspacing:0; cellpadding:0; border:none;"> <tr> <td> <b>Funktion</b> </td> <td> <b>Beschreibung</b> </td> </tr> <tr> <td bgcolor="white"> <mono>summary()</mono> </td> <td bgcolor="white"> Überblick über die wichtigsten Resultate. </td> </tr> <tr> <td bgcolor="white"> <mono>names()</mono> </td> <td bgcolor="white"> Zeige Namen aller benannten Elemente (häufig mit `$` ansteuerbar). </td> </tr> </table> ] .pull-right55[ ```r # Zeige Modelloutput summary(eink_mod) ``` ``` Call: NULL Deviance Residuals: Min 1Q Median 3Q Max -4042 -849 11 842 4748 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 877.239 220.726 3.97 7.1e-05 *** [ erreichte getOption("max.print") -- 2 Zeilen ausgelassen ] --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Dispersion parameter for gaussian family taken to be 1543046) Null deviance: 5.1695e+10 on 6119 degrees of freedom Residual deviance: 9.4388e+09 on 6117 degrees of freedom AIC: 104578 Number of Fisher Scoring iterations: 2 ``` ] --- # `predict()` .pull-left5[ <ul> <li class="m1"><span>Die <mono>predict()</mono> Funktion <high>macht Modellvorhersagen</high>. Dazu muss man lediglich den Modelloutput als erstes Argument spezifizieren.</span></li> </ul> <br> ```r # Extrahiere gefittete Werte glm_fits <- predict(object = eink_mod) glm_fits[1:8] ``` ``` 1 2 3 4 5 6 7 8 9032 6035 4565 8119 8884 8432 10221 11858 ``` ] .pull-right45[ <img src="Fitting_files/figure-html/unnamed-chunk-26-1.png" width="90%" style="display: block; margin: auto;" /> ] --- # `postResample()` .pull-left45[ <ul> <li class="m1"><span>Die <mono>postResample()</mono> Funktion <high>erstellt eine einfache Zusammenfassung</high> der Modellperformanz bei <high>Regressionsproblemen</high>. Zu spezifizierende Argumente sind die vorhergesagten Werte und die tatsächlichen Werte.</span></li> </ul> <br> ```r # Evaluiere Modellperformanz postResample(glm_fits, basel$einkommen) ``` ``` RMSE Rsquared MAE 1241.8895 0.8174 993.5378 ``` ] .pull-right45[ <img src="Fitting_files/figure-html/unnamed-chunk-28-1.png" width="90%" style="display: block; margin: auto;" /> ] --- .pull-left5[ <p style="padding-top:10px"></p> ## `confusionMatrix()` <p style="padding-top:10px"></p> <ul> <li class="m1"><span><mono>confusionMatrix()</mono> erstellt eine Zusammenfassung der <high>Modellperformanz bei Klassifikationsproblemen</high>. Inputs sind wiederum die vorhergesagten und tatsächlichen Werte.</span></li> </ul> <br> ```r # Regressionsmodell zur Klassifikation sehhilfe_mod <- train(form = factor(sehhilfe) ~ alter + geschlecht, data = basel, method = "glm", trControl = ctrl) # Evaluiere Modellperformanz confusionMatrix(predict(sehhilfe_mod), basel$sehhilfe) ``` ] .pull-right4[ <br><br> ``` Confusion Matrix and Statistics Reference Prediction ja nein ja 3984 2136 nein 0 0 Accuracy : 0.651 95% CI : (0.639, 0.663) No Information Rate : 0.651 P-Value [Acc > NIR] : 0.506 Kappa : 0 Mcnemar's Test P-Value : <2e-16 Sensitivity : 1.000 Specificity : 0.000 Pos Pred Value : 0.651 Neg Pred Value : NaN Prevalence : 0.651 Detection Rate : 0.651 [ erreichte getOption("max.print") -- 5 Zeilen ausgelassen ] ``` ] --- class: middle, center <h1><a href=https://therbootcamp.github.io/ML_2020Apr/_sessions/Fitting/Fitting_practical.html>Practical</a></h1>