Гузариш ба мундариҷа
Мавзӯи 4 аз 6

Метрикаҳои таснифот

Чаро танҳо accuracy кофӣ нест

Низоми ҷустуҷӯи нуқсонҳои камёбро тасаввур кунед: аз 200 ченкунӣ танҳо дуто вайрониро нишон медиҳад. Барномае, ки ҳамеша «ҳама чиз хуб» мегӯяд, accuracy-и 99 % мегирад, вале ягон вайрониро намеёбад. Нобаробарии синфҳо маънои онро дорад, ки объектҳои як синф аз дигараш хеле зиёданд. Дар чунин масъалаҳо ҳиссаи умумии муваффақият хатоҳои муҳимро пинҳон мекунад.

Ҳушдори бардурӯғ ва аз даст додани ҳодисаро бояд алоҳида фарқ кард. Барои таҷҳизот онҳо оқибатҳои гуногун доранд: санҷиши зиёдатӣ ва нуқсони нодида арзиши яксон надоранд. Матритсаи хатоҳо ин ҳолатҳоро нишон медиҳад ва precision, recall, F1 барои муқоисаи моделҳо кӯмак мекунанд.

1. Чор намуди натиҷа

Дар масъалаи дусинфа синфи мусбат — ҳодисаи ҷустуҷӯшавандаро — интихоб карда, бо 1 ишора мекунем. «Мусбат» маънои хубро надорад: нуқсон низ метавонад синфи мусбат бошад. Набудани ҳодисаро бо 0 ишора мекунем.

Воқеият / пешгӯӣ Пешгӯӣ 0 Пешгӯӣ 1
Воқеият 0 TN — радди дуруст FP — ҳушдори бардурӯғ
Воқеият 1 FN — ҳодисаи аздастрафта TP — ошкоркунии дуруст

confusion_matrix синфҳои воқеиро дар сатрҳо ва пешгӯишударо дар сутунҳо мегузорад. Рӯйхати ошкори labels=[0, 1] тартиб ва андозаро ҳатто ҳангоми набудани баъзе синфҳо собит мекунад.

from sklearn.metrics import confusion_matrix
y_true = [0, 0, 0, 0, 1, 1]
y_pred = [0, 0, 1, 0, 1, 0]
matrix = confusion_matrix(y_true, y_pred, labels=[0, 1])
print(matrix)
print(matrix.ravel().tolist())

Натиҷа:

[[3 1]
 [1 1]]
[3, 1, 1, 1]

ravel() сатрҳоро пайдарпай ҳамвор мекунад: TN, FP, FN, TP ҳосил мешаванд. Ҷамъи чор хона ба шумораи объектҳо баробар аст. Ҷамъи диагонал шумораи ҷавобҳои дуруст мебошад. Ин санҷишҳои одӣ барои пай бурдан ба тартиби нодуруст кӯмак мекунанд. Агар аввал пешгӯиҳо дода шаванд, матритса транспониронӣ шуда, ҳушдорҳои бардурӯғ ва ҳодисаҳои аздастрафта ҷой иваз мекунанд.

2. Precision: ҳушдорҳо чӣ қадар боэътимоданд

Precision, ё дақиқии синфи мусбат, ба TP/(TP+FP) баробар аст. Махраҷ ҳамаи объектҳоест, ки модел мусбат гуфтааст. Метрика мепурсад: «Аз ҳамаи объектҳои ба санҷиш фиристода чандто воқеан нуқсон доранд?» Precision-и паст маънои санҷишҳои зиёдатиро дорад.

Recall, ё пуррагӣ, ба TP/(TP+FN) баробар аст. Дар махраҷ ҳамаи объектҳои воқеан мусбатанд. Савол дигар аст: «Кадом ҳиссаи нуқсонҳоро ёфтем?» Recall-и паст маънои ҳодисаҳои зиёди аздастрафтаро дорад.

from sklearn.metrics import precision_score, recall_score
y_true = [1, 1, 1, 1, 0, 0]
y_pred = [1, 1, 0, 0, 1, 0]
print(round(precision_score(y_true, y_pred), 3))
print(round(recall_score(y_true, y_pred), 3))

Натиҷа:

0.667
0.5

Махраҷҳои ду метрика гуногунанд: ду ошкоркунии дуруст аз се ҳушдор ва аз чор ҳодисаи воқеӣ. Дақиқии синфи мусбатро бо accuracy омехта накунед: он раддияҳои дурустро низ ҳисоб мекунад.

3. F1 дақиқӣ ва пуррагиро муттаҳид мекунад

F1 миёнаи гармоникӣ аст: F1 = 2PR/(P+R). Онро ҳамчун 2TP/(2TP+FP+FN) низ навиштан мумкин аст. Агар яке аз метрикаҳо хурд бошад, F1 низ баланд намешавад: precision-и комил бо қариб набудани ошкоркунӣ F1-и хуб намедиҳад. Ин миёнаи арифметикии одӣ нест.

F1 бевосита TN-ро ба назар намегирад. Вақте ҳар ду намуди хатои синфи мусбат муҳиманд, он муфид аст, вале таҳлили арзиши онҳоро иваз намекунад. Ду модел бо F1-и яксон метавонанд таносуби гуногуни ҳодисаҳои аздастрафта ва ҳушдорҳо дошта бошанд.

from sklearn.metrics import f1_score
y_true = [1, 1, 1, 1, 0, 0]
y_pred = [1, 1, 0, 0, 1, 0]
print(round(f1_score(y_true, y_pred), 3))

Натиҷа:

0.571

4. Тамғаҳои сатрӣ ва набудани ошкоркунӣ

Метрикаҳои дусинфа бо нобаёнӣ адади 1-ро синфи мусбат ҳисоб мекунанд. Агар категорияҳо сатр бошанд, pos_label-ро диҳед. Тамғаҳои шартии A ва B дар мисоли навбатӣ набудан ва будани ҳодисаро ифода мекунанд, пас синфи лозим B аст.

Агар ягон пешгӯии мусбат набошад, махраҷи precision сифр мешавад. Параметри zero_division=0 натиҷаро бе огоҳӣ 0 таъин мекунад. Ин созишномаи ошкор аст, на тақсими математикӣ ба сифр. Барои recall чунин мушкил вақте ба миён меояд, ки дар санҷиш объекти воқеан мусбат нест.

from sklearn.metrics import precision_score, recall_score
y_true = ["A", "B", "B"]
y_pred = ["A", "A", "A"]
print(precision_score(y_true, y_pred, pos_label="B", zero_division=0))
print(recall_score(y_true, y_pred, pos_label="B", zero_division=0))

Натиҷа:

0.0
0.0

Ҳатто ҳангоми набудани синф андозаи матритсаро ошкоро собит кардан қулай аст. Сатр ё сутуни сифрӣ набудани ҳолатҳои мувофиқро нишон дода, хондани чор хонаро имконпазир мекунад.

from sklearn.metrics import confusion_matrix
print(confusion_matrix([0, 0], [0, 0], labels=[0, 1]))

Натиҷа:

[[2 0]
 [0 0]]

5. Эҳтимолиятҳо ва остонаи қарор

Агар модел эҳтимолияти ҳодисаи p-ро диҳад, бо қоидаи p >= threshold тамға ҳосил кардан мумкин аст. Остонаи 0.5 маъмул аст, вале ҳатмӣ нест. Кам кардани остона ҷавобҳои мусбатро зиёд мекунад: recall дар додаҳои собит кам намешавад ва ҳушдорҳои бардурӯғ зиёд шуда метавонанд. Precision ҳатман яксамта тағйир намеёбад: он аз тамғаҳои объектҳои иловашуда вобаста аст.

Эҳтимолиятҳои аллакай ҳисобшударо мегирем. Ҳангоми иваз кардани остона моделро аз нав намеомӯзонем — танҳо қоидаи қабули қарорро дигар мекунем:

from sklearn.metrics import precision_score, recall_score
y_true = [0, 1, 0, 1]
proba = [0.1, 0.4, 0.6, 0.9]
for threshold in [0.5, 0.3]:
    pred = [int(p >= threshold) for p in proba]
    print(threshold, pred)
    print(round(precision_score(y_true, pred), 3), recall_score(y_true, pred))

Натиҷа:

0.5 [0, 0, 1, 1]
0.5 0.5
0.3 [0, 1, 1, 1]
0.667 1.0

Остонаро дар додаҳои валидатсионӣ аз рӯйи меъёри лозим интихоб карда, баъд дар тести ниҳоии алоҳида месанҷанд. Агар остона ва сифат дар ҳамон объектҳо интихобу ҳисоб шаванд, натиҷа аз воқеият баланд шуда метавонад. classification_report барои ҳар синф precision, recall, F1 ва шумораи объектҳоро медиҳад. Ҳангоми якчанд синф усули миёнагириро (macro, weighted) низ интихоб бояд кард, на истифодаи бетағйири ҳолати дусинфа.

Метрикаҳо дар дохил чӣ гуна кор мекунанд

Аввал барои ҳар объект тамғаҳои воқеӣ ва пешгӯишуда ҷуфт мешаванд. Баъд хонаҳои матритса ҳисоб мегарданд. Precision, recall ва F1 формулаҳои гуногун барои ҳамон ҳисобкунакҳо мебошанд. Онҳо на аломатҳо ва на моделро медонанд ва fit-и такрориро талаб намекунанд. Иваз кардани остона танҳо баъзе объектҳоро байни хонаҳо мегузаронад. Ин ба танзими ҳассосияти ҳушдор монанд аст: ҳолати ҳассостар ҳодисаҳои бештарро меёбад, вале метавонад бештар бесабаб ташвиш диҳад.

Хатоҳои маъмул ва ислоҳи онҳо

  1. Меҳварҳои ивазшуда: confusion_matrix(y_pred, y_true) FP ва FN-ро иваз мекунад. Аввал тамғаҳои воқеиро диҳед.
  2. Синфҳои собитнашуда: confusion_matrix([0], [0]).ravel() чор адад намедиҳад. labels=[0, 1]-ро истифода баред.
  3. Синфи мусбат фаромӯш шуд: метрикаҳо барои сатрҳо бе pos_label метавонанд хато диҳанд. Тамғаи ҷустуҷӯшавандаро ошкоро нишон диҳед.
  4. Эҳтимолиятҳо ба ҷойи тамғаҳо: f1_score(y_true, proba) бо эҳтимолиятҳои касрӣ F1-и таснифотро ҳисоб намекунад. Аввал остонаи интихобшударо татбиқ кунед.
  5. Аломати дигари муқоиса: p > threshold объекти маҳз дар остонабударо хориҷ мекунад. Агар шарт «кам набошад» гӯяд, >=-ро гиред.

Ёднома

Бузургӣ Формула ё даъват
Матритса confusion_matrix(y_true, y_pred, labels=[0, 1])
Accuracy (TP + TN) / n
Precision TP / (TP + FP)
Recall TP / (TP + FN)
F1 2 * TP / (2 * TP + FP + FN)
Ҳолатҳои махсус pos_label=..., zero_division=0
Тамға аз эҳтимолият int(p >= threshold)