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.
ML-For-Beginners/translations/ru/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb

650 lines
34 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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-08-29T23:49:57+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "ru"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": [
"# Построить модель классификации: Вкусные азиатские и индийские кухни\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## Классификаторы кухни 2\n",
"\n",
"Во втором уроке по классификации мы изучим `дополнительные способы` классификации категориальных данных. Также мы разберем последствия выбора одного классификатора вместо другого.\n",
"\n",
"### [**Квиз перед лекцией**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **Предварительные знания**\n",
"\n",
"Мы предполагаем, что вы завершили предыдущие уроки, так как будем использовать некоторые концепции, изученные ранее.\n",
"\n",
"Для этого урока нам понадобятся следующие пакеты:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) — это [коллекция пакетов для R](https://www.tidyverse.org/packages), разработанная для того, чтобы сделать работу с данными быстрее, проще и интереснее!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) — это [фреймворк](https://www.tidymodels.org/packages/), представляющий собой коллекцию пакетов для моделирования и машинного обучения.\n",
"\n",
"- `themis`: [пакет themis](https://themis.tidymodels.org/) предоставляет дополнительные шаги для работы с несбалансированными данными.\n",
"\n",
"Вы можете установить их следующим образом:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"Кроме того, приведенный ниже скрипт проверяет, установлены ли у вас необходимые пакеты для выполнения этого модуля, и устанавливает их, если они отсутствуют.\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. Карта классификации**\n",
"\n",
"В нашем [предыдущем уроке](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) мы пытались ответить на вопрос: как выбрать между несколькими моделями? Во многом это зависит от характеристик данных и типа задачи, которую мы хотим решить (например, классификация или регрессия).\n",
"\n",
"Ранее мы узнали о различных вариантах классификации данных, используя шпаргалку от Microsoft. Фреймворк машинного обучения Python, Scikit-learn, предлагает похожую, но более детализированную шпаргалку, которая может помочь сузить выбор оценщиков (другое название классификаторов):\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> Совет: [посетите эту карту онлайн](https://scikit-learn.org/stable/tutorial/machine_learning_map/) и следуйте по пути, чтобы прочитать документацию. \n",
"> \n",
"> [Справочный сайт Tidymodels](https://www.tidymodels.org/find/parsnip/#models) также предоставляет отличную документацию о различных типах моделей.\n",
"\n",
"### **План** 🗺️\n",
"\n",
"Эта карта очень полезна, если вы хорошо понимаете свои данные, так как вы можете «пройтись» по её путям к решению:\n",
"\n",
"- У нас есть >50 образцов\n",
"\n",
"- Мы хотим предсказать категорию\n",
"\n",
"- У нас есть размеченные данные\n",
"\n",
"- У нас меньше 100K образцов\n",
"\n",
"- ✨ Мы можем выбрать Linear SVC\n",
"\n",
"- Если это не сработает, так как у нас числовые данные\n",
"\n",
" - Мы можем попробовать ✨ KNeighbors Classifier\n",
"\n",
" - Если это не сработает, попробуйте ✨ SVC и ✨ Ensemble Classifiers\n",
"\n",
"Это очень полезный маршрут для следования. А теперь давайте приступим к делу, используя [tidymodels](https://www.tidymodels.org/) — фреймворк для моделирования: это последовательная и гибкая коллекция пакетов R, разработанная для поощрения хорошей статистической практики 😊.\n",
"\n",
"## 2. Разделите данные и обработайте несбалансированный набор данных.\n",
"\n",
"Из наших предыдущих уроков мы узнали, что существует набор общих ингредиентов для разных кухонь. Также мы заметили, что распределение количества кухонь было довольно неравномерным.\n",
"\n",
"Мы справимся с этим следующим образом:\n",
"\n",
"- Удалим самые распространённые ингредиенты, которые создают путаницу между различными кухнями, используя `dplyr::select()`.\n",
"\n",
"- Используем `recipe`, который предварительно обрабатывает данные, чтобы подготовить их для моделирования, применяя алгоритм `over-sampling`.\n",
"\n",
"Мы уже рассматривали это в предыдущем уроке, так что это должно быть легко 🥳!\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": [
"### Работа с несбалансированными данными\n",
"\n",
"Несбалансированные данные часто негативно влияют на производительность модели. Многие модели работают лучше всего, когда количество наблюдений равно, и поэтому испытывают трудности с обработкой несбалансированных данных.\n",
"\n",
"Существует два основных способа работы с несбалансированными наборами данных:\n",
"\n",
"- добавление наблюдений к меньшинству: `Over-sampling`, например, с использованием алгоритма SMOTE, который синтетически генерирует новые примеры для меньшинства, используя ближайших соседей этих случаев.\n",
"\n",
"- удаление наблюдений из большинства: `Under-sampling`\n",
"\n",
"В нашем предыдущем уроке мы продемонстрировали, как работать с несбалансированными наборами данных, используя `recipe`. Recipe можно рассматривать как план действий, описывающий, какие шаги следует применить к набору данных, чтобы подготовить его к анализу. В нашем случае мы хотим добиться равномерного распределения количества наших кухонь в `обучающем наборе`. Давайте приступим.\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": [
"Теперь мы готовы обучать модели 👩‍💻👨‍💻!\n",
"\n",
"## 3. За пределами моделей мультиномиальной регрессии\n",
"\n",
"В нашем предыдущем уроке мы рассмотрели модели мультиномиальной регрессии. Давайте изучим более гибкие модели для классификации.\n",
"\n",
"### Машины опорных векторов\n",
"\n",
"В контексте классификации `Машины опорных векторов` — это метод машинного обучения, который пытается найти *гиперплоскость*, которая \"лучше всего\" разделяет классы. Давайте рассмотрим простой пример:\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": [
"H1~ не разделяет классы. H2~ разделяет, но только с небольшим отступом. H3~ разделяет с максимальным отступом.\n",
"\n",
"#### Линейный классификатор опорных векторов\n",
"\n",
"Кластеризация с использованием опорных векторов (SVC) является частью семейства методов машинного обучения, основанных на опорных векторах. В SVC гиперплоскость выбирается таким образом, чтобы правильно разделить `большинство` обучающих наблюдений, но `может ошибочно классифицировать` некоторые из них. Позволяя некоторым точкам находиться на неправильной стороне, SVM становится более устойчивым к выбросам, что улучшает обобщение на новых данных. Параметр, регулирующий это нарушение, называется `cost` и имеет значение по умолчанию 1 (см. `help(\"svm_poly\")`).\n",
"\n",
"Давайте создадим линейный SVC, установив `degree = 1` в полиномиальной модели SVM.\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": [
"Теперь, когда мы зафиксировали шаги предварительной обработки и спецификацию модели в *workflow*, мы можем приступить к обучению линейного SVC и одновременно оценить результаты. Для оценки производительности давайте создадим набор метрик, который будет учитывать: `accuracy` (точность), `sensitivity` (чувствительность), `Positive Predicted Value` (положительное прогностическое значение) и `F Measure` (F-мера).\n",
"\n",
"> `augment()` добавит столбец(ы) с предсказаниями к предоставленным данным.\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": [
"#### Машина опорных векторов\n",
"\n",
"Машина опорных векторов (SVM) является расширением классификатора опорных векторов, позволяющим учитывать нелинейную границу между классами. По сути, SVM использует *трюк с ядром* для увеличения пространства признаков, чтобы адаптироваться к нелинейным взаимосвязям между классами. Одной из популярных и чрезвычайно гибких функций ядра, используемых в SVM, является *радиальная базисная функция*. Давайте посмотрим, как она справится с нашими данными.\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": [
"Намного лучше 🤩!\n",
"\n",
"> ✅ Пожалуйста, ознакомьтесь:\n",
">\n",
"> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), Практическое машинное обучение с использованием R\n",
">\n",
"> - [*Support Vector Machines*](https://www.statlearning.com/), Введение в статистическое обучение с приложениями на R\n",
">\n",
"> для дополнительного чтения.\n",
"\n",
"### Классификаторы ближайших соседей\n",
"\n",
"Алгоритм *K*-ближайших соседей (KNN) предсказывает каждое наблюдение на основе его *сходства* с другими наблюдениями.\n",
"\n",
"Давайте применим его к нашим данным.\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": [
"Кажется, что эта модель работает не очень хорошо. Вероятно, изменение аргументов модели (см. `help(\"nearest_neighbor\")`) улучшит её производительность. Обязательно попробуйте это сделать.\n",
"\n",
"> ✅ Пожалуйста, ознакомьтесь:\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",
"> чтобы узнать больше о классификаторах *K*-ближайших соседей.\n",
"\n",
"### Ансамблевые классификаторы\n",
"\n",
"Ансамблевые алгоритмы работают, объединяя несколько базовых оценок для создания оптимальной модели, используя один из подходов:\n",
"\n",
"`bagging`: применение *усредняющей функции* к набору базовых моделей\n",
"\n",
"`boosting`: построение последовательности моделей, которые дополняют друг друга для улучшения предсказательной производительности.\n",
"\n",
"Давайте начнем с модели случайного леса (Random Forest), которая создает большое количество деревьев решений, а затем применяет усредняющую функцию для получения более качественной общей модели.\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": [
"Отличная работа 👏!\n",
"\n",
"Давайте также поэкспериментируем с моделью Boosted Tree.\n",
"\n",
"Boosted Tree определяет ансамблевый метод, который создает серию последовательных деревьев решений, где каждое дерево зависит от результатов предыдущих деревьев, пытаясь постепенно уменьшить ошибку. Этот метод фокусируется на весах неправильно классифицированных элементов и корректирует подгонку для следующего классификатора, чтобы исправить ошибки.\n",
"\n",
"Существует несколько способов подгонки этой модели (см. `help(\"boost_tree\")`). В этом примере мы будем подгонять Boosted Trees с использованием движка `xgboost`.\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": [
"> ✅ Пожалуйста, ознакомьтесь:\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/> - Рассматривается модель AdaBoost, которая является хорошей альтернативой xgboost.\n",
">\n",
"> чтобы узнать больше о ансамблевых классификаторах.\n",
"\n",
"## 4. Дополнительно - сравнение нескольких моделей\n",
"\n",
"Мы обучили довольно много моделей в этой лабораторной работе 🙌. Создание множества рабочих процессов с различными наборами препроцессоров и/или спецификаций моделей, а затем расчет метрик производительности по одной может стать утомительным или обременительным.\n",
"\n",
"Давайте посмотрим, сможем ли мы решить эту задачу, создав функцию, которая обучает список рабочих процессов на обучающем наборе, а затем возвращает метрики производительности на основе тестового набора. Мы будем использовать `map()` и `map_dfr()` из пакета [purrr](https://purrr.tidyverse.org/), чтобы применять функции к каждому элементу списка.\n",
"\n",
"> Функции [`map()`](https://purrr.tidyverse.org/reference/map.html) позволяют заменить множество циклов for на код, который более лаконичен и легче читается. Лучшее место для изучения функций [`map()`](https://purrr.tidyverse.org/reference/map.html) — это [глава об итерациях](http://r4ds.had.co.nz/iteration.html) в книге \"R for Data Science\".\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": [
"[**workflowset**](https://workflowsets.tidymodels.org/) пакет позволяет пользователям создавать и легко подбирать большое количество моделей, но в основном предназначен для работы с методами повторной выборки, такими как `кросс-валидация`, подход, который мы еще не рассматривали.\n",
"\n",
"## **🚀Задача**\n",
"\n",
"Каждая из этих техник имеет множество параметров, которые можно настроить, например, `cost` в SVM, `neighbors` в KNN, `mtry` (случайно выбранные предикторы) в Random Forest.\n",
"\n",
"Изучите параметры по умолчанию для каждой из них и подумайте, что изменение этих параметров может означать для качества модели.\n",
"\n",
"Чтобы узнать больше о конкретной модели и ее параметрах, используйте: `help(\"model\")`, например, `help(\"rand_forest\")`.\n",
"\n",
"> На практике мы обычно *оцениваем* *лучшие значения* для этих параметров, обучая множество моделей на `смоделированном наборе данных` и измеряя, насколько хорошо эти модели работают. Этот процесс называется **тюнингом**.\n",
"\n",
"### [**Викторина после лекции**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **Обзор и самостоятельное изучение**\n",
"\n",
"В этих уроках много терминологии, поэтому уделите минуту, чтобы просмотреть [этот список](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) полезных терминов!\n",
"\n",
"#### СПАСИБО:\n",
"\n",
"[`Эллисон Хорст`](https://twitter.com/allison_horst/) за создание потрясающих иллюстраций, которые делают R более доступным и увлекательным. Найдите больше иллюстраций в ее [галерее](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
"\n",
"[Кэсси Бревью](https://www.twitter.com/cassieview) и [Джен Лупер](https://www.twitter.com/jenlooper) за создание оригинальной версии этого модуля на Python ♥️\n",
"\n",
"Приятного обучения,\n",
"\n",
"[Эрик](https://twitter.com/ericntay), Золотой Студенческий Посол Microsoft Learn.\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"569\"/>\n",
" <figcaption>Иллюстрация от @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Отказ от ответственности**: \nЭтот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.\n"
]
}
]
}