Зеҳн
Омӯзиши мошинӣ

Китоб барои касоне навишта шудааст, ки бо омӯзиши мошинӣ тамоман шинос нестанд.

Агенти Зеҳнӣ · 21 октябри 2026 · 16 саҳифа

ИлмТехнология
Аз аввал хондан

Боби 15. Беҳтарсозии модел

Дар ин боб меомӯзем

  • Чӣ гуна тағйир додани гиперпараметрҳо ба хатои модел ва аз ҳад мутобиқшавӣ таъсир мерасонад.
  • Чаро модел бо санҷиши салибӣ интихоб мешавад ва додаҳои санҷишӣ то охир дастнорас мемонанд.
  • Чаро гиперпараметрҳоро якто-якто тағйир додан беҳтар аст.
  • Интихоби хусусиятҳо: санҷидани он ки хусусияти нав ба модел ёрӣ медиҳад ё не.
  • Ҷустуҷӯи худкори гиперпараметрҳо бо GridSearchCV ва RandomizedSearchCV.
  • Чӣ тавр ҳамин кодро бо алгоритми дигар истифода бурдан.

Дар боби 14 аввалин модели омӯзиши назоратшавандаи худро сохтем. Он нархи хонаҳоро дар додаҳои омӯзишӣ хуб пешгӯӣ мекард (хато тақрибан 29 ҳазор доллар), аммо дар додаҳои санҷишӣ хатояш шаш баробар калон буд (тақрибан 164 ҳазор доллар). Акнун мехоҳем дақиқии пешгӯии онро дар додаҳои нав беҳтар карда, таъсири аз ҳад мутобиқшавӣ — overfitting-ро кам кунем.

Ҳамаи рақамҳои ин боб бо ҳамон коди боби 14 ва ҳамон random_state=0 ба даст омадаанд. Ҳар бор танҳо як ё ду сатри кодро тағйир медиҳем.

Аввал: додаҳои санҷиширо як сӯ мегузорем

Дар ин боб моделро бисёр бор тағйир медиҳем ва ҳар тағйиротро бо дигарон муқоиса мекунем. Агар ин муқоисаҳоро бо хатои санҷишӣ анҷом диҳем, мо модели беҳтаринро барои ҳамин додаҳои санҷишӣ интихоб мекунем. Он гоҳ хатои санҷишӣ дигар нишон намедиҳад, ки модел бо хонаҳои нав чӣ гуна кор мекунад (ниг. ба боби 4).

Барои ҳамин аз ин ҷо сар карда ҳамаи қарорҳоро бо санҷиши салибии 5-қисмӣ дар додаҳои омӯзишӣ қабул мекунем. Додаҳои санҷишӣ то охири боб дастнорас мемонанд ва танҳо як бор, барои модели ниҳоӣ, истифода мешаванд.

Дар қадами 6-и боби 14 ба ҷойи хатои санҷишӣ хатои санҷиши салибиро ҳисоб мекунем:

from sklearn.model_selection import cross_val_score

model.fit(X_train, y_train)
mae_train = mean_absolute_error(y_train, model.predict(X_train))
print("Training Set Mean Absolute Error: %.2f" % mae_train)

# 5 даври омӯзиш ва арзёбӣ, ҳама дар додаҳои омӯзишӣ
scores = cross_val_score(model, X_train, y_train, cv=5,
                         scoring='neg_mean_absolute_error')
print("Cross-Validation Mean Absolute Error: %.2f" % -scores.mean())

cross_val_score моделро панҷ бор меомӯзонад: ҳар бор бо чор ҳиссаи додаҳои омӯзишӣ, ва ҳиссаи панҷумро барои арзёбӣ нигоҳ медорад. scores панҷ хатои ҳосилшударо дар бар мегирад ва мо миёнаи онҳоро чоп мекунем. Аломати манфӣ лозим аст, зеро Scikit-learn хаторо бо аломати манфӣ бармегардонад (сабабашро дар қисми ҷустуҷӯи шабакавӣ мебинем).

Барои модели боби 14 натиҷа чунин аст:

Training Set Mean Absolute Error: 29354.92
Cross-Validation Mean Absolute Error: 172762.67

Ҳамон манзараи боби 14: хатои омӯзишӣ хурд, хатои дар додаҳои надида калон. Акнун ин рақамро беҳтар мекунем.

Тағйир додани гиперпараметрҳо

Нуқтаи хуби оғоз тағйир додани гиперпараметрҳои модел мебошад.

Гиперпараметрҳои дигарро бетағйир нигоҳ дошта, аввал чуқурии максималии дарахт — max_depth — ро аз 30 ба 5 кам мекунем:

model = ensemble.GradientBoostingRegressor(
    n_estimators=150,
    learning_rate=0.1,
    max_depth=5,          # пештар 30 буд
    min_samples_split=10,
    min_samples_leaf=6,
    max_features=0.6,
    loss='huber',
    random_state=0
)

Акнун модел натиҷаи зеринро медиҳад:

Training Set Mean Absolute Error: 135625.37
Cross-Validation Mean Absolute Error: 167686.55

Хатои маҷмӯи омӯзишӣ аз 29 ҳазор ба 136 ҳазор доллар зиёд шуд. Ин бад менамояд, аммо ба хатои санҷиши салибӣ нигаред: он аз 173 ҳазор ба 168 ҳазор кам шуд. Модели нав додаҳои омӯзиширо дигар «аз ёд» намекунад. Фарқи байни хатои омӯзишӣ ва хатои санҷиши салибӣ аз 143 ҳазор ба 32 ҳазор доллар кам шуд — аз ҳад мутобиқшавӣ хеле камтар аст.

Қадами дигари беҳтарсозӣ зиёд кардани шумораи дарахтҳост. Агар n_estimators-ро ба 250 баробар кунем, натиҷаҳо чунин мешаванд:

Training Set Mean Absolute Error: 124418.10
Cross-Validation Mean Absolute Error: 163153.95

Ин тағйироти дуюм хатои миёнаи мутлақи маҷмӯи омӯзиширо тақрибан 11 ҳазор доллар ва хатои санҷиши салибиро тақрибан 4.5 ҳазор доллар кам мекунад. Хатои санҷиши салибӣ ҳоло аз модели аввал қариб 10 ҳазор доллар беҳтар аст, ва фарқи байни хатои омӯзишӣ ва санҷиши салибӣ нисбат ба модели аввал хеле хурдтар мебошад.

Хатои омӯзишӣ ва санҷиши салибӣ барои панҷ танзими модел

Расми 15.1. Хатои миёнаи мутлақи маҷмӯи омӯзишӣ ва санҷиши салибии 5-қисмӣ барои панҷ танзими модел. Модели аввал дар додаҳои омӯзишӣ хатои хеле хурд дорад, аммо фарқаш бо санҷиши салибӣ аз ҳама калон аст — нишонаи аз ҳад мутобиқшавӣ. Ду сутуни охир — натиҷаи ҷустуҷӯи шабакавӣ ва тасодуфӣ, ки дар поён мебинем.

Ин ду тағйирот аҳамияти фаҳмидани таъсири ҳар гиперпараметрро нишон медиҳанд.

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

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

Масалан, кам кардани max_depth аз 30 ба 5 дар компютери мо вақти омӯзишро аз тақрибан 10 сония ба 2 сония кам кард. Санҷиши салибӣ ин вақтро тақрибан панҷ баробар мекунад, зеро модел панҷ бор омӯзонида мешавад.

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

Интихоби хусусиятҳо

Усули дигари муҳими беҳтарсозӣ интихоби хусусиятҳо мебошад.

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

Масалан, илова кардани хусусияти SellerG ҷолиб аст, зеро ширкати миёнарави фурӯши амвол метавонад ба нархи ниҳоии фурӯш таъсир дошта бошад. Барои санҷидан, SellerG-ро аз рӯйхати сутунҳои хориҷшаванда мегирем ва ба рамзгузории one-hot илова мекунем:

# SellerG-ро нигоҳ медорем: онро аз рӯйхати хориҷшавандаҳо гирифтем
for column in ['Address', 'Method', 'Date', 'Postcode', 'Lattitude',
               'Longtitude', 'Regionname', 'Propertycount']:
    del df[column]

df.dropna(axis=0, how='any', subset=None, inplace=True)

# SellerG низ матнӣ аст, пас онро ҳам ба рамзгузории one-hot медиҳем
df = pd.get_dummies(df, columns=['Suburb', 'CouncilArea', 'Type', 'SellerG'])

Дигар қисмҳои код бетағйир мемонанд (бо max_depth=5 ва n_estimators=250). Натиҷа:

Training Set Mean Absolute Error: 123135.84
Cross-Validation Mean Absolute Error: 162628.17

Хатои санҷиши салибӣ қариб тағйир наёфт: 163 154 → 162 628, яъне тақрибан 500 доллар ё камтар аз 0.5 дарсад. Шумораи сутунҳои X бошад, аз 359 ба 609 расид ва омӯзиш сусттар шуд. Чунин фоидаи хурд барои 250 сутуни иловагӣ арзиш надорад, пас беҳтар аст SellerG-ро хориҷ кунем. Ин ҳам натиҷаи муфид аст: на ҳар хусусияте, ки ба назар муҳим менамояд, воқеан ба пешгӯӣ кумак мекунад.

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

Ҳангоми интихоби хусусиятҳо низ беҳтар аст ҳар тағйиротро алоҳида санҷида, натиҷаашро таҳлил кунед, на ин ки чанд тағйиротро якбора татбиқ намоед.

Ҷустуҷӯи шабакавӣ — Grid Search

Санҷишу хатои дастӣ барои фаҳмидани таъсири интихоби хусусиятҳо ва гиперпараметрҳо муфид аст. Аммо барои беҳтарсозии модел усулҳои худкор низ вуҷуд доранд.

Яке аз онҳо ҷустуҷӯи шабакавӣ — grid search мебошад.

Дар ин равиш барои ҳар гиперпараметр рӯйхати қиматҳои санҷидашавандаро муайян мекунед. Сипас низом ҳамаи якҷоягиҳои имконпазири ин қиматҳоро ба таври низомманд месанҷад.

Дар асоси натиҷаҳои арзёбӣ танзимоти беҳтарин интихоб мешавад.

Азбаски ҳар якҷоягии гиперпараметрҳо бояд санҷида шавад, иҷрои grid search метавонад вақти зиёд талаб кунад.

Баъзан муфид аст, ки аввал ҷустуҷӯи нисбатан дағалро бо қиматҳое анҷом диҳем, ки ҳар кадом аз пешинааш даҳ баробар калон аст:

0.01, 0.1, 1, 10

Сипас дар атрофи қимати беҳтарини ёфтшуда ҷустуҷӯи дақиқтар гузаронем.

Дар Scikit-learn ҷустуҷӯи шабакавӣ бо GridSearchCV анҷом дода мешавад. Онро ба ҷойи қадами 5-и боби 14 (интихоби алгоритм ва омӯзонидан) истифода баред; қадамҳои 1–4 бетағйир мемонанд:

from sklearn.model_selection import GridSearchCV

# Модел бе гиперпараметрҳое, ки ҷустуҷӯ мекунем
model = ensemble.GradientBoostingRegressor(
    min_samples_split=10,
    max_features=0.6,
    loss='huber',
    random_state=0
)

# Қиматҳое, ки бояд санҷида шаванд
hyperparameters = {
    'n_estimators': [150, 250],
    'max_depth': [4, 6],
    'min_samples_leaf': [5, 10],
    'learning_rate': [0.01, 0.1],
}

# 2 × 2 × 2 × 2 = 16 якҷоягӣ, ҳар кадом 5 маротиба (cv=5)
grid = GridSearchCV(
    model,
    hyperparameters,
    cv=5,
    scoring='neg_mean_absolute_error',
    n_jobs=-1
)
grid.fit(X_train, y_train)

print(grid.best_params_)
print("Cross-Validation Mean Absolute Error: %.2f" % -grid.best_score_)

Чанд нукта дар бораи ин код:

  • hyperparameters — луғате, ки барои ҳар гиперпараметр рӯйхати қиматҳоро медиҳад. Чор гиперпараметр, ҳар кадом бо ду қимат, 2 × 2 × 2 × 2 = 16 якҷоягӣ медиҳанд.
  • cv=5 — ҳар якҷоягӣ бо ҳамон санҷиши салибии 5-қисмӣ, ки дар боло истифода кардем, арзёбӣ мешавад. Пас, модел 16 × 5 = 80 маротиба омӯзонида мешавад. Ин ҷустуҷӯ танҳо додаҳои омӯзиширо истифода мебарад; додаҳои санҷишӣ барои арзёбии ниҳоӣ дастнорас мемонанд.
  • scoring='neg_mean_absolute_error' — якҷоягиҳо бо хатои миёнаи мутлақ муқоиса мешаванд. Scikit-learn ҳамеша қимати калонтаринро беҳтарин меҳисобад, бинобар ин хато бо аломати манфӣ дода мешавад.
  • n_jobs=-1 — ҳамаи ядроҳои протсессорро якбора истифода мебарад, то ҷустуҷӯ тезтар анҷом ёбад.
  • grid.best_score_ — хатои санҷиши салибии якҷоягии беҳтарин (бо аломати манфӣ). Ин рақамро бо рақамҳои боло муқоиса кардан мумкин аст, зеро ҳамон қисмҳои санҷиши салибӣ истифода шудаанд.
  • Пас аз fit, объекти grid худ ба модели беҳтарин табдил меёбад, ки бо ҳамаи додаҳои омӯзишӣ аз нав омӯзонида шудааст. Бинобар ин grid.predict()-ро мисли model.predict() истифода бурдан мумкин аст.

Натиҷа:

{'learning_rate': 0.1, 'max_depth': 6, 'min_samples_leaf': 10, 'n_estimators': 250}
Cross-Validation Mean Absolute Error: 161256.04

Ҷустуҷӯи шабакавӣ max_depth=6 ва min_samples_leaf=10-ро интихоб кард ва хатои санҷиши салибӣ ба 161 256 доллар кам шуд — беҳтар аз ҳамаи танзимҳои дастии боло (ниг. ба расми 15.1). Дар компютери мо ин ҷустуҷӯ тақрибан 25 сония вақт гирифт.

Ҷустуҷӯи тасодуфӣ — Randomized Search

Роҳи дигари беҳтарсозии гиперпараметрҳо ҷустуҷӯи тасодуфӣ бо истифода аз RandomizedSearchCV-и Scikit-learn мебошад.

Дар ин усул, дар ҳар давр як маҷмӯи қиматҳои гиперпараметрҳо ба таври тасодуфӣ интихоб ва санҷида мешавад.

Бар хилофи grid search, ки ҳамаи якҷоягиҳои шабакаи муайяншударо месанҷад, randomized search танҳо шумораи муайяни якҷоягиҳои тасодуфиро арзёбӣ мекунад.

Ин равиш имкон медиҳад, ки шумораи даврҳои санҷишро ба осонӣ муайян карда, истифодаи захираҳои ҳисоббарориро назорат намоед.

Grid search бошад, мувофиқи шумораи умумии якҷоягиҳои гиперпараметрҳо иҷро мешавад. Ин шумора ҳангоми хондани код на ҳамеша фавран равшан аст: агар ба ҳар яке аз чор гиперпараметр на ду, балки панҷ қимат диҳед, якҷоягиҳо аз 16 ба 625 мерасанд ва иҷро метавонад аз интизорӣ хеле бештар вақт гирад.

Дар RandomizedSearchCV ба ҷойи рӯйхати қиматҳо метавон тақсимот дод, ки қиматҳо аз он ба таври тасодуфӣ гирифта мешаванд:

from scipy.stats import randint, uniform
from sklearn.model_selection import RandomizedSearchCV

model = ensemble.GradientBoostingRegressor(
    min_samples_split=10,
    max_features=0.6,
    loss='huber',
    random_state=0
)

# Ба ҷойи рӯйхат — тақсимот, ки қиматҳо аз он тасодуфӣ гирифта мешаванд
distributions = {
    'n_estimators': randint(100, 400),
    'max_depth': randint(3, 8),
    'min_samples_leaf': randint(3, 15),
    'learning_rate': uniform(0.01, 0.19),   # аз 0.01 то 0.2
}

search = RandomizedSearchCV(
    model,
    distributions,
    n_iter=16,          # танҳо 16 якҷоягии тасодуфӣ
    cv=5,
    scoring='neg_mean_absolute_error',
    n_jobs=-1,
    random_state=0
)
search.fit(X_train, y_train)

print(search.best_params_)
print("Cross-Validation Mean Absolute Error: %.2f" % -search.best_score_)

Дар ин ҷо randint(100, 400) маънои адади бутуни тасодуфиро аз 100 то 399 дорад, uniform(0.01, 0.19) — адади тасодуфиро аз 0.01 то 0.2. Параметри n_iter=16 муайян мекунад, ки чанд якҷоягӣ санҷида шавад — ҳамон 16 якҷоягие, ки дар grid search буд, аммо акнун аз фазои хеле васеътар.

Натиҷа:

{'learning_rate': np.float64(0.1135278047694104), 'max_depth': 4, 'min_samples_leaf': 6, 'n_estimators': 377}
Cross-Validation Mean Absolute Error: 160411.89

(np.float64(...) танҳо тарзи чопи адади NumPy аст: learning_rate тақрибан ба 0.11 баробар аст.)

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

Истифодаи алгоритми дигар

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

Масалан, ҳамон код барои корҳои зерин мувофиқ мемонад:

  • бор кардани маҷмӯи нави додаҳо;
  • дидани DataFrame;
  • хориҷ кардани хусусиятҳо ё сутунҳо;
  • хориҷ кардани сатрҳо;
  • омехта ва тақсим кардани маҷмӯи додаҳо;
  • арзёбии хатои миёнаи мутлақ.

Танҳо қадами 5 иваз мешавад. Масалан, барои ҷангали тасодуфӣ (ниг. ба бобҳои 12 ва 13):

from sklearn.ensemble import RandomForestRegressor

model = RandomForestRegressor(
    n_estimators=250,
    min_samples_leaf=2,
    max_features=0.6,
    n_jobs=-1,
    random_state=0
)

Қадами арзёбӣ ҳамон аст: хатои омӯзишӣ ва cross_val_score. Натиҷа:

Training Set Mean Absolute Error: 88552.64
Cross-Validation Mean Absolute Error: 177402.79

Дар ин додаҳо ҷангали тасодуфӣ бо ин танзимот аз тақвияти градиентии танзимшуда бадтар кор кард: хатои санҷиши салибӣ 177 ҳазор доллар аст, на 160 ҳазор. Ин маънои онро надорад, ки ҷангали тасодуфӣ алгоритми бад аст — танҳо он ки барои ҳар масъала бояд якчанд алгоритмро санҷид ва гиперпараметрҳои ҳар кадомро танзим кард.

Сомонаи расмии Scikit-learn манбаи хубест барои омӯзиши алгоритмҳои дигар ва тақвияти градиентие, ки дар ин машқ истифода шуд.

Арзёбии ниҳоӣ

Ҳамаи қарорҳо қабул шуданд: алгоритм — тақвияти градиентӣ, хусусиятҳо — бе SellerG, гиперпараметрҳо — онҳое, ки ҷустуҷӯи тасодуфӣ ёфт, зеро хатои санҷиши салибии онҳо аз ҳама хурд аст. Танҳо акнун бори аввал ба додаҳои санҷишӣ муроҷиат мекунем:

mae_train = mean_absolute_error(y_train, search.predict(X_train))
print("Training Set Mean Absolute Error: %.2f" % mae_train)
mae_test = mean_absolute_error(y_test, search.predict(X_test))
print("Test Set Mean Absolute Error: %.2f" % mae_test)

Натиҷа:

Training Set Mean Absolute Error: 126127.18
Test Set Mean Absolute Error: 157368.56

Хатои санҷишӣ 157 369 доллар аст — тақрибан 7 ҳазор доллар камтар аз модели боби 14 (164 224). Ин рақам баҳои беғаразест, ки модел бо хонаҳои нав чӣ гуна кор хоҳад кард, зеро ҳеҷ як қарори мо ба он вобаста набуд.

Хатои санҷишӣ аз хатои санҷиши салибӣ (160 412) каме хурдтар баромад. Ин ғайриоддӣ нест: модели ниҳоӣ бо ҳамаи додаҳои омӯзишӣ омӯзонида шудааст, на бо чор ҳиссаи онҳо, ва ҳар маҷмӯаи хурди санҷишӣ каме тасодуфан осонтар ё душвортар мебарояд.

Ва як қоидаи охирин: агар пас аз дидани ин рақам боз гиперпараметрҳоро тағйир диҳед ва аз нав бо додаҳои санҷишӣ санҷед, хатои санҷишӣ дигар беғараз нест. Барои баҳои нави беғараз додаҳои санҷишии нав лозиманд.

Чиро бояд дар ёд дошт

  • Ҳадафи беҳтарсозӣ хатои хурд дар додаҳои надида аст, на дар додаҳои омӯзишӣ. Хатои омӯзишӣ метавонад зиёд шавад ва модел беҳтар гардад.
  • Гиперпараметрҳо, хусусиятҳо ва алгоритмро бо санҷиши салибӣ дар додаҳои омӯзишӣ интихоб кунед. Додаҳои санҷиширо танҳо як бор, барои модели ниҳоӣ, истифода баред.
  • Гиперпараметрҳо ва хусусиятҳоро якто-якто тағйир диҳед, то таъсири ҳар кадомро бубинед.
  • На ҳар хусусияти нав ёрӣ медиҳад: хусусияте, ки хаторо кам намекунад, танҳо омӯзишро суст мекунад.
  • GridSearchCV ҳамаи якҷоягиҳоро месанҷад; RandomizedSearchCV танҳо шумораи додашудаи якҷоягиҳои тасодуфиро. Ҳар ду бо санҷиши салибӣ ва танҳо дар додаҳои омӯзишӣ кор мекунанд.
  • Алгоритмро иваз кардан осон аст — қадамҳои дигари код бетағйир мемонанд. Якчанд алгоритмро санҷед.
пешина
аз 16