Build a text report showing the main classification metrics.
Parameters y_true 1d array-like, or label indicator array / sparse matrix
Ground truth (correct) target values.
y_pred 1d array-like, or label indicator array / sparse matrix
Estimated targets as returned by a classifier.
labels array-like of shape (n_labels,), default=None
Optional list of label indices to include in the report.
target_names list of str of shape (n_labels,), default=None
Optional display names matching the labels (same order).
sample_weight array-like of shape (n_samples,), default=None
digits int, default=2
output_dict bool, default=False
If True, return output as dict.
New in version 0.20.
Sets the value to return when there is a zero division. If set to “warn”, this acts as 0, but warnings are also raised.
Returns report str or dict
Text summary of the precision, recall, F1 score for each class. Dictionary returned if output_dict is True. Dictionary has the following structure:
The reported averages include macro average (averaging the unweighted mean per label), weighted average (averaging the support-weighted mean per label), and sample average (only for multilabel classification). Micro average (averaging the total true positives, false negatives and false positives) is only shown for multi-label or multi-class with a subset of classes, because it corresponds to accuracy otherwise and would be the same for all metrics. See also precision_recall_fscore_support for more details on averages.
Note that in binary classification, recall of the positive class is also known as “sensitivity”; recall of the negative class is “specificity”.
Метрики в задачах машинного обучения

В задачах машинного обучения для оценки качества моделей и сравнения различных алгоритмов используются метрики, а их выбор и анализ — непременная часть работы датасатаниста.
В этой статье мы рассмотрим некоторые критерии качества в задачах классификации, обсудим, что является важным при выборе метрики и что может пойти не так.
Метрики в задачах классификации
Для демонстрации полезных функций sklearn и наглядного представления метрик мы будем использовать датасет по оттоку клиентов телеком-оператора.
Accuracy, precision и recall
Перед переходом к самим метрикам необходимо ввести важную концепцию для описания этих метрик в терминах ошибок классификации — confusion matrix (матрица ошибок).
Допустим, что у нас есть два класса и алгоритм, предсказывающий принадлежность каждого объекта одному из классов, тогда матрица ошибок классификации будет выглядеть следующим образом:
| True Positive (TP) | False Positive (FP) | |
| False Negative (FN) | True Negative (TN) |
Здесь — это ответ алгоритма на объекте, а
— истинная метка класса на этом объекте.
Таким образом, ошибки классификации бывают двух видов: False Negative (FN) и False Positive (FP).
Accuracy
Интуитивно понятной, очевидной и почти неиспользуемой метрикой является accuracy — доля правильных ответов алгоритма:
Эта метрика бесполезна в задачах с неравными классами, и это легко показать на примере.
Допустим, мы хотим оценить работу спам-фильтра почты. У нас есть 100 не-спам писем, 90 из которых наш классификатор определил верно (True Negative = 90, False Positive = 10), и 10 спам-писем, 5 из которых классификатор также определил верно (True Positive = 5, False Negative = 5).
Тогда accuracy:
Однако если мы просто будем предсказывать все письма как не-спам, то получим более высокую accuracy:
При этом, наша модель совершенно не обладает никакой предсказательной силой, так как изначально мы хотели определять письма со спамом. Преодолеть это нам поможет переход с общей для всех классов метрики к отдельным показателям качества классов.
Precision, recall и F-мера
Для оценки качества работы алгоритма на каждом из классов по отдельности введем метрики precision (точность) и recall (полнота).
Precision можно интерпретировать как долю объектов, названных классификатором положительными и при этом действительно являющимися положительными, а recall показывает, какую долю объектов положительного класса из всех объектов положительного класса нашел алгоритм.
Именно введение precision не позволяет нам записывать все объекты в один класс, так как в этом случае мы получаем рост уровня False Positive. Recall демонстрирует способность алгоритма обнаруживать данный класс вообще, а precision — способность отличать этот класс от других классов.
Как мы отмечали ранее, ошибки классификации бывают двух видов: False Positive и False Negative. В статистике первый вид ошибок называют ошибкой I-го рода, а второй — ошибкой II-го рода. В нашей задаче по определению оттока абонентов, ошибкой первого рода будет принятие лояльного абонента за уходящего, так как наша нулевая гипотеза состоит в том, что никто из абонентов не уходит, а мы эту гипотезу отвергаем. Соответственно, ошибкой второго рода будет являться «пропуск» уходящего абонента и ошибочное принятие нулевой гипотезы.
Precision и recall не зависят, в отличие от accuracy, от соотношения классов и потому применимы в условиях несбалансированных выборок.
Часто в реальной практике стоит задача найти оптимальный (для заказчика) баланс между этими двумя метриками. Классическим примером является задача определения оттока клиентов.
Очевидно, что мы не можем находить всех уходящих в отток клиентов и только их. Но, определив стратегию и ресурс для удержания клиентов, мы можем подобрать нужные пороги по precision и recall. Например, можно сосредоточиться на удержании только высокодоходных клиентов или тех, кто уйдет с большей вероятностью, так как мы ограничены в ресурсах колл-центра.
Обычно при оптимизации гиперпараметров алгоритма (например, в случае перебора по сетке GridSearchCV ) используется одна метрика, улучшение которой мы и ожидаем увидеть на тестовой выборке.
Существует несколько различных способов объединить precision и recall в агрегированный критерий качества. F-мера (в общем случае ) — среднее гармоническое precision и recall :
в данном случае определяет вес точности в метрике, и при
это среднее гармоническое (с множителем 2, чтобы в случае precision = 1 и recall = 1 иметь
)
F-мера достигает максимума при полноте и точности, равными единице, и близка к нулю, если один из аргументов близок к нулю.
В sklearn есть удобная функция _metrics.classificationreport, возвращающая recall, precision и F-меру для каждого из классов, а также количество экземпляров каждого класса.
| class | precision | recall | f1-score | support |
|---|---|---|---|---|
| Non-churned | 0.88 | 0.97 | 0.93 | 941 |
| Churned | 0.60 | 0.25 | 0.35 | 159 |
| avg / total | 0.84 | 0.87 | 0.84 | 1100 |
Здесь необходимо отметить, что в случае задач с несбалансированными классами, которые превалируют в реальной практике, часто приходится прибегать к техникам искусственной модификации датасета для выравнивания соотношения классов. Их существует много, и мы не будем их касаться, здесь можно посмотреть некоторые методы и выбрать подходящий для вашей задачи.
AUC-ROC и AUC-PR
При конвертации вещественного ответа алгоритма (как правило, вероятности принадлежности к классу, отдельно см. SVM) в бинарную метку, мы должны выбрать какой-либо порог, при котором 0 становится 1. Естественным и близким кажется порог, равный 0.5, но он не всегда оказывается оптимальным, например, при вышеупомянутом отсутствии баланса классов.
Одним из способов оценить модель в целом, не привязываясь к конкретному порогу, является AUC-ROC (или ROC AUC) — площадь (Area Under Curve) под кривой ошибок (Receiver Operating Characteristic curve ). Данная кривая представляет из себя линию от (0,0) до (1,1) в координатах True Positive Rate (TPR) и False Positive Rate (FPR):
TPR нам уже известна, это полнота, а FPR показывает, какую долю из объектов negative класса алгоритм предсказал неверно. В идеальном случае, когда классификатор не делает ошибок (FPR = 0, TPR = 1) мы получим площадь под кривой, равную единице; в противном случае, когда классификатор случайно выдает вероятности классов, AUC-ROC будет стремиться к 0.5, так как классификатор будет выдавать одинаковое количество TP и FP.
Каждая точка на графике соответствует выбору некоторого порога. Площадь под кривой в данном случае показывает качество алгоритма (больше — лучше), кроме этого, важной является крутизна самой кривой — мы хотим максимизировать TPR, минимизируя FPR, а значит, наша кривая в идеале должна стремиться к точке (0,1).
Критерий AUC-ROC устойчив к несбалансированным классам (спойлер: увы, не всё так однозначно) и может быть интерпретирован как вероятность того, что случайно выбранный positive объект будет проранжирован классификатором выше (будет иметь более высокую вероятность быть positive), чем случайно выбранный negative объект.
Рассмотрим следующую задачу: нам необходимо выбрать 100 релевантных документов из 1 миллиона документов. Мы намашинлернили два алгоритма:
Скорее всего, мы бы выбрали первый алгоритм, который выдает очень мало False Positive на фоне своего конкурента. Но разница в False Positive Rate между этими двумя алгоритмами крайне мала — всего 0.0019. Это является следствием того, что AUC-ROC измеряет долю False Positive относительно True Negative и в задачах, где нам не так важен второй (больший) класс, может давать не совсем адекватную картину при сравнении алгоритмов.
Для того чтобы поправить положение, вернемся к полноте и точности :
Здесь уже заметна существенная разница между двумя алгоритмами — 0.855 в точности!
Precision и recall также используют для построения кривой и, аналогично AUC-ROC, находят площадь под ней.
Здесь можно отметить, что на маленьких датасетах площадь под PR-кривой может быть чересчур оптимистична, потому как вычисляется по методу трапеций, но обычно в таких задачах данных достаточно. За подробностями о взаимоотношениях AUC-ROC и AUC-PR можно обратиться сюда.
Logistic Loss
Особняком стоит логистическая функция потерь, определяемая как:
здесь — это ответ алгоритма на
-ом объекте,
— истинная метка класса на
-ом объекте, а
размер выборки.
Подробно про математическую интерпретацию логистической функции потерь уже написано в рамках поста про линейные модели.
Данная метрика нечасто выступает в бизнес-требованиях, но часто — в задачах на kaggle.
Интуитивно можно представить минимизацию logloss как задачу максимизации accuracy путем штрафа за неверные предсказания. Однако необходимо отметить, что logloss крайне сильно штрафует за уверенность классификатора в неверном ответе.
Отметим, как драматически выросла logloss при неверном ответе и уверенной классификации!
Следовательно, ошибка на одном объекте может дать существенное ухудшение общей ошибки на выборке. Такие объекты часто бывают выбросами, которые нужно не забывать фильтровать или рассматривать отдельно.
Всё становится на свои места, если нарисовать график logloss:
Видно, что чем ближе к нулю ответ алгоритма при ground truth = 1, тем выше значение ошибки и круче растёт кривая.
Подытожим:
Полезные ссылки
Благодарности
Спасибо mephistopheies и madrugado за помощь в подготовке статьи.
macro average and weighted average meaning in classification_report
I use the «classification_report» from from sklearn.metrics import classification_report in order to evaluate the imbalanced binary classification
I do not understand clearly what is the meaning of macro avg and weighted average? and how we can clarify the best solution based on how close their amount to one!
I have read it: macro average (averaging the unweighted mean per label), weighted average (averaging the support-weighted mean per label)
but I still have a problem in understanding how good is result based on how close these amount to 1? How I can explain it?
3 Answers 3
Your data set is unbalanced since 28432 out of 28481 examples belong to class 0 (that is 99.8%). Therefore, your predictor almost always predicts any given sample as belonging to class 0 and thereby achieves very high scores like precision and recall for class 0 and very low scores for class 1.
Since your model just guesses to almost always predict class 0 these scores turn out to be poor.
Going forward I suggest start reading about unbalanced classification problems. There are many approaches how to tackle this. One important question here is whether false predictions for the two classes lead to different cost or not (which, for example, typically is the case in medical applications, spam filters or financial transactions). Because if they do not then a predictor always guessing the majority class could even make sense. But that strongly depends on the area and way of application.
AI для алгоритмической торговли: переосмысление баров, маркировка и стационарность
Дата публикации Feb 16, 2019
В серии статей я применял очень простой подход к прогнозированию финансовых временных рядов: взять весь набор данных, используя метод скользящего окна, сгенерировать X и Y, разделить его на исторические данные и данные вне выборки, обучить некоторым моделям машинного обучения. отобразить X на Y и протестировать простую длинную короткую стратегию. Но, как я показал впоследнее сообщение в блогеЯ начал понимать, что конвейер для «обычных» статических данных, таких как изображения, текст, аудио, табличные данные или даже менее хаотические временные ряды, не может использоваться для анализа финансовых временных рядов.
Проблема не только в том, что данные стохастические и их трудно прогнозировать. Все дело в полном непонимании его внутренней природы, которое влияет на подготовку набора данных, перекрестную проверку, выбор функций и тестирование на истории. В этой статье мы сконцентрируемся на хорошо известных «барах», что с ними не так и как правильно их готовить, чтобы потом кормить их внутри модели машинного обучения. После воссоздания баров мы обнаружим несколько новых способов создания входов и выходов из них. Конечно, мы будем сравнивать подходы статистически и эмпирически. Идеи, которые я показываю здесь, находятся под сильным влияниемкнига Лопеса де Прадо, что я рекомендую прочитать всем, кто хочет копаться в более подробной информации. Вы также можете найти весь код здесь:
Rachnog / Advanced-Deep-Трейдинг
github.com
Что не так со свечами?
Мы привыкли работать с так называемыми «свечными» данными, которые представляют цены открытия, максимума, минимума и закрытия за определенный период времени (от минут до дней). У этого подхода есть одна большая проблема: рынок не следует этому правилу сроков. Люди не размещают и не совершают сделки, когда наступает какое-то время или каждые N минут / часов. Более того, поскольку современные рынки основаны на алгоритмах, они определенно делают ставки, когда им это необходимо,не когда прошло N секунд, Что произойдет, если мы произведем выборку исторических данных на основе постоянных временных интервалов? Последнее, но не менее важное, из всего вышеизложенного следует (эмпирически), что бары, выбранные по времени, следуют«Плохие» статистические свойства: они имеют низкую последовательную корреляцию, имеют выбросы и не проходят тесты на нормальность распределения.
Решение заключается в выборке этих столбцов на основе правил другого типа:
Вы можете иметь представление о том, как производятся эти столбцы, как показано на рисунке ниже для временного ряда:
Все вышеперечисленные подходы предназначены для создания баров сравное количество информации внутри него: тиковые бары имеют одинаковое количество сделок, но объем может быть очень разным, поэтому, возможно, нам лучше выбрать объемные бары с одинаковым количеством торгуемых акций. Долларовые бары расширяют эту цепочку идей, чтобы каждый из баров имел одинаковую рыночную стоимость. Столбцы дисбаланса можно применять к тиковым, объемным или долларовым барам. Позвольте мне объяснить идею за полосами дисбаланса тиков. Тиковые бары дисбаланса представляют собой образцы из N тиков, которые следуют аналогичной тенденции цен
Как насчетстатистические свойства? Ниже вы можете найти сравнение различных столбцов с различными параметрами наряду с их последовательной корреляцией, стандартными отклонениями и тестами на нормальность.
Как видим, для каждого параметраальтернативные бары ведут себя лучшечем временной бар (кроме дисперсии, которая в любом случае очень низкая). Как я мог использовать шкалы времени раньше? 🙁
!ОБНОВИТЬ!
Пользователь GitHubhttps: // GitHub ком / mpugnaсделатьисправить в коде, что делает временные полосы еще очень привлекательными:
Как правильно маркировать набор данных?
В моих предыдущих постах я предсказывал, как изменится цена после прохождения N баров. Например, я хочу предсказать, как цена изменится после прохождения следующих 30 минут и идти в длинную или короткую позицию в соответствии с прогнозом. Но действительно ли так действуют практикующие и трейдеры? Когда они открывают позицию после некоторого сигнала, они помнят, каковы их цели по тейк-профиту и стоп-лоссам. Это означает, что мы больше заботимся о том, что происходит в эти 30 минут, а не о том, что произойдет, когда они пройдут. Более того, мои цели по прибыли и убыткам могут со временем меняться из-за волатильности рынка. Кроме того, поскольку я собираюсь делать ставки в каком-то направлении, в котором будет двигаться рыночная цена, мне нужно знать, сколько мне следует делать ставки. И последнее, но не менее важное: меня интересует уверенность в моем прогнозе не тратить время на случайные сигналы с точки зрения моей модели.
Следовательно, меня интересует новый метод маркировки, который включает в себя:
Динамические пороги
Тройная барьерная маркировка
Размер ставки и мета-маркировка
Как насчет памяти и стационарности?
Давайте измерим, сколько информации мы храним в качестве корреляции между ценами журнала и различными видами дифференциации и стационарности с помощью теста ADF:
Как мы видим, в этих временных рядах тиковых баров дробное дифференцирование не даст нам лучшей стационарности, но в действительности имеет гораздо больше памяти для корреляции. В случаешкалы временимы могли бы немного улучшить наши данныес использованием дифференцирования порядка 0,5–0,75,
Подавая все это к нейронным сетям
Хорошо, теперь пришло время посмотреть, что произойдет, когда мы попытаемся смоделировать наши новые бары с новыми целями. Я буду использовать очень простую регрессию softmax в качестве алгоритма классификации (с пропуском для регуляризации) и стандартизированные цены закрытия, объемы и возвраты за историческое окно в качестве функций. Модель в Керасе выглядит так:
Как видите, между наборами есть свободное пространство, это называется«эмбарго»и помогает заверить, что наша модель будет работать еще больше в будущем. Мы рассмотрим это подробно позже, а теперь давайте просто рассмотрим его как более реалистичный сценарий раскола. Чтобы справиться с дисбалансом классов, весовые коэффициенты для каждого класса были рассчитаны на основе поезда и набора проверки.
Фиксированный порог против порога волатильности против тройного барьера
Не очень впечатляет, правда? Не дисбаланс в точности / отзыве и дисбалансе набора данных. Что насчетпорог волатильности?
Цифры становятся лучше. У нас нет дисбаланса в точности / отзыве (что означает, что классификатор является справедливым и с улучшением самого алгоритма и функций, которые мы будем иметь достоверное улучшение в точности), и дисбаланс набора данных в настоящее время не так критичен. Ладно давай попробуемтройной барьер теперь с симметричным тейк-профитом и стоп-лоссом при значении скользящего Т на основе волатильностикак в предыдущем примере:
Среднее значение более или менее одинаково, поскольку класс 2, обозначающий здесь барьер, касающийся вертикальной линии, очень малонаселен. Если этого избежать, то точность движения вверх и вниз на основе тейк-профита и стоп-лосса будет выше, чем в предыдущих примерах, но с небольшим дисбалансом в точности / отзыве. Имея эти прогнозы какмета-меткадля бинарной модели прогнозирования, которая будет учитьсясторона ставкион будет иметь следующие значения точности:
Дробная дифференциация против целочисленной дифференциации
Давайте теперь заменим возвраты в наборе функций на дробно дифференцированные цены журналад = 0,5и посмотрим, что будет с такими же экспериментами базисный(что пока не очень впечатляет)
Горизонт волатильностиуже немного лучше, чем при «нормальном» дифференцировании:
И наконец,тройной барьер и его мета-маркировка:
Я думаю, что мы действительно можем подтвердить, что дробное дифференцирование является чрезвычайно полезным преобразованием, которое позволяет сохранять больше информации из исходного временного ряда!
Выводы
Постскриптум
Следуй за мной также наfacebookдля статей AI, которые слишком короткие для среднего,Instagramдля личных вещей иLinkedin!

















