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

Арзёбии модел

Чаро моделро алоҳида месанҷанд

Мувофиқати хуб бо ҷавобҳои омӯзишӣ ҳанӯз маънои муфид будани моделро надорад. Барои хадамоти расонидан сафари фардо муҳим аст, на сафаре, ки вақти он аллакай сабт шудааст. Бояд арзёбӣ кард, ки қоида ба объектҳои нав чӣ қадар мегузарад. Ин қобилият умумисозӣ ном дорад.

Азёдомӯзӣ (overfitting) вақте рӯй медиҳад, ки модел ба хусусиятҳои тасодуфии мисолҳои омӯзишӣ мутобиқ шуда, суст умумӣ мекунад. Ин ба хонандае монанд аст, ки ҷавобҳои китобро аз ёд кардааст, вале усули ҳалро нафаҳмидааст. Аз ин рӯ, як қисми додаҳоро пешакӣ ҷудо карда, дар омӯзиш истифода намебаранд.

1. Тақсимоти мувофиқ

Маҷмуаи омӯзишӣ барои fit ва маҷмуаи санҷишӣ барои арзёбии мустақил лозим аст. train_test_split бо нобаёнӣ объектҳоро омехта карда, ба ду қисм ҷудо мекунад. Агар X ва y якҷоя дода шаванд, мувофиқати сатрҳо ва ҷавобҳо нигоҳ дошта мешавад. Натиҷаҳо бо ин тартиб меоянд: аломатҳои омӯзишӣ, аломатҳои санҷишӣ, ҷавобҳои омӯзишӣ, ҷавобҳои санҷишӣ.

random_state тавлидгари ададҳои тасодуфиро собит мекунад. Бо ҳамон вуруд ва параметрҳо тақсимот такрор мешавад. Ин муқоисаи моделҳоро дар ҳамон объектҳо осон мекунад, вале худи тақсимотро босифаттар намегардонад.

from sklearn.model_selection import train_test_split
X = [[10], [20], [30], [40], [50], [60]]
y = [1, 2, 3, 4, 5, 6]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=2, random_state=4)
print(len(X_train), len(X_test))
print(list(zip(X_test, y_test)))

Натиҷа:

4 2
[([50], 5), ([60], 6)]

test_size метавонад шумораи бутуни объектҳо ё ҳисса бошад. Барои ҳиссаи касрии мусбат шумораи объектҳои санҷишӣ ба боло гирд мешавад, то ҳиссаи хурд санҷиши холӣ надиҳад. Ҳар ду маҷмуа бояд холӣ набошанд. shuffle=False тартибро нигоҳ медорад ва он гоҳ random_state ба тақсимот таъсир намекунад. Барои қаторҳои вақтӣ аксаран ояндаро аз гузашта ҷудо кардан лозим аст, на омехтани санаҳо.

from sklearn.model_selection import train_test_split
items = list(range(9))
for size in [0.25, 2]:
    train, test = train_test_split(items, test_size=size, shuffle=False)
    print(len(train), len(test), test)

Натиҷа:

6 3 [6, 7, 8]
7 2 [7, 8]

2. Хатои мутлақи миёна

Метрика муқоисаи ҷавобҳо ва пешгӯиҳоро ба адад табдил медиҳад. Бигзор y_true қиматҳои воқеӣ ва y_pred пешгӯиҳо бо ҳамон тартиб бошанд. MAE миёнаи фарқҳои мутлақ аст: MAE = \frac{1}{n}∑ |yi - \hat yi|. Аломатҳо нест мешаванд, бинобар ин зиёд ва кам пешгӯӣ кардан якдигарро бекор намекунанд.

Агар давомнокӣ бо дақиқа чен шавад, MAE низ бо дақиқа ифода мешавад. Қимати 2 хатои мутлақи миёнаи ду дақиқаро мефаҳмонад, на хатои ҳар як пешгӯиро. MAE ҳар қадар хурд бошад, ҳамон қадар беҳтар аст.

from sklearn.metrics import mean_absolute_error
y_true = [8, 12, 16, 20]
y_pred = [9, 10, 18, 19]
print(mean_absolute_error(y_true, y_pred))
print(sum(a - b for a, b in zip(y_true, y_pred)))

Натиҷа:

1.5
0

Сатри дуюм нишон медиҳад, ки чаро хатои миёнаи аломатдор барои андозаи хато номуносиб аст: хатоҳои муқобил метавонанд пурра якдигарро бекор кунанд.

3. Квадратҳои хатоҳо: MSE ва RMSE

MSE миёнаи квадратҳои фарқҳост. Хатои 6 воҳид саҳми 36 ва хатои 2 танҳо 4 медиҳад. Аз ин рӯ, хатоҳои калон бештар таъсир мерасонанд. Воҳидҳои MSE низ квадратӣ мешаванд: масалан, дақиқаи квадратӣ. RMSE решаи квадратии MSE аст, ки воҳидҳои аслиро бармегардонад. Барои версияи курс истифодаи mean_squared_error(...) ** 0.5 қулай аст.

from sklearn.metrics import mean_absolute_error, mean_squared_error
y_true = [0, 0, 0]
for y_pred in [[2, 2, 2], [0, 0, 6]]:
    mse = mean_squared_error(y_true, y_pred)
    print(mean_absolute_error(y_true, y_pred), mse, round(mse ** 0.5, 3))

Натиҷа:

2.0 4.0 2.0
2.0 12.0 3.464

MAE яксон аст, вале пешгӯии дуюм хатарноктар аст, агар хатоҳои калони камёб махсусан гарон бошанд. Интихоби метрика аз масъала вобаста аст: хатои миёнаи фаҳмо барои ҳисобот ва ҷаримаи квадратӣ барои ҳолатҳое лозим аст, ки дуршавиҳои калон номатлубанд.

4. R² ва пешгӯии асосӣ

R² ҷамъи квадратҳои хатоҳои моделро бо ҷамъи квадратҳои дуршавии ҷавобҳои воқеӣ аз миёнаашон муқоиса мекунад: R2 = 1 - \frac{∑(yi-\hat yi)2}{∑(yi-\bar y)2}. Пас 1 мувофиқати комил, 0 сифати пешгӯӣ бо миёнаи ҷавобҳои арзёбишаванда ва адади манфӣ аз он миёна бадтар буданро ифода мекунад. Ин фоизи ҷавобҳои дуруст нест.

Барои ҷавобҳои ғайридоимӣ R² аз воҳиди ченкунӣ вобаста нест, вале ин ҳамаи маҷмуаҳоро яксон душвор намекунад. Барои ҷавобҳои доимӣ махраҷ сифр аст: r2_score бо нобаёнӣ натиҷаҳои ғайримаҳдудро барои пешгӯии комил ба 1 ва барои ғайрикомил ба 0 иваз мекунад. Барои як объект R² муайян нест.

from sklearn.metrics import r2_score
y_true = [2, 4, 6]
print(r2_score(y_true, [2, 4, 6]))
print(r2_score(y_true, [4, 4, 4]))
print(r2_score(y_true, [10, 10, 10]))

Натиҷа:

1.0
0.0
-13.5

5. Тартиби пурраи арзёбӣ

Аввал додаҳоро ҷудо мекунанд, баъд моделро танҳо дар қисми омӯзишӣ меомӯзонанд ва сипас барои аломатҳои санҷишӣ predict-ро даъват мекунанд. Ҷавобҳои воқеии санҷишӣ танҳо дар метрика иштирок мекунанд. Дар лоиҳа пешгӯии доимие, ки аз ҷавобҳои омӯзишӣ ҳисоб шудааст, низ меъёри муқоисаи хуб аст: миёнаи санҷиширо барои пешгӯии воқеӣ истифода бурдан мумкин нест.

score(X_test, y_test)-и регрессор одатан R² бармегардонад, на MAE. Дар мисоли зер MAE-ро ошкоро ҳисоб мекунем, то воҳидҳои хато фаҳмо монанд.

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
X = [[i] for i in range(8)]
y = [1, 4, 4, 8, 9, 10, 14, 14]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=2, random_state=2)
model = LinearRegression().fit(X_train, y_train)
print(round(mean_absolute_error(y_test, model.predict(X_test)), 3))

Натиҷа:

0.622

Санҷиш дар дохил чӣ гуна кор мекунад

Тақсимот индексҳои сатрҳоро интихоб ва онҳоро ба ҳамаи массивҳои додашуда яксон татбиқ мекунад. Метрикаҳо аз тарзи омӯзиши модел чизе намедонанд: онҳо ду рӯйхати тайёрро гирифта, хатоҳои ҷуфтиро ҳисоб ва миёна мекунанд. Аз ин рӯ, одилона будани арзёбӣ аз тартиби амалҳои барномасоз вобаста аст.

Агар параметрҳо борҳо аз рӯйи тест интихоб шаванд, он тадриҷан қисми омӯзиш мегардад. Барои интихоби танзимот қисми алоҳидаи валидатсионӣ ё санҷиши салибиро истифода мебаранд ва тести ниҳоиро то охир нигоҳ медоранд. Тақсимоти тасодуфӣ ҳам аз як муштарӣ дар ҳар ду маҷмуа ё аз аломате, ки танҳо баъд аз ҳодиса маълум мешавад, муҳофизат намекунад.

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

  1. Санҷиш дар омӯзиш: model.score(X_train, y_train) мисолҳои шиносро арзёбӣ мекунад. Барои пешгӯии оянда объектҳои ҷудошударо истифода баред.
  2. Ҷудо кардани массивҳо алоҳида: даъватҳои мустақили train_test_split(X) ва train_test_split(y) ҷуфтҳоро вайрон карда метавонанд. X, y-ро якҷоя диҳед.
  3. Аргументҳои баръакс: r2_score(y_pred, y_true) парокандагии асосӣ ва натиҷаро дигар мекунад. Тартиби дуруст — аввал воқеият, баъд пешгӯӣ.
  4. Решаи нодуруст: mean_absolute_error(...) ** 0.5 RMSE нест. Решаро аз MSE гиред.
  5. Гирдкунии барвақт: табдили пешгӯиҳо ба int пеш аз метрика маълумотро гум мекунад. Бо ададҳои аслӣ ҳисоб кунед ва танҳо чопро гирд кунед.

Ёднома

Абзор Вазифа
train_test_split(X, y, ...) тақсимоти мувофиқ
random_state=... омехтакунии такроршаванда
mean_absolute_error хатои мутлақи миёна, хурдтар беҳтар аст
mean_squared_error квадрати миёнаи хато, хурдтар беҳтар аст
MSE ** 0.5 RMSE бо воҳидҳои ҷавоб
r2_score(y_true, y_pred) 1 — комил, қиматҳои манфӣ имкон доранд