1. Контролируемое обучение

Как это работает. Этот алгоритм состоит из переменной цели/результата (или зависимой переменной), которую нужно спрогнозировать на основе заданного набора предикторов (независимых переменных). Используя этот набор переменных, мы создаем функцию, которая сопоставляет входные данные с желаемыми выходными данными. Процесс обучения продолжается до тех пор, пока модель не достигнет желаемого уровня точности обучающих данных. Примеры контролируемого обучения: регрессия, дерево решений, случайный лес, KNN, логистическая регрессия и т. д.

2. Неконтролируемое обучение

Как это работает. В этом алгоритме у нас нет цели или переменной результата для прогнозирования/оценки. Он используется для группирования населения в разные группы, что широко используется для сегментации клиентов в разные группы для конкретного вмешательства. Примеры обучения без учителя: априорный алгоритм, K-средних.

3. Обучение с подкреплением:

Принцип работы. С помощью этого алгоритма машина обучается принимать конкретные решения. Это работает следующим образом: машина подвергается воздействию окружающей среды, в которой она постоянно тренируется методом проб и ошибок. Эта машина учится на прошлом опыте и старается максимально использовать знания для принятия точных бизнес-решений. Пример обучения с подкреплением: марковский процесс принятия решений

Список распространенных алгоритмов машинного обучения

Вот список часто используемых алгоритмов машинного обучения. Эти алгоритмы можно применить практически к любой задаче с данными:

1. Линейная регрессия

2. Логистическая регрессия

3. Дерево решений

4. СВМ

5. Наивный Байес

6. снн

7. К-средние

8. Случайный лес

9. Алгоритмы уменьшения размерности

10. Алгоритмы повышения градиента

1. ГБМ

2. XGBoost

3. СветГБМ

4. CatBoost

1. Линейная регрессия

Он используется для оценки реальных значений (стоимость домов, количество звонков, общий объем продаж и т. д.) на основе непрерывных переменных. Здесь мы устанавливаем связь между независимыми и зависимыми переменными, подбирая наилучшую линию. Эта линия наилучшего соответствия известна как линия регрессии и представлена ​​линейным уравнением Y = a * X + b.

Лучший способ понять линейную регрессию — пережить этот опыт детства. Скажем, вы просите пятиклассника расположить людей в его классе в порядке возрастания веса, не спрашивая их веса! Как вы думаете, что будет делать ребенок? Скорее всего, он/она будет смотреть (визуально анализировать) на рост и комплекцию людей и расставлять их по комбинации этих видимых параметров. Это линейная регрессия в реальной жизни! Ребенок на самом деле понял, что рост и телосложение будут коррелировать с весом соотношением, которое выглядит как приведенное выше уравнение.

В этом уравнении:

· Y — зависимая переменная

· а — наклон

· X — Независимая переменная

· б — Перехват

Эти коэффициенты a и b получены на основе минимизации суммы квадратов разности расстояний между точками данных и линией регрессии.

Посмотрите на приведенный ниже пример. Здесь мы определили наиболее подходящую линию, имеющую линейное уравнение y=0,2811x+13,9. Теперь с помощью этого уравнения мы можем найти вес, зная рост человека.

Линейная регрессия в основном бывает двух типов: простая линейная регрессия и множественная линейная регрессия. Простая линейная регрессия характеризуется одной независимой переменной. И множественная линейная регрессия (как следует из названия) характеризуется несколькими (более 1) независимыми переменными. Находя наилучшую линию соответствия, вы можете подобрать полиномиальную или криволинейную регрессию. И они известны как полиномиальная или криволинейная регрессия.

R-код

#Загрузить наборы данных Train и Test

# Идентифицировать функцию и переменные ответа и значения должны быть числовыми и пустыми массивами

x_train ‹- input_variables_values_training_datasets

y_train ‹- target_variables_values_training_datasets

x_test ‹- input_variables_values_test_datasets

х ‹- cbind(x_train,y_train)

# Обучите модель, используя тренировочные наборы, и проверьте результат

линейный ‹- lm(y_train ~ ., data = x)

резюме (линейное)

#Прогнозировать вывод

предсказанный = предсказать (линейный, x_test)

2. Логистическая регрессия

Не запутайтесь в его названии! Это классификация, а не алгоритм регрессии. Он используется для оценки дискретных значений (двоичных значений, таких как 0/1, да/нет, истина/ложь) на основе заданного набора независимых переменных. Проще говоря, он предсказывает вероятность возникновения события, подгоняя данные к логит-функции. Следовательно, он также известен как логит-регрессия. Поскольку он предсказывает вероятность, его выходные значения лежат между 0 и 1.

Опять же, давайте попробуем понять это на простом примере.

Допустим, ваш друг дает вам решить головоломку. Есть только 2 варианта исхода — либо ты его решишь, либо нет. А теперь представьте, что вам задают множество головоломок/викторин, пытаясь понять, в каких предметах вы хороши. Результат этого исследования будет примерно таким: если вам дали задачу десятого класса по тригонометрии, вероятность того, что вы решите ее, составляет 70%. С другой стороны, если это вопрос по истории пятого класса, вероятность получить ответ составляет всего 30%. Это то, что дает вам логистическая регрессия.

Что касается математики, то логарифмические шансы результата моделируются как линейная комбинация переменных-предикторов.

шансы = p/ (1-p) = вероятность возникновения события / вероятность отсутствия события

ln(шансы) = ln(p/(1-p))

logit(p) = ln(p/(1-p)) = b0+b1X1+b2X2+b3X3….+bkXk

Выше p — это вероятность наличия интересующей характеристики. Он выбирает параметры, которые максимизируют вероятность наблюдения выборочных значений, а не минимизируют сумму квадратов ошибок (как в обычной регрессии).

Вы можете спросить, а зачем брать бревно? Для простоты скажем, что это один из лучших математических способов воспроизведения ступенчатой ​​функции. Я могу рассказать подробнее, но это не будет целью этой статьи.

R-код

х ‹- cbind(x_train,y_train)

# Обучите модель, используя тренировочные наборы, и проверьте результат

логистика ‹- glm(y_train ~ ., data = x,family='биномиальный')

резюме (логистика)

#Прогнозировать вывод

предсказано = предсказано (логистика, x_test)

Более того.

Есть много разных шагов, которые можно попробовать, чтобы улучшить модель:

· включая условия взаимодействия

· удаление признаков

· методы регуляризации

· использование нелинейной модели

3. Дерево решений

Это один из моих любимых алгоритмов, и я использую его довольно часто. Это тип алгоритма обучения с учителем, который в основном используется для задач классификации. Удивительно, но он работает как для категориальных, так и для непрерывных зависимых переменных. В этом алгоритме мы разбиваем популяцию на два или более однородных множества. Это делается на основе наиболее значимых атрибутов/независимых переменных, чтобы создать как можно более четкие группы. Для получения более подробной информации вы можете прочитать: Упрощенное дерево решений.

Лучший способ понять, как работает дерево решений, — сыграть в Jezzball — классическую игру от Microsoft (изображение ниже). По сути, у вас есть комната с движущимися стенами, и вам нужно создать стены так, чтобы максимальное пространство было расчищено без шаров.

Итак, каждый раз, когда вы разделяете комнату стеной, вы пытаетесь создать 2 разных населения в одной комнате. Деревья решений работают очень похожим образом, разделяя совокупность на как можно более разные группы.

R-код

библиотека (часть)

х ‹- cbind(x_train,y_train)

# вырастить дерево

подходит ‹- rpart (y_train ~ ., данные = x, метод = «класс»)

резюме (подходит)

#Прогнозировать вывод

предсказано = предсказано (подходит, x_test)

4. SVM (Машина опорных векторов)

Это метод классификации. В этом алгоритме мы отображаем каждый элемент данных как точку в n-мерном пространстве (где n — количество имеющихся у вас объектов), при этом значение каждого объекта является значением конкретной координаты.

Например, если бы у нас было только две функции, такие как рост и длина волос человека, мы бы сначала нанесли эти две переменные в двухмерное пространство, где каждая точка имеет две координаты (эти координаты известны как Опорные векторы)

Теперь мы найдем некоторую строку, которая разделяет данные между двумя разными группами данных. Это будет линия, при которой расстояния от ближайшей точки в каждой из двух групп будут наибольшими.

В показанном выше примере линия, которая разбивает данные на две группы с разной классификацией, является черной линией, поскольку две ближайшие точки находятся дальше всего от линии. Эта строка является нашим классификатором. Затем, в зависимости от того, где находятся данные тестирования по обе стороны от линии, к какому классу мы можем отнести новые данные.

Думайте об этом алгоритме как об игре Jez Ball в n-мерном пространстве. Изменения в игре:

· Вы можете рисовать линии/плоскости под любыми углами (а не только горизонтально или вертикально, как в классической игре)

· Цель игры состоит в том, чтобы разделить шары разных цветов в разных комнатах.

И шарики не двигаются.

R-код

библиотека (e1071)

х ‹- cbind(x_train,y_train)

# Подходящая модель

подходит ‹-svm (y_train ~ ., данные = x)

резюме (подходит)

#Прогнозировать вывод

предсказано = предсказано (подходит, x_test)

5. Наивный Байес

Это метод классификации, основанный на теореме Байеса с предположением о независимости между предикторами. Проще говоря, наивный байесовский классификатор предполагает, что наличие определенной функции в классе не связано с наличием какой-либо другой функции. Например, фрукт можно считать яблоком, если он красный, круглый и имеет диаметр около 3 дюймов. Даже если эти признаки зависят друг от друга или от существования других признаков, наивный байесовский классификатор будет считать, что все эти свойства независимо влияют на вероятность того, что этот фрукт является яблоком.

Наивную байесовскую модель легко построить, и она особенно полезна для очень больших наборов данных. Известно, что наряду с простотой Наивный Байес превосходит даже очень сложные методы классификации.

Теорема Байеса обеспечивает способ вычисления апостериорной вероятности P(c|x) из P(c), P(x) и P(x|c). Посмотрите на уравнение ниже:

Здесь,

· P(c|x) — апостериорная вероятность класса (цель) с учетом предиктора (атрибут).

· P(c) — априорная вероятность класса.

· P(x|c) — это вероятность, которая является вероятностью предиктора данного класса.

· P(x) — априорная вероятность предиктора.

Пример. Давайте разберемся на примере. Ниже у меня есть набор обучающих данных о погоде и соответствующей целевой переменной «Играть». Теперь нам нужно классифицировать, будут ли игроки играть или нет, в зависимости от погодных условий. Давайте выполним следующие шаги, чтобы выполнить это.

Шаг 1: Преобразуйте набор данных в таблицу частот

Шаг 2: Создайте таблицу вероятностей, найдя такие вероятности, как вероятность пасмурной погоды = 0,29 и вероятность игры 0,64.

Шаг 3: Теперь используйте наивное байесовское уравнение для расчета апостериорной вероятности для каждого класса. Класс с наибольшей апостериорной вероятностью является результатом предсказания.

Проблема:Игроки будут платить, если будет солнечная погода. Верно ли это утверждение?

Мы можем решить это, используя описанный выше метод, поэтому P (Да | Солнечно) = P ( Солнечно | Да) * P (Да) / P (Солнечно)

Здесь мы имеем P (Солнечно | Да) = 3/9 = 0,33, P (Солнечно) = 5/14 = 0,36, P (Да) = 9/14 = 0,64.

Теперь P (Да | Солнечно) = 0,33 * 0,64 / 0,36 = 0,60, что имеет более высокую вероятность.

Наивный Байес использует аналогичный метод для прогнозирования вероятности другого класса на основе различных атрибутов. Этот алгоритм в основном используется для классификации текстов и задач, имеющих несколько классов.

R-код

библиотека (e1071)

х ‹- cbind(x_train,y_train)

# Подходящая модель

подходит ‹-naiveBayes (y_train ~ ., data = x)

резюме (подходит)

#Прогнозировать вывод

предсказано = предсказано (подходит, x_test)

6. kNN (k- Ближайшие соседи)

Его можно использовать как для задач классификации, так и для задач регрессии. Однако он более широко используется в задачах классификации в промышленности. K ближайших соседей — это простой алгоритм, который хранит все доступные наблюдения и классифицирует новые наблюдения большинством голосов своих k соседей. Случай, отнесенный к классу, наиболее распространен среди его ближайших K соседей, измеренных функцией расстояния.

Эти функции расстояния могут быть евклидовыми, манхэттенскими, расстояниями Минковского и Хэмминга. Первые три функции используются для непрерывной функции, а четвертая (Хемминга) — для категориальных переменных. Если K = 1, то случай просто относится к классу ближайшего соседа. Иногда выбор K оказывается сложной задачей при моделировании kNN.

KNN можно легко сопоставить с нашей реальной жизнью. Если вы хотите узнать о человеке, о котором у вас нет информации, вы можете узнать о его близких друзьях и кругах, в которых он вращается, и получить доступ к его/ее информации!

На что следует обратить внимание перед выбором kNN:

· KNN требует больших вычислительных ресурсов

· Переменные должны быть нормализованы, иначе переменные с более высоким диапазоном могут привести к смещению.

· Больше работает на этапе предварительной обработки, прежде чем перейти к kNN, как выброс, удаление шума

R-код

библиотека (кнн)

х ‹- cbind(x_train,y_train)

# Подходящая модель

подходит ‹-knn (y_train ~ ., данные = x, k = 5)

резюме (подходит)

#Прогнозировать вывод

предсказано = предсказано (подходит, x_test)

7. К-средние

Это тип неконтролируемого алгоритма, который решает проблему кластеризации. Его процедура следует простому и легкому способу классификации заданного набора данных с помощью определенного количества кластеров (предположим, что кластеров k). Точки данных внутри кластера однородны и неоднородны по отношению к одноранговым группам.

Помните, как вычисляли формы из чернильных пятен? k означает что-то похожее на это действие. Вы смотрите на форму и расплываетесь, чтобы расшифровать, сколько разных кластеров / популяций присутствует!

Как K-means формирует кластер:

1. K-средних выбирает k точек для каждого кластера, известного как центроиды.

2. Каждая точка данных образует кластер с ближайшими центроидами, т.е. k кластеров.

3. Находит центр тяжести каждого кластера на основе существующих элементов кластера. Здесь у нас есть новые центроиды.

4. Когда у нас появятся новые центроиды, повторите шаги 2 и 3. Найдите ближайшее расстояние для каждой точки данных от новых центроидов и свяжите их с новыми k-кластерами. Повторяйте этот процесс до тех пор, пока не произойдет сходимость, то есть центроиды не изменятся.

Как определить значение K:

В K-средних у нас есть кластеры, и каждый кластер имеет свой собственный центроид. Сумма квадратов разности между центроидом и точками данных в кластере составляет сумму квадратов значений для этого кластера. Кроме того, когда сумма квадратов значений для всех кластеров суммируется, она становится суммой в пределах суммы квадратов значений для кластерного решения.

Мы знаем, что по мере увеличения числа кластеров это значение продолжает уменьшаться, но если вы построите график, вы увидите, что сумма квадратов расстояний резко уменьшается до некоторого значения k, а затем гораздо медленнее. Здесь мы можем найти оптимальное количество кластеров.

R-код

библиотека (кластер)

fit ‹- kmeans(X, 3) # 5 кластерное решение

8. Случайный лес

Случайный лес — это торговая марка ансамбля деревьев решений. В Random Forest у нас есть набор деревьев решений (так называемый «Лес»). Чтобы классифицировать новый объект на основе атрибутов, каждое дерево дает классификацию, и мы говорим, что дерево «голосует» за этот класс. Лес выбирает классификацию, набравшую наибольшее количество голосов (из всех деревьев в лесу).

Каждое дерево сажают и выращивают следующим образом:

1. Если количество случаев в обучающей выборке равно N, то выборка из N случаев берется случайным образом, но с замещением. Этот образец будет обучающим набором для выращивания дерева.

2. Если имеется M входных переменных, задается число m‹‹M таким образом, что в каждом узле из M случайным образом выбираются m переменных, и для разделения узла используется наилучшее разбиение на этих m. Величина m поддерживается постоянной во время выращивания леса.

3. Каждое дерево выращено в максимально возможной степени. Обрезки нет.

R-код

библиотека (randomForest)

х ‹- cbind(x_train,y_train)

# Подходящая модель

подходит ‹- randomForest (виды ~ ., x, ntree = 500)

резюме (подходит)

#Прогнозировать вывод

предсказано = предсказано (подходит, x_test)

9. Алгоритмы уменьшения размерности

За последние 4–5 лет наблюдается экспоненциальный рост сбора данных на всех возможных этапах. Корпорации/государственные учреждения/исследовательские организации не только приходят с новыми источниками, но и собирают данные в мельчайших деталях.

Например: компании электронной коммерции собирают больше деталей о клиентах, таких как их демографические данные, история веб-сканирования, что им нравится или не нравится, история покупок, отзывы и многое другое, чтобы уделять им больше персонального внимания, чем вашему ближайшему владельцу продуктового магазина.

Как специалисту по данным, данные, которые нам предлагают, также состоят из множества функций, это звучит хорошо для построения хорошей надежной модели, но есть проблема. Как вы определили высокозначимые переменные из 1000 или 2000? В таких случаях алгоритм уменьшения размерности помогает нам наряду с различными другими алгоритмами, такими как дерево решений, случайный лес, PCA, факторный анализ, идентификация на основе матрицы корреляции, коэффициент пропущенных значений и другие.

R-код

библиотека (статистика)

pca ‹- princomp(train, cor = TRUE)

train_reduced ‹- предсказать(PCA,поезд)

test_reduced ‹- предсказать (PCA, тест)

10. Алгоритмы повышения градиента

10.1. ГБМ

GBM — это алгоритм повышения, используемый, когда мы имеем дело с большим количеством данных, чтобы сделать прогноз с высокой мощностью прогноза. Повышение на самом деле представляет собой ансамбль алгоритмов обучения, который сочетает в себе предсказание нескольких базовых оценок для повышения надежности по сравнению с одной оценкой. Он объединяет несколько слабых или средних предикторов для построения сильного предиктора. Эти алгоритмы повышения всегда хорошо работают на соревнованиях по науке о данных, таких как Kaggle, AV Hackathon.

R-код

библиотека (каре)

х ‹- cbind(x_train,y_train)

# Подходящая модель

fitControl ‹- trainControl (метод = «repeatedcv», число = 4, повторы = 4)

fit ‹- train(y ~ ., data = x, method = «gbm», trControl = fitControl, verbose = FALSE)

предсказанный = предсказать (подходящий, x_test, тип = «проблема») [, 2]

Gradient_Boosting_Classifier и Random Forest — это два разных классификатора повышающего дерева, и часто люди спрашивают о разнице между этими двумя алгоритмами.

10.2. XGBoost

Еще один классический алгоритм повышения градиента, который, как известно, является решающим выбором между победой и поражением в некоторых соревнованиях Kaggle.

XGBoost обладает чрезвычайно высокой прогностической способностью, что делает его лучшим выбором для обеспечения точности событий, поскольку он обладает как линейной моделью, так и алгоритмом обучения по дереву, что делает алгоритм почти в 10 раз быстрее, чем существующие методы повышения градиента.

Поддержка включает в себя различные целевые функции, включая регрессию, классификацию и ранжирование.

Одна из самых интересных особенностей XGBoost заключается в том, что его также называют методом регуляризованного повышения. Это помогает уменьшить моделирование с переобучением и обеспечивает массовую поддержку ряда языков, таких как Scala, Java, R, Python, Julia и C++.

Поддерживает распределенное и повсеместное обучение на многих компьютерах, включающих кластеры GCE, AWS, Azure и Yarn. XGBoost также можно интегрировать со Spark, Flink и другими облачными системами потоков данных со встроенной перекрестной проверкой на каждой итерации процесса повышения.

Код R:

требуют (вставка)

х ‹- cbind(x_train,y_train)

# Подходящая модель

TrainControl ‹- trainControl (метод = «repeatedcv», число = 10, повторы = 4)

модель‹-train(y ~ ., data = x, method = «xgbLinear», trControl = TrainControl, verbose = FALSE)

OR

модель‹-train(y ~ ., data = x, method = «xgbTree», trControl = TrainControl, verbose = FALSE)

предсказано ‹- предсказать (модель, x_test)

10.3. СветGBM

LightGBM — это фреймворк повышения градиента, использующий алгоритмы обучения на основе дерева. Он предназначен для распределения и эффективности со следующими преимуществами:

· Более высокая скорость обучения и более высокая эффективность

· Меньшее использование памяти

· Лучшая точность

· Поддерживается параллельное обучение и обучение на графическом процессоре

· Возможность обработки больших объемов данных

Фреймворк представляет собой быстрый и высокопроизводительный градиентный бустинг, основанный на алгоритмах дерева решений, используемый для ранжирования, классификации и многих других задач машинного обучения. Он был разработан в рамках проекта Microsoft Distributed Machine Learning Toolkit.

Поскольку LightGBM основан на алгоритмах дерева решений, он разбивает дерево по листу с наилучшей подгонкой, тогда как другие алгоритмы повышения разбивают дерево по глубине или уровню, а не по листу. Таким образом, при выращивании на одном и том же листе в Light GBM листовой алгоритм может уменьшить больше потерь, чем поуровневый алгоритм, и, следовательно, приводит к гораздо большей точности, которая редко может быть достигнута любым из существующих алгоритмов повышения.

Код R:

библиотека (RLightGBM)

данные(пример.binary)

#Параметры

количество_итераций ‹- 100

config ‹- list(objective = «binary», metric = «binary_logloss, auc», learning_rate = 0,1, num_leaves = 63, tree_learner = «serial», feature_fraction = 0,8, bagging_freq = 5, bagging_fraction = 0,8, min_data_in_leaf = 50, min_sum_hessian_in_leaf = 5,0)

#Создать дескриптор данных и бустер

handle.data ‹- lgbm.data.create(x)

lgbm.data.setField(handle.data, «метка», y)

handle.booster ‹- lgbm.booster.create(handle.data, lapply(config, as.character))

#Обучаем на num_iterations итераций и оцениваем каждые 5 шагов

lgbm.booster.train(дескриптор.booster, количество_итераций, 5)

#Предсказывать

pred ‹- lgbm.booster.predict(handle.booster, x.test)

#Проверить точность

сумма (y.test == (y.pred › 0,5)) / длина (y.test)

#Сохранить модель (можно снова загрузить через lgbm.booster.load(имя файла))

lgbm.booster.save(handle.booster, имя файла = «/tmp/model.txt»)

Если вы знакомы с пакетом Caret в R, это еще один способ реализации LightGBM.

требуют (вставка)

требуется (RLightGBM)

данные (ирис)

модель ‹-caretModel.LGBM()

fit ‹- поезд (виды ~ ., данные = ирис, метод = модель, подробность = 0)

печать (подходит)

y.pred ‹- предсказать (соответствие, диафрагма [, 1: 4])

библиотека (матрица)

model.sparse ‹- CaretModel.LGBM.sparse()

#Сгенерировать разреженную матрицу

мат ‹- Матрица (как. матрица (радужная оболочка [, 1: 4]), разреженный = T)

подгонка ‹- поезд (data.frame (idx = 1: nrow (радужная оболочка)), iris $ Species, method = model.sparse, matrix = mat, verbosity = 0)

печать (подходит)

10.4. Повышение кота

Cat Boost — недавно открытый алгоритм машинного обучения от Яндекса. Он может легко интегрироваться с платформами глубокого обучения, такими как TensorFlow от Google и Core ML от Apple.

Самое приятное в CatBoost то, что он не требует обширного обучения данным, как другие модели машинного обучения, и может работать с различными форматами данных; не подрывая того, насколько надежным он может быть.

Убедитесь, что вы хорошо обработали недостающие данные, прежде чем приступить к реализации.

Cat boost может автоматически обрабатывать категориальные переменные, не показывая ошибку преобразования типа, что помогает вам лучше сосредоточиться на настройке модели, а не на исправлении тривиальных ошибок.

Код R:

set.seed(1)

требуют (титанический)

требуют (вставка)

требуется (котобуст)

tt ‹- titanic::titanic_train[complete.cases(titanic::titanic_train),]

данные ‹- as.data.frame(as.matrix(tt), stringsAsFactors = TRUE)

drop_columns = c("PassengerId", "Выжил", "Имя", "Билет", "Кабина")

x ‹- data[,!(names(data) %in% drop_columns)]y ‹- data[,c("Выжил")]

fit_control ‹- trainControl (метод = «cv», число = 4, classProbs = TRUE)

сетка ‹- expand.grid (глубина = c (4, 6, 8), скорость обучения = 0,1, количество итераций = 100, l2_leaf_reg = 1e-3, rsm = 0,95, border_count = 64)

отчет ‹- train(x, as.factor(make.names(y)),method=catboost.caret,verbose=TRUE, preProc=NULL,tuneGrid=grid, trControl=fit_control)

распечатать (отчет)

важность ‹- varImp(отчет, масштаб = FALSE)

печать (важность)