Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.

Точность и полнота

Пример использования метрики точности и полноты для оценки качества выходных данных классификатора.

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

Точность (\(P\)) определяется как число истинно положительных результатов (\(T_p\)), делённое на сумму числа истинно положительных и ложно положительных результатов (\(F_p\)).

\[P = \frac{T_p}{T_p+F_p}\]

Полнота (\(R\)) определяется как число истинно положительных результатов (\(T_p\)), делённое на сумму числа истинно положительных и ложноотрицательных результатов (\(F_n\)).

\[R = \frac{T_p}{T_p + F_n}\]

Кривая точности и полноты показывает компромисс между точностью и полнотой при различных порогах. Большая площадь под кривой означает высокие значения как полноты, так и точности. Высокая точность достигается за счёт малого числа ложно положительных результатов среди возвращённых, а высокая полнота — за счёт малого числа ложноотрицательных среди релевантных результатов. Высокие значения обеих метрик показывают, что классификатор возвращает точные результаты (высокая точность), а также большую часть всех релевантных результатов (высокая полнота).

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

Из определения точности (\(\frac{T_p}{T_p + F_p}\)) следует, что снижение порога классификатора может увеличить знаменатель за счёт увеличения числа возвращаемых результатов. Если ранее порог был установлен слишком высоко, новые результаты могут оказаться истинно положительными, что повысит точность. Если предыдущий порог был примерно оптимальным или слишком низким, дальнейшее его снижение приведёт к появлению ложно положительных результатов и снижению точности.

Полнота определяется как \(\frac{T_p}{T_p+F_n}\), где \(T_p+F_n\) не зависит от порога классификатора. Изменение порога классификатора может изменить только числитель, \(T_p\). Снижение порога классификатора может повысить полноту за счёт увеличения числа истинно положительных результатов. Также возможно, что снижение порога не изменит полноту, а точность будет колебаться. Таким образом, точность не обязательно снижается с ростом полноты.

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

Средняя точность (AP) обобщает такой график как взвешенное среднее значений точности, достигнутых при каждом пороге; в качестве веса используется прирост полноты по сравнению с предыдущим порогом:

\(\text{AP} = \sum_n (R_n - R_{n-1}) P_n\)

где \(P_n\) и \(R_n\) — точность и полнота при n-м пороге. Пара \((R_k, P_k)\) называется рабочей точкой.

AP и площадь трапеции под рабочими точками (sklearn.metrics.auc) — распространённые способы обобщения кривой точности и полноты, дающие разные результаты. Подробнее см. в Руководстве пользователя.

Кривые точности и полноты обычно используют в бинарной классификации для изучения выходных данных классификатора. Чтобы распространить кривую точности и полноты и среднюю точность на многоклассовую классификацию или классификацию с несколькими метками, необходимо бинаризовать выходные данные. Можно построить отдельную кривую для каждой метки, но также можно построить кривую точности и полноты, рассматривая каждый элемент матрицы индикаторов меток как бинарное предсказание (микроусреднение).

Примечание

См. также sklearn.metrics.average_precision_score,

sklearn.metrics.recall_score, sklearn.metrics.precision_score, sklearn.metrics.f1_score

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

В условиях бинарной классификации

Набор данных и модель

Мы будем использовать классификатор Linear SVC для различения двух видов ирисов.

import numpy as np

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

X, y = load_iris(return_X_y=True)

# Add noisy features
random_state = np.random.RandomState(0)
n_samples, n_features = X.shape
X = np.concatenate([X, random_state.randn(n_samples, 200 * n_features)], axis=1)

# Limit to the two first classes, and split into training and test
X_train, X_test, y_train, y_test = train_test_split(
    X[y < 2], y[y < 2], test_size=0.5, random_state=random_state
)

Для работы Linear SVC требуется, чтобы значения каждого признака находились в сопоставимом диапазоне. Поэтому сначала масштабируем данные с помощью StandardScaler.

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

classifier = make_pipeline(StandardScaler(), LinearSVC(random_state=random_state))
classifier.fit(X_train, y_train)
Pipeline(steps=[('standardscaler', StandardScaler()),
                ('linearsvc',
                 LinearSVC(random_state=RandomState(MT19937) at 0x78414C6BB440))])
В среде Jupyter повторно запустите эту ячейку, чтобы отобразить представление HTML, или доверьте этому блокноту отображение HTML.
На GitHub представление HTML невозможно отобразить; попробуйте открыть эту страницу на nbviewer.org.
Параметры
steps steps: список кортежей

Список кортежей (имя шага, оцениватель), которые должны выполняться
последовательно. Для совместимости с API scikit-learn все шаги
должны определять `fit`. Все шаги, кроме последнего, также должны определять `transform`. Подробнее см.
:ref:`Combining Estimators <combining_estimators>`.
[('standardscaler', ...), ('linearsvc', ...)]
transform_input transform_input: список строк, по умолчанию None

Имена параметров :term:`metadata`, которые следует преобразовать конвейером
перед передачей шагу, который их использует.

Это позволяет преобразовывать некоторые входные аргументы ``fit`` (кроме ``X``)
с помощью шагов конвейера вплоть до шага, которому они нужны.
Требование задаётся через :ref:`маршрутизацию метаданных <metadata_routing>`.
Например, так можно передать проверочный набор данных через конвейер.

Этот параметр можно задать только при включённой маршрутизации метаданных, которую
можно включить с помощью ``sklearn.set_config(enable_metadata_routing=True)``.

.. versionadded:: 1.6
None
memory memory: строка или объект с интерфейсом joblib.Memory, по умолчанию None

Используется для кэширования обученных преобразователей конвейера. Последний шаг
никогда не кэшируется, даже если он является преобразователем. По умолчанию кэширование
не выполняется. Если указана строка, она задаёт путь к каталогу
кэширования. Включение кэширования приводит к клонированию преобразователей
перед обучением. Поэтому экземпляр преобразователя, переданный
конвейеру, нельзя проверить напрямую. Используйте атрибут ``named_steps``
или ``steps`` для проверки оценивателей в конвейере. Кэширование
преобразователей полезно, если обучение занимает много времени. См.
:ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py`
пример включения кэширования.
None
verbose verbose: bool, по умолчанию False

Если значение True, по завершении каждого шага выводится затраченное на его
обучение время.
False
Обученные атрибуты
Имя Тип Значение
classes_ classes_: ndarray формы (n_classes,)

Метки классов. Атрибут существует, только если последний шаг конвейера —
классификатор.
ndarray[int64](2,) [0,1]
n_features_in_ n_features_in_: int

Количество признаков, обнаруженных во время :term:`fit`. Атрибут определён, только если
базовый первый оцениватель в `steps` предоставляет такой атрибут
после обучения.

.. versionadded:: 0.24
int 804
Параметры
copy copy: bool, default=True

Если False, попытаться избежать копирования и выполнить масштабирование на месте.
Это не всегда гарантированно работает на месте; например, если данные
не являются массивом NumPy или разреженной матрицей scipy.sparse CSR, может быть
возвращена копия.
True
with_mean with_mean: bool, default=True

Если True, центрировать данные перед масштабированием.
Это не работает (и вызывает исключение) при попытке применить параметр к
разреженным матрицам, поскольку центрирование требует создания плотной
матрицы, которая в обычных случаях использования, вероятно, будет слишком велика, чтобы поместиться в
памяти.
True
with_std with_std: bool, default=True

Если True, масштабировать данные до единичной дисперсии (или, что эквивалентно,
единичного стандартного отклонения).
True
Обученные атрибуты
Имя Тип Значение
mean_ mean_: ndarray of shape (n_features,) or None

Среднее значение для каждого признака в обучающем наборе.
Равно ``None``, когда ``with_mean=False`` и ``with_std=False``.
ndarray[float64](804,) [ 5.44, 3.13, 2.76,..., 0.08,-0.09, 0.07]
n_features_in_ n_features_in_: int

Количество признаков, обнаруженных во время :term:`fit`.

.. versionadded:: 0.24
int 804
n_samples_seen_ n_samples_seen_: int or ndarray of shape (n_features,)

Количество образцов, обработанных оценщиком для каждого признака.
Если отсутствующие образцы нет, ``n_samples_seen`` будет целым числом,
в противном случае это будет массив типа int. Если используются
`sample_weights`, значением будет число с плавающей точкой (если отсутствующие данные не встречаются)
или массив типа float, суммирующий веса, накопленные на данный момент.
Сбрасывается при новых вызовах fit, но увеличивается при вызовах
``partial_fit``.
float64 50
scale_ scale_: ndarray of shape (n_features,) or None

Относительный коэффициент масштабирования данных для каждого признака, обеспечивающий нулевое среднее и единичную
дисперсию. Обычно он вычисляется с помощью `np.sqrt(var_)`. Если
дисперсия равна нулю, добиться единичной дисперсии невозможно, поэтому данные остаются
без изменений, а коэффициент масштабирования равен 1. `scale_` равен `None`,
когда `with_std=False`.

.. versionadded:: 0.17
*scale_*
ndarray[float64](804,) [0.59,0.51,1.41,...,0.9 ,0.82,0.98]
var_ var_: ndarray of shape (n_features,) or None

Дисперсия каждого признака в обучающем наборе. Используется для вычисления
`scale_`. Равно ``None``, когда ``with_mean=False`` и
``with_std=False``.
ndarray[float64](804,) [0.35,0.26,2. ,...,0.81,0.68,0.97]
804 признака
x0
x1
x2
x3
x4
x5
x6
x7
x8
x9
x10
x11
x12
x13
x14
x15
x16
x17
x18
x19
x20
x21
x22
x23
x24
x25
x26
x27
x28
x29
x30
x31
x32
x33
x34
x35
x36
x37
x38
x39
x40
x41
x42
x43
x44
x45
x46
x47
x48
x49
x50
x51
x52
x53
x54
x55
x56
x57
x58
x59
x60
x61
x62
x63
x64
x65
x66
x67
x68
x69
x70
x71
x72
x73
x74
x75
x76
x77
x78
x79
x80
x81
x82
x83
x84
x85
x86
x87
x88
x89
x90
x91
x92
x93
x94
x95
x96
x97
x98
x99
x100
x101
x102
x103
x104
x105
x106
x107
x108
x109
x110
x111
x112
x113
x114
x115
x116
x117
x118
x119
x120
x121
x122
x123
x124
x125
x126
x127
x128
x129
x130
x131
x132
x133
x134
x135
x136
x137
x138
x139
x140
x141
x142
x143
x144
x145
x146
x147
x148
x149
x150
x151
x152
x153
x154
x155
x156
x157
x158
x159
x160
x161
x162
x163
x164
x165
x166
x167
x168
x169
x170
x171
x172
x173
x174
x175
x176
x177
x178
x179
x180
x181
x182
x183
x184
x185
x186
x187
x188
x189
x190
x191
x192
x193
x194
x195
x196
x197
x198
x199
x200
x201
x202
x203
x204
x205
x206
x207
x208
x209
x210
x211
x212
x213
x214
x215
x216
x217
x218
x219
x220
x221
x222
x223
x224
x225
x226
x227
x228
x229
x230
x231
x232
x233
x234
x235
x236
x237
x238
x239
x240
x241
x242
x243
x244
x245
x246
x247
x248
x249
x250
x251
x252
x253
x254
x255
x256
x257
x258
x259
x260
x261
x262
x263
x264
x265
x266
x267
x268
x269
x270
x271
x272
x273
x274
x275
x276
x277
x278
x279
x280
x281
x282
x283
x284
x285
x286
x287
x288
x289
x290
x291
x292
x293
x294
x295
x296
x297
x298
x299
x300
x301
x302
x303
x304
x305
x306
x307
x308
x309
x310
x311
x312
x313
x314
x315
x316
x317
x318
x319
x320
x321
x322
x323
x324
x325
x326
x327
x328
x329
x330
x331
x332
x333
x334
x335
x336
x337
x338
x339
x340
x341
x342
x343
x344
x345
x346
x347
x348
x349
x350
x351
x352
x353
x354
x355
x356
x357
x358
x359
x360
x361
x362
x363
x364
x365
x366
x367
x368
x369
x370
x371
x372
x373
x374
x375
x376
x377
x378
x379
x380
x381
x382
x383
x384
x385
x386
x387
x388
x389
x390
x391
x392
x393
x394
x395
x396
x397
x398
x399
x400
x401
x402
x403
x404
x405
x406
x407
x408
x409
x410
x411
x412
x413
x414
x415
x416
x417
x418
x419
x420
x421
x422
x423
x424
x425
x426
x427
x428
x429
x430
x431
x432
x433
x434
x435
x436
x437
x438
x439
x440
x441
x442
x443
x444
x445
x446
x447
x448
x449
x450
x451
x452
x453
x454
x455
x456
x457
x458
x459
x460
x461
x462
x463
x464
x465
x466
x467
x468
x469
x470
x471
x472
x473
x474
x475
x476
x477
x478
x479
x480
x481
x482
x483
x484
x485
x486
x487
x488
x489
x490
x491
x492
x493
x494
x495
x496
x497
x498
x499
x500
x501
x502
x503
x504
x505
x506
x507
x508
x509
x510
x511
x512
x513
x514
x515
x516
x517
x518
x519
x520
x521
x522
x523
x524
x525
x526
x527
x528
x529
x530
x531
x532
x533
x534
x535
x536
x537
x538
x539
x540
x541
x542
x543
x544
x545
x546
x547
x548
x549
x550
x551
x552
x553
x554
x555
x556
x557
x558
x559
x560
x561
x562
x563
x564
x565
x566
x567
x568
x569
x570
x571
x572
x573
x574
x575
x576
x577
x578
x579
x580
x581
x582
x583
x584
x585
x586
x587
x588
x589
x590
x591
x592
x593
x594
x595
x596
x597
x598
x599
x600
x601
x602
x603
x604
x605
x606
x607
x608
x609
x610
x611
x612
x613
x614
x615
x616
x617
x618
x619
x620
x621
x622
x623
x624
x625
x626
x627
x628
x629
x630
x631
x632
x633
x634
x635
x636
x637
x638
x639
x640
x641
x642
x643
x644
x645
x646
x647
x648
x649
x650
x651
x652
x653
x654
x655
x656
x657
x658
x659
x660
x661
x662
x663
x664
x665
x666
x667
x668
x669
x670
x671
x672
x673
x674
x675
x676
x677
x678
x679
x680
x681
x682
x683
x684
x685
x686
x687
x688
x689
x690
x691
x692
x693
x694
x695
x696
x697
x698
x699
x700
x701
x702
x703
x704
x705
x706
x707
x708
x709
x710
x711
x712
x713
x714
x715
x716
x717
x718
x719
x720
x721
x722
x723
x724
x725
x726
x727
x728
x729
x730
x731
x732
x733
x734
x735
x736
x737
x738
x739
x740
x741
x742
x743
x744
x745
x746
x747
x748
x749
x750
x751
x752
x753
x754
x755
x756
x757
x758
x759
x760
x761
x762
x763
x764
x765
x766
x767
x768
x769
x770
x771
x772
x773
x774
x775
x776
x777
x778
x779
x780
x781
x782
x783
x784
x785
x786
x787
x788
x789
x790
x791
x792
x793
x794
x795
x796
x797
x798
x799
x800
x801
x802
x803
Параметры
random_state random_state: int, экземпляр RandomState или None, по умолчанию=None

Управляет генерацией псевдослучайных чисел для перемешивания данных при
двойственном координатном спуске (если ``dual=True``). Если ``dual=False``,
базовая реализация :class:`LinearSVC` не является случайной, и
``random_state`` не влияет на результаты.
Передайте целое число, чтобы получать воспроизводимый результат при нескольких вызовах функции.
См. :term:`Глоссарий <random_state>`.
RandomState(M...0x78414C6BB440
penalty penalty: {'l1', 'l2'}, по умолчанию='l2'

Задает норму, используемую при регуляризации. Штраф 'l2'
является стандартным в SVC. Штраф 'l1' приводит к тому, что векторы
``coef_`` становятся разреженными.
'l2'
loss loss: {'hinge', 'squared_hinge'}, по умолчанию='squared_hinge'

Задает функцию потерь. 'hinge' — стандартная функция потерь SVM
(например, используется классом SVC), а 'squared_hinge' — это
квадрат функции потерь hinge. Сочетание ``penalty='l1'``
и ``loss='hinge'`` не поддерживается.
'squared_hinge'
dual dual: "auto" или bool, по умолчанию="auto"

Выбирает алгоритм для решения двойственной или прямой
задачи оптимизации. Если n_samples > n_features, предпочтительно dual=False.
Значение `dual="auto"` будет выбрано автоматически на основе значений `n_samples`, `n_features`, `loss`, `multi_class`
и `penalty`. Если `n_samples` < `n_features` и оптимизатор поддерживает
выбранные значения `loss`, `multi_class` и `penalty`, то для dual будет установлено значение True,
иначе — False.

.. versionchanged:: 1.3
Опция `"auto"` добавлена в версии 1.3 и станет значением по умолчанию
в версии 1.5.
'auto'
tol tol: float, по умолчанию=1e-4

Допуск для критерия остановки.
0.0001
C C: float, по умолчанию=1.0

Параметр регуляризации. Сила регуляризации
обратно пропорциональна C. Значение должно быть строго положительным.
Наглядную визуализацию влияния масштабирования
параметра регуляризации C см. в разделе
:ref:`sphx_glr_auto_examples_svm_plot_svm_scale_c.py`.
1.0
multi_class multi_class: {'ovr', 'crammer_singer'}, по умолчанию='ovr'

Определяет стратегию многоклассовой классификации, если `y` содержит более
двух классов.
``"ovr"`` обучает n_classes классификаторов «один против остальных», а
``"crammer_singer"`` оптимизирует целевую функцию совместно для всех классов.
Хотя `crammer_singer` представляет теоретический интерес,
поскольку является согласованным, на практике его используют редко: он редко обеспечивает
более высокую точность и требует больше вычислений.
Если выбрано ``"crammer_singer"``, параметры loss, penalty и dual
игнорируются.
'ovr'
fit_intercept fit_intercept: bool, по умолчанию=True

Нужно ли подгонять свободный член. Если установлено значение True, вектор признаков
расширяется, чтобы включить свободный член: `[x_1, ..., x_n, 1]`, где
1 соответствует свободному члену. Если установлено значение False, свободный член
не будет использоваться в вычислениях (то есть предполагается, что данные уже центрированы).
True
intercept_scaling intercept_scaling: float, по умолчанию=1.0

Если `fit_intercept` имеет значение True, вектор экземпляра x принимает вид ``[x_1,
..., x_n, intercept_scaling]``, то есть к вектору экземпляра добавляется «синтетический» признак
с постоянным значением, равным `intercept_scaling`. Свободный член становится равен intercept_scaling * весу
синтетического признака. Обратите внимание, что liblinear выполняет регуляризацию свободного члена,
рассматривая его как любой другой элемент вектора признаков. Чтобы уменьшить
влияние регуляризации на свободный член, параметру `intercept_scaling`
можно задать значение больше 1: чем выше значение
`intercept_scaling`, тем меньше влияние регуляризации на него.
Тогда веса будут иметь вид `[w_x_1, ..., w_x_n,
w_intercept*intercept_scaling]`, где `w_x_1, ..., w_x_n` представляют
веса признаков, а вес свободного члена масштабируется с помощью
`intercept_scaling`. Такое масштабирование позволяет применять к свободному члену
отличающийся от остальных признаков режим регуляризации.
1
class_weight class_weight: dict или 'balanced', по умолчанию=None

Задает параметр C для класса i равным ``class_weight[i]*C`` в
SVC. Если значение не задано, предполагается, что вес
всех классов равен единице.
Режим "balanced" автоматически использует значения y для корректировки
весов, обратно пропорциональных частотам классов во входных данных,
по формуле ``n_samples / (n_classes * np.bincount(y))``.
None
verbose verbose: int, по умолчанию=0

Включает подробный вывод. Обратите внимание: этот параметр использует
настройку времени выполнения liblinear для отдельного процесса, которая при включении может работать
некорректно в многопоточной среде.
0
max_iter max_iter: int, по умолчанию=1000

Максимальное число выполняемых итераций.
1000
Обученные атрибуты
Имя Тип Значение
classes_ classes_: ndarray формы (n_classes,)

Метки уникальных классов.
ndarray[int64](2,) [0,1]
coef_ coef_: ndarray формы (1, n_features), если n_classes == 2, иначе (n_classes, n_features)

Веса, присвоенные признакам (коэффициенты в прямой
задаче).

``coef_`` — это свойство только для чтения, производное от ``raw_coef_``, которое
соответствует внутреннему расположению данных в памяти liblinear.
ndarray[float64](1, 804) [[ 0.03,-0.04, 0.05,..., 0. ,-0. , 0. ]]
intercept_ intercept_: ndarray формы (1,), если n_classes == 2, иначе (n_classes,)

Константы в функции принятия решения.
ndarray[float64](1,) [-0.04]
n_features_in_ n_features_in_: int

Число признаков, обнаруженных во время :term:`fit`.

.. versionadded:: 0.24
int 804
n_iter_ n_iter_: int

Максимальное число итераций, выполненных для всех классов.
int 53


Построение кривой точности-полноты

Для построения кривой точности-полноты следует использовать PrecisionRecallDisplay. Доступны три метода:

  • для построения одной кривой:

    • from_estimator — если прогнозы ещё не вычислены
    • from_predictions — если прогнозы уже вычислены
  • для построения нескольких кривых по результатам перекрёстной проверки: from_cv_results

Сначала построим кривую точности-полноты без прогнозов классификатора. Мы используем from_estimator, который вычислит прогнозы перед построением кривой.

from sklearn.metrics import PrecisionRecallDisplay

display = PrecisionRecallDisplay.from_estimator(
    classifier, X_test, y_test, name="LinearSVC", plot_chance_level=True, despine=True
)
_ = display.ax_.set_title("2-class Precision-Recall curve")
2-class Precision-Recall curve

Если у нас уже есть оценённые вероятности или оценки модели, можно использовать from_predictions.

y_score = classifier.decision_function(X_test)

display = PrecisionRecallDisplay.from_predictions(
    y_test, y_score, name="LinearSVC", plot_chance_level=True, despine=True
)
_ = display.ax_.set_title("2-class Precision-Recall curve")
2-class Precision-Recall curve

from_cv_results принимает результаты перекрёстной проверки из cross_validate и строит кривую точности-полноты для каждого фолда.

from sklearn.model_selection import cross_validate

classifier = make_pipeline(StandardScaler(), LinearSVC(random_state=random_state))
cv_results = cross_validate(
    classifier, X_train, y_train, return_estimator=True, return_indices=True
)
display = PrecisionRecallDisplay.from_cv_results(cv_results, X_train, y_train)
_ = display.ax_.set_title("Cross-validation Precision-Recall curves")
Cross-validation Precision-Recall curves

В условиях многометочной классификации

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

Создание многометочных данных, обучение и прогнозирование

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

from sklearn.preprocessing import label_binarize

# Use label_binarize to be multi-label like settings
Y = label_binarize(y, classes=[0, 1, 2])
n_classes = Y.shape[1]

# Split into training and test
X_train, X_test, Y_train, Y_test = train_test_split(
    X, Y, test_size=0.5, random_state=random_state
)

Для многометочного прогнозирования мы используем OneVsRestClassifier.

from sklearn.multiclass import OneVsRestClassifier

classifier = OneVsRestClassifier(
    make_pipeline(StandardScaler(), LinearSVC(random_state=random_state))
)
classifier.fit(X_train, Y_train)
y_score = classifier.decision_function(X_test)

Средняя точность в условиях многометочной классификации

from sklearn.metrics import average_precision_score, precision_recall_curve

# For each class
precision = dict()
recall = dict()
average_precision = dict()
for i in range(n_classes):
    precision[i], recall[i], _ = precision_recall_curve(Y_test[:, i], y_score[:, i])
    average_precision[i] = average_precision_score(Y_test[:, i], y_score[:, i])

# A "micro-average": quantifying score on all classes jointly
precision["micro"], recall["micro"], _ = precision_recall_curve(
    Y_test.ravel(), y_score.ravel()
)
average_precision["micro"] = average_precision_score(Y_test, y_score, average="micro")

Построение микроусреднённой кривой точности-полноты

from collections import Counter

display = PrecisionRecallDisplay(
    recall=recall["micro"],
    precision=precision["micro"],
    average_precision=average_precision["micro"],
    prevalence_pos_label=Counter(Y_test.ravel())[1] / Y_test.size,
)
display.plot(plot_chance_level=True, despine=True)
_ = display.ax_.set_title("Micro-averaged over all classes")
Micro-averaged over all classes

Построение кривой точности-полноты для каждого класса и изолиний F1

from itertools import cycle

import matplotlib.pyplot as plt

# setup plot details
colors = cycle(["navy", "turquoise", "darkorange", "cornflowerblue", "teal"])

_, ax = plt.subplots(figsize=(7, 8))

f_scores = np.linspace(0.2, 0.8, num=4)
lines, labels = [], []
for f_score in f_scores:
    x = np.linspace(0.01, 1)
    y = f_score * x / (2 * x - f_score)
    (l,) = plt.plot(x[y >= 0], y[y >= 0], color="gray", alpha=0.2)
    plt.annotate("f1={0:0.1f}".format(f_score), xy=(0.9, y[45] + 0.02))

display = PrecisionRecallDisplay(
    recall=recall["micro"],
    precision=precision["micro"],
    average_precision=average_precision["micro"],
)
display.plot(
    ax=ax, name="Micro-average precision-recall", curve_kwargs={"color": "gold"}
)

for i, color in zip(range(n_classes), colors):
    display = PrecisionRecallDisplay(
        recall=recall[i],
        precision=precision[i],
        average_precision=average_precision[i],
    )
    display.plot(
        ax=ax,
        name=f"Precision-recall for class {i}",
        curve_kwargs={"color": color},
        despine=True,
    )

# add the legend for the iso-f1 curves
handles, labels = display.ax_.get_legend_handles_labels()
handles.extend([l])
labels.extend(["iso-f1 curves"])
# set the legend and the axes
ax.legend(handles=handles, labels=labels, loc="best")
ax.set_title("Extension of Precision-Recall curve to multi-class")

plt.show()
Extension of Precision-Recall curve to multi-class

Общее время выполнения скрипта: (0 минут 0.547 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_precision_recall.ipynb

Download Python source code: plot_precision_recall.py

Download zipped: plot_precision_recall.zip

Связанные примеры

Пользовательская стратегия повторного обучения для поиска по сетке с перекрёстной проверкой

Визуализация с помощью объектов отображения

Оценивание разреженной обратной ковариационной матрицы

Настройка порога принятия решения для обучения с учётом затрат

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/model_selection/plot_precision_recall.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API