You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
648 lines
26 KiB
648 lines
26 KiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "lesson_12-R.ipynb",
|
|
"provenance": [],
|
|
"collapsed_sections": []
|
|
},
|
|
"kernelspec": {
|
|
"name": "ir",
|
|
"display_name": "R"
|
|
},
|
|
"language_info": {
|
|
"name": "R"
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "fab50046ca413a38939d579f8432274f",
|
|
"translation_date": "2025-09-04T08:41:59+00:00",
|
|
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
|
|
"language_code": "hu"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "jsFutf_ygqSx"
|
|
},
|
|
"source": [
|
|
"# Készíts egy osztályozási modellt: Finom ázsiai és indiai konyhák\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "HD54bEefgtNO"
|
|
},
|
|
"source": [
|
|
"## Konyhai osztályozók 2\n",
|
|
"\n",
|
|
"Ebben a második osztályozási leckében `további módszereket` fogunk megvizsgálni a kategóriák szerinti adatok osztályozására. Megismerjük azt is, hogy milyen következményekkel járhat az egyik osztályozó választása a másikkal szemben.\n",
|
|
"\n",
|
|
"### [**Előzetes kvíz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
|
|
"\n",
|
|
"### **Előfeltétel**\n",
|
|
"\n",
|
|
"Feltételezzük, hogy elvégezted az előző leckéket, mivel néhány korábban tanult fogalmat tovább fogunk vinni.\n",
|
|
"\n",
|
|
"Ehhez a leckéhez a következő csomagokra lesz szükségünk:\n",
|
|
"\n",
|
|
"- `tidyverse`: A [tidyverse](https://www.tidyverse.org/) egy [R csomaggyűjtemény](https://www.tidyverse.org/packages), amely a data science-t gyorsabbá, egyszerűbbé és szórakoztatóbbá teszi!\n",
|
|
"\n",
|
|
"- `tidymodels`: A [tidymodels](https://www.tidymodels.org/) keretrendszer egy [csomaggyűjtemény](https://www.tidymodels.org/packages/) modellezéshez és gépi tanuláshoz.\n",
|
|
"\n",
|
|
"- `themis`: A [themis csomag](https://themis.tidymodels.org/) további recepteket biztosít a kiegyensúlyozatlan adatok kezeléséhez.\n",
|
|
"\n",
|
|
"A következő módon telepítheted őket:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
|
|
"\n",
|
|
"Alternatívaként az alábbi szkript ellenőrzi, hogy rendelkezel-e a modul elvégzéséhez szükséges csomagokkal, és ha hiányoznak, telepíti őket.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "vZ57IuUxgyQt"
|
|
},
|
|
"source": [
|
|
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
|
|
"\n",
|
|
"pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "z22M-pj4g07x"
|
|
},
|
|
"source": [
|
|
"## **1. Egy osztályozási térkép**\n",
|
|
"\n",
|
|
"Az [előző leckében](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) megpróbáltuk megválaszolni a kérdést: hogyan válasszunk több modell közül? Nagy mértékben függ az adatok jellemzőitől és attól, hogy milyen típusú problémát szeretnénk megoldani (például osztályozás vagy regresszió).\n",
|
|
"\n",
|
|
"Korábban megtanultuk, hogy milyen lehetőségek állnak rendelkezésre az adatok osztályozására a Microsoft csalólapja segítségével. A Python gépi tanulási keretrendszere, a Scikit-learn, egy hasonló, de részletesebb csalólapot kínál, amely tovább segíthet az osztályozók (más néven becslők) szűkítésében:\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/map.png\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption></figcaption>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "u1i3xRIVg7vG"
|
|
},
|
|
"source": [
|
|
"> Tipp: [nézd meg ezt a térképet online](https://scikit-learn.org/stable/tutorial/machine_learning_map/), és kattints az útvonalak mentén, hogy elolvasd a dokumentációt.\n",
|
|
">\n",
|
|
"> A [Tidymodels referenciaoldal](https://www.tidymodels.org/find/parsnip/#models) szintén kiváló dokumentációt nyújt a különböző modellfajtákról.\n",
|
|
"\n",
|
|
"### **A terv** 🗺️\n",
|
|
"\n",
|
|
"Ez a térkép nagyon hasznos, ha már tisztán látod az adataidat, mivel az útvonalait követve eljuthatsz egy döntéshez:\n",
|
|
"\n",
|
|
"- Több mint 50 mintánk van\n",
|
|
"\n",
|
|
"- Egy kategóriát szeretnénk előrejelezni\n",
|
|
"\n",
|
|
"- Címkézett adataink vannak\n",
|
|
"\n",
|
|
"- Kevesebb mint 100 ezer mintánk van\n",
|
|
"\n",
|
|
"- ✨ Választhatunk egy Linear SVC-t\n",
|
|
"\n",
|
|
"- Ha ez nem működik, mivel numerikus adataink vannak\n",
|
|
"\n",
|
|
" - Kipróbálhatunk egy ✨ KNeighbors Classifiert\n",
|
|
"\n",
|
|
" - Ha ez sem működik, próbáljuk ki a ✨ SVC-t és a ✨ Ensemble Classifiert\n",
|
|
"\n",
|
|
"Ez egy nagyon hasznos útvonal, amit érdemes követni. Most pedig vágjunk bele a [tidymodels](https://www.tidymodels.org/) modellezési keretrendszer használatába: egy következetes és rugalmas R csomaggyűjtemény, amelyet a jó statisztikai gyakorlat előmozdítására fejlesztettek ki 😊.\n",
|
|
"\n",
|
|
"## 2. Az adatok felosztása és az egyensúlyhiányos adathalmaz kezelése\n",
|
|
"\n",
|
|
"Az előző leckékből megtanultuk, hogy a konyháink között volt néhány közös összetevő. Emellett az egyes konyhák száma között elég egyenlőtlen volt az eloszlás.\n",
|
|
"\n",
|
|
"Ezeket a következő módon kezeljük:\n",
|
|
"\n",
|
|
"- Eldobjuk azokat a leggyakoribb összetevőket, amelyek zavart okoznak az eltérő konyhák között, a `dplyr::select()` használatával.\n",
|
|
"\n",
|
|
"- Egy `recipe`-t használunk, amely előfeldolgozza az adatokat, hogy modellezésre készen álljanak, egy `over-sampling` algoritmus alkalmazásával.\n",
|
|
"\n",
|
|
"Az előző leckében már foglalkoztunk ezekkel, így ez most gyerekjáték lesz 🥳!\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "6tj_rN00hClA"
|
|
},
|
|
"source": [
|
|
"# Load the core Tidyverse and Tidymodels packages\n",
|
|
"library(tidyverse)\n",
|
|
"library(tidymodels)\n",
|
|
"\n",
|
|
"# Load the original cuisines data\n",
|
|
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n",
|
|
"\n",
|
|
"# Drop id column, rice, garlic and ginger from our original data set\n",
|
|
"df_select <- df %>% \n",
|
|
" select(-c(1, rice, garlic, ginger)) %>%\n",
|
|
" # Encode cuisine column as categorical\n",
|
|
" mutate(cuisine = factor(cuisine))\n",
|
|
"\n",
|
|
"\n",
|
|
"# Create data split specification\n",
|
|
"set.seed(2056)\n",
|
|
"cuisines_split <- initial_split(data = df_select,\n",
|
|
" strata = cuisine,\n",
|
|
" prop = 0.7)\n",
|
|
"\n",
|
|
"# Extract the data in each split\n",
|
|
"cuisines_train <- training(cuisines_split)\n",
|
|
"cuisines_test <- testing(cuisines_split)\n",
|
|
"\n",
|
|
"# Display distribution of cuisines in the training set\n",
|
|
"cuisines_train %>% \n",
|
|
" count(cuisine) %>% \n",
|
|
" arrange(desc(n))"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "zFin5yw3hHb1"
|
|
},
|
|
"source": [
|
|
"### Az egyensúlytalan adatok kezelése\n",
|
|
"\n",
|
|
"Az egyensúlytalan adatok gyakran negatívan befolyásolják a modell teljesítményét. Sok modell akkor működik a legjobban, ha a megfigyelések száma egyenlő, ezért hajlamosak nehezen boldogulni az egyensúlytalan adatokkal.\n",
|
|
"\n",
|
|
"Két fő módja van az egyensúlytalan adathalmazok kezelésének:\n",
|
|
"\n",
|
|
"- megfigyelések hozzáadása a kisebbségi osztályhoz: `Túlmintavételezés` (Over-sampling), például a SMOTE algoritmus használatával, amely szintetikusan generál új példákat a kisebbségi osztályból ezeknek az eseteknek a legközelebbi szomszédai alapján.\n",
|
|
"\n",
|
|
"- megfigyelések eltávolítása a többségi osztályból: `Alulminta-vételezés` (Under-sampling)\n",
|
|
"\n",
|
|
"Az előző leckénkben bemutattuk, hogyan lehet egyensúlytalan adathalmazokat kezelni egy `recept` segítségével. A recept egy olyan tervrajzként fogható fel, amely leírja, hogy milyen lépéseket kell alkalmazni egy adathalmazon ahhoz, hogy az elemzésre készen álljon. A mi esetünkben azt szeretnénk elérni, hogy a `tréning halmazunkban` az egyes konyhák száma egyenletesen legyen elosztva. Vágjunk is bele!\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "cRzTnHolhLWd"
|
|
},
|
|
"source": [
|
|
"# Load themis package for dealing with imbalanced data\n",
|
|
"library(themis)\n",
|
|
"\n",
|
|
"# Create a recipe for preprocessing training data\n",
|
|
"cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n",
|
|
" step_smote(cuisine) \n",
|
|
"\n",
|
|
"# Print recipe\n",
|
|
"cuisines_recipe"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "KxOQ2ORhhO81"
|
|
},
|
|
"source": [
|
|
"Most már készen állunk a modellek tanítására 👩💻👨💻!\n",
|
|
"\n",
|
|
"## 3. Több mint multinomiális regressziós modellek\n",
|
|
"\n",
|
|
"Az előző leckében multinomiális regressziós modelleket vizsgáltunk. Nézzünk meg néhány rugalmasabb modellt az osztályozáshoz.\n",
|
|
"\n",
|
|
"### Támogató vektorgépek\n",
|
|
"\n",
|
|
"Az osztályozás kontextusában a `Támogató vektorgépek` egy gépi tanulási technika, amely arra törekszik, hogy megtalálja azt a *hipersíkot*, amely \"legjobban\" elválasztja az osztályokat. Nézzünk egy egyszerű példát:\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/svm.png\"\n",
|
|
" width=\"300\"/>\n",
|
|
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "C4Wsd0vZhXYu"
|
|
},
|
|
"source": [
|
|
"#### Lineáris Támogató Vektor Osztályozó\n",
|
|
"\n",
|
|
"A Támogató Vektor Clustering (SVC) a Támogató Vektor gépek (Support-Vector Machines) gépi tanulási technikák családjának egyik ága. Az SVC-ben a hiper-síkot úgy választják meg, hogy az `legtöbb` tanuló mintát helyesen elkülönítse, de `néhány` megfigyelést hibásan osztályozhat. Azáltal, hogy néhány pontot megengedünk a rossz oldalon, az SVM robusztusabbá válik a kiugró értékekkel szemben, így jobban általánosít az új adatokra. Az ezt a megsértést szabályozó paramétert `költségnek` (cost) nevezik, amelynek alapértelmezett értéke 1 (lásd: `help(\"svm_poly\")`).\n",
|
|
"\n",
|
|
"Hozzunk létre egy lineáris SVC-t azzal, hogy a polinomiális SVM modellben `degree = 1` értéket állítunk be.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "vJpp6nuChlBz"
|
|
},
|
|
"source": [
|
|
"# Make a linear SVC specification\n",
|
|
"svc_linear_spec <- svm_poly(degree = 1) %>% \n",
|
|
" set_engine(\"kernlab\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle specification and recipe into a worklow\n",
|
|
"svc_linear_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(svc_linear_spec)\n",
|
|
"\n",
|
|
"# Print out workflow\n",
|
|
"svc_linear_wf"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "rDs8cWNkhoqu"
|
|
},
|
|
"source": [
|
|
"Most, hogy a *workflow*-ba foglaltuk az előfeldolgozási lépéseket és a modell specifikációját, folytathatjuk a lineáris SVC betanításával, és közben kiértékelhetjük az eredményeket. A teljesítménymutatókhoz hozzunk létre egy metrikakészletet, amely értékelni fogja: `accuracy`, `sensitivity`, `Positive Predicted Value` és `F Measure`.\n",
|
|
"\n",
|
|
"> Az `augment()` oszlop(ok)at fog hozzáadni az előrejelzésekhez a megadott adatokhoz.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "81wiqcwuhrnq"
|
|
},
|
|
"source": [
|
|
"# Train a linear SVC model\n",
|
|
"svc_linear_fit <- svc_linear_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"# Create a metric set\n",
|
|
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"svc_linear_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "0UFQvHf-huo3"
|
|
},
|
|
"source": [
|
|
"#### Támogató vektorgép\n",
|
|
"\n",
|
|
"A támogató vektorgép (SVM) a támogató vektor osztályozó kiterjesztése, amely lehetővé teszi a nemlineáris határvonalak kezelését az osztályok között. Lényegében az SVM-ek a *kernel trükköt* használják, hogy kibővítsék a jellemzőteret, és alkalmazkodjanak az osztályok közötti nemlineáris kapcsolatokhoz. Az SVM-ek által használt egyik népszerű és rendkívül rugalmas kernel függvény a *Radiális bázisfüggvény.* Nézzük meg, hogyan teljesít az adatainkon.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "-KX4S8mzhzmp"
|
|
},
|
|
"source": [
|
|
"set.seed(2056)\n",
|
|
"\n",
|
|
"# Make an RBF SVM specification\n",
|
|
"svm_rbf_spec <- svm_rbf() %>% \n",
|
|
" set_engine(\"kernlab\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle specification and recipe into a worklow\n",
|
|
"svm_rbf_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(svm_rbf_spec)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Train an RBF model\n",
|
|
"svm_rbf_fit <- svm_rbf_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"svm_rbf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "QBFSa7WSh4HQ"
|
|
},
|
|
"source": [
|
|
"Sokkal jobb 🤩!\n",
|
|
"\n",
|
|
"> ✅ Kérlek, nézd meg:\n",
|
|
">\n",
|
|
"> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), Hands-on Machine Learning with R\n",
|
|
">\n",
|
|
"> - [*Support Vector Machines*](https://www.statlearning.com/), An Introduction to Statistical Learning with Applications in R\n",
|
|
">\n",
|
|
"> további olvasmányként.\n",
|
|
"\n",
|
|
"### Legközelebbi szomszéd osztályozók\n",
|
|
"\n",
|
|
"A *K*-legközelebbi szomszéd (KNN) egy olyan algoritmus, amelyben minden megfigyelést a többi megfigyeléshez való *hasonlósága* alapján jósolunk meg.\n",
|
|
"\n",
|
|
"Illesszünk egyet az adatainkra.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "k4BxxBcdh9Ka"
|
|
},
|
|
"source": [
|
|
"# Make a KNN specification\n",
|
|
"knn_spec <- nearest_neighbor() %>% \n",
|
|
" set_engine(\"kknn\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle recipe and model specification into a workflow\n",
|
|
"knn_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(knn_spec)\n",
|
|
"\n",
|
|
"# Train a boosted tree model\n",
|
|
"knn_wf_fit <- knn_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"knn_wf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "HaegQseriAcj"
|
|
},
|
|
"source": [
|
|
"Úgy tűnik, hogy ez a modell nem teljesít túl jól. Valószínűleg a modell paramétereinek módosítása (lásd `help(\"nearest_neighbor\")`) javíthatja a teljesítményt. Mindenképpen érdemes kipróbálni.\n",
|
|
"\n",
|
|
"> ✅ Kérlek, nézd meg:\n",
|
|
">\n",
|
|
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
|
|
">\n",
|
|
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
|
|
">\n",
|
|
"> hogy többet megtudj a *K*-legközelebbi szomszéd (K-Nearest Neighbors) osztályozókról.\n",
|
|
"\n",
|
|
"### Együttes osztályozók\n",
|
|
"\n",
|
|
"Az együttes algoritmusok úgy működnek, hogy több alapbecslőt kombinálnak egy optimális modell létrehozásához, akár:\n",
|
|
"\n",
|
|
"`bagging`: egy *átlagoló függvény* alkalmazásával az alapmodellek gyűjteményére\n",
|
|
"\n",
|
|
"`boosting`: olyan modellek sorozatának építésével, amelyek egymásra épülnek a prediktív teljesítmény javítása érdekében.\n",
|
|
"\n",
|
|
"Kezdjük egy Random Forest modellel, amely egy nagy döntési fa gyűjteményt épít, majd egy átlagoló függvényt alkalmaz, hogy egy jobb általános modellt hozzon létre.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "49DPoVs6iK1M"
|
|
},
|
|
"source": [
|
|
"# Make a random forest specification\n",
|
|
"rf_spec <- rand_forest() %>% \n",
|
|
" set_engine(\"ranger\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle recipe and model specification into a workflow\n",
|
|
"rf_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(rf_spec)\n",
|
|
"\n",
|
|
"# Train a random forest model\n",
|
|
"rf_wf_fit <- rf_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"rf_wf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "RGVYwC_aiUWc"
|
|
},
|
|
"source": [
|
|
"Szép munka 👏!\n",
|
|
"\n",
|
|
"Próbáljunk ki egy Boosted Tree modellt is.\n",
|
|
"\n",
|
|
"A Boosted Tree egy olyan együttes módszert határoz meg, amely egy sor egymást követő döntési fát hoz létre, ahol minden fa az előző fák eredményeire épül, hogy fokozatosan csökkentse a hibát. Azokra az elemekre összpontosít, amelyeket helytelenül osztályoztak, és a következő osztályozó illesztését úgy állítja be, hogy kijavítsa azokat.\n",
|
|
"\n",
|
|
"Különböző módokon lehet illeszteni ezt a modellt (lásd `help(\"boost_tree\")`). Ebben a példában Boosted fákat fogunk illeszteni az `xgboost` motor segítségével.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Py1YWo-micWs"
|
|
},
|
|
"source": [
|
|
"# Make a boosted tree specification\n",
|
|
"boost_spec <- boost_tree(trees = 200) %>% \n",
|
|
" set_engine(\"xgboost\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle recipe and model specification into a workflow\n",
|
|
"boost_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(boost_spec)\n",
|
|
"\n",
|
|
"# Train a boosted tree model\n",
|
|
"boost_wf_fit <- boost_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"boost_wf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "zNQnbuejigZM"
|
|
},
|
|
"source": [
|
|
"> ✅ Kérlek nézd meg:\n",
|
|
">\n",
|
|
"> - [Machine Learning for Social Scientists](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
|
|
">\n",
|
|
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
|
|
">\n",
|
|
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
|
|
">\n",
|
|
"> - <https://algotech.netlify.app/blog/xgboost/> - Az AdaBoost modellt tárgyalja, amely jó alternatívája az xgboost-nak.\n",
|
|
">\n",
|
|
"> hogy többet megtudj az Ensemble osztályozókról.\n",
|
|
"\n",
|
|
"## 4. Extra - több modell összehasonlítása\n",
|
|
"\n",
|
|
"Ebben a laborban elég sok modellt illesztettünk 🙌. Fárasztó vagy időigényes lehet sok munkafolyamatot létrehozni különböző előfeldolgozók és/vagy modell specifikációk alapján, majd egyenként kiszámítani a teljesítménymutatókat.\n",
|
|
"\n",
|
|
"Nézzük meg, hogy tudjuk-e ezt egyszerűsíteni egy olyan függvény létrehozásával, amely egy listányi munkafolyamatot illeszt az edzési adathalmazra, majd visszaadja a teljesítménymutatókat a teszt adathalmaz alapján. Ehhez használni fogjuk a [purrr](https://purrr.tidyverse.org/) csomagból a `map()` és `map_dfr()` függvényeket, hogy függvényeket alkalmazzunk a lista minden elemére.\n",
|
|
"\n",
|
|
"> A [`map()`](https://purrr.tidyverse.org/reference/map.html) függvények lehetővé teszik, hogy sok for ciklust helyettesíts olyan kóddal, amely tömörebb és könnyebben olvasható. A legjobb hely, ahol a [`map()`](https://purrr.tidyverse.org/reference/map.html) függvényekről tanulhatsz, az az [iteráció fejezet](http://r4ds.had.co.nz/iteration.html) az R for Data Science könyvben.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Qzb7LyZnimd2"
|
|
},
|
|
"source": [
|
|
"set.seed(2056)\n",
|
|
"\n",
|
|
"# Create a metric set\n",
|
|
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
|
|
"\n",
|
|
"# Define a function that returns performance metrics\n",
|
|
"compare_models <- function(workflow_list, train_set, test_set){\n",
|
|
" \n",
|
|
" suppressWarnings(\n",
|
|
" # Fit each model to the train_set\n",
|
|
" map(workflow_list, fit, data = train_set) %>% \n",
|
|
" # Make predictions on the test set\n",
|
|
" map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n",
|
|
" # Select desired columns\n",
|
|
" select(model, cuisine, .pred_class) %>% \n",
|
|
" # Evaluate model performance\n",
|
|
" group_by(model) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n",
|
|
" ungroup()\n",
|
|
" )\n",
|
|
" \n",
|
|
"} # End of function"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "Fwa712sNisDA"
|
|
},
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "3i4VJOi2iu-a"
|
|
},
|
|
"source": [
|
|
"# Make a list of workflows\n",
|
|
"workflow_list <- list(\n",
|
|
" \"svc\" = svc_linear_wf,\n",
|
|
" \"svm\" = svm_rbf_wf,\n",
|
|
" \"knn\" = knn_wf,\n",
|
|
" \"random_forest\" = rf_wf,\n",
|
|
" \"xgboost\" = boost_wf)\n",
|
|
"\n",
|
|
"# Call the function\n",
|
|
"set.seed(2056)\n",
|
|
"perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n",
|
|
"\n",
|
|
"# Print out performance metrics\n",
|
|
"perf_metrics %>% \n",
|
|
" group_by(.metric) %>% \n",
|
|
" arrange(desc(.estimate)) %>% \n",
|
|
" slice_head(n=7)\n",
|
|
"\n",
|
|
"# Compare accuracy\n",
|
|
"perf_metrics %>% \n",
|
|
" filter(.metric == \"accuracy\") %>% \n",
|
|
" arrange(desc(.estimate))\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "KuWK_lEli4nW"
|
|
},
|
|
"source": [
|
|
"A [**workflowset**](https://workflowsets.tidymodels.org/) csomag lehetővé teszi a felhasználók számára, hogy sok modellt hozzanak létre és könnyen illesszenek, de elsősorban olyan mintavételi technikákhoz lett tervezve, mint például a `keresztvalidáció`, amelyet még nem tárgyaltunk.\n",
|
|
"\n",
|
|
"## **🚀Kihívás**\n",
|
|
"\n",
|
|
"Ezeknek a technikáknak mindegyike számos paraméterrel rendelkezik, amelyeket módosíthatsz, például az SVM-eknél a `cost`, a KNN-nél a `neighbors`, vagy a Random Forestnél az `mtry` (véletlenszerűen kiválasztott prediktorok).\n",
|
|
"\n",
|
|
"Kutatás során nézd meg az egyes modellek alapértelmezett paramétereit, és gondold át, hogy ezek módosítása mit jelentene a modell minősége szempontjából.\n",
|
|
"\n",
|
|
"Ha többet szeretnél megtudni egy adott modellről és annak paramétereiről, használd a következőt: `help(\"model\")`, például `help(\"rand_forest\")`.\n",
|
|
"\n",
|
|
"> A gyakorlatban általában *becsüljük* a *legjobb értékeket* úgy, hogy sok modellt edzünk egy `szimulált adathalmazon`, és mérjük, hogy ezek a modellek mennyire teljesítenek jól. Ezt a folyamatot **hangolásnak** nevezzük.\n",
|
|
"\n",
|
|
"### [**Előadás utáni kvíz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
|
|
"\n",
|
|
"### **Áttekintés és önálló tanulás**\n",
|
|
"\n",
|
|
"Ezekben a leckékben sok szakzsargon található, ezért szánj egy percet arra, hogy átnézd [ezt a listát](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) a hasznos terminológiáról!\n",
|
|
"\n",
|
|
"#### KÖSZÖNET ILLETI:\n",
|
|
"\n",
|
|
"[`Allison Horst`](https://twitter.com/allison_horst/) az elképesztő illusztrációkért, amelyek barátságosabbá és vonzóbbá teszik az R-t. További illusztrációkat találhatsz a [galériájában](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
|
|
"\n",
|
|
"[Cassie Breviu](https://www.twitter.com/cassieview) és [Jen Looper](https://www.twitter.com/jenlooper) az eredeti Python verzió elkészítéséért ♥️\n",
|
|
"\n",
|
|
"Boldog tanulást kívánok,\n",
|
|
"\n",
|
|
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
|
|
" width=\"569\"/>\n",
|
|
" <figcaption>Illusztráció: @allison_horst</figcaption>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Felelősségkizárás**: \nEz a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális, emberi fordítást igénybe venni. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy téves értelmezésekért.\n"
|
|
]
|
|
}
|
|
]
|
|
} |