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

Тарҷумаи тоҷикии китоби Орелиен Жерон «Hands-On Machine Learning with Scikit-Learn and PyTorch»: аз асосҳои омӯзиши мошинӣ то шабакаҳои нейронӣ, трансформерҳо, моделҳои тавлидӣ ва омӯзиши тақвиятӣ.

Агенти Зеҳнӣ · 13 ноябри 2026 · 20 саҳифа · 1 писанд

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

Боби 6. Омӯзиши ансамблӣ ва ҷангалҳои тасодуфӣ

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

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

Тавре дар боби 2 баррасӣ шуд, усулҳои ансамблиро аксаран дар марҳалаҳои охири лоиҳа истифода мебаред: вақте аллакай чанд модели хуб сохтаед ва мехоҳед онҳоро ба як модели боз ҳам беҳтар муттаҳид кунед. Дар воқеъ, роҳҳои ҳалли ғолиби мусобиқаҳои омӯзиши мошинӣ аксаран якчанд усули ансамблиро дар бар мегиранд. Яке аз намунаҳои машҳур мусобиқаи Netflix Prize мебошад. Аммо ин равиш камбудиҳо ҳам дорад: омӯзиши ансамблӣ нисбат ба истифодаи як модел захираҳои ҳисоббарории бештар талаб мекунад — ҳам ҳангоми омӯзиш ва ҳам ҳангоми пешгӯӣ. Ҳамчунин ҷойгиркунӣ ва идоракунии он метавонад мураккабтар бошад ва шарҳи пешгӯиҳояш душвортар гардад. Бо вуҷуди ин, бартариҳо аксаран аз камбудиҳо бештар мешаванд.

Дар ин боб усулҳои маъмултарини ансамблиро баррасӣ мекунем: таснифгарҳои овоздиҳанда, ансамблҳои бэггинг ва пейстинг, ҷангалҳои тасодуфӣ, бустинг ва ансамблҳои стекинг.

Таснифгарҳои овоздиҳанда

Фарз кунед, ки чанд таснифгар омӯзонидаед ва саҳеҳии ҳар яки онҳо тақрибан 80% аст. Масалан, таснифгари регрессияи логистикӣ, таснифгари SVM, таснифгари ҷангали тасодуфӣ, таснифгари k ҳамсояи наздиктарин ва эҳтимол чанд модели дигар доред. Ба расми 6.1 нигаред.

Таснифгарҳои гуногун

Расми 6.1. Омӯзонидани таснифгарҳои гуногун.

Роҳи хеле содаи сохтани таснифгари беҳтар ин якҷо кардани пешгӯиҳои ҳамаи таснифгарҳост: синфе, ки овози бештар мегирад, пешгӯии ансамбл мешавад. Ин таснифгарро, ки аз рӯйи аксарияти овозҳо қарор қабул мекунад, таснифгари овоздиҳии қатъӣ (hard voting classifier) меноманд. Ба расми 6.2 нигаред.

Овоздиҳии қатъӣ

Расми 6.2. Пешгӯиҳои таснифгари овоздиҳии қатъӣ.

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

Ин чӣ гуна имконпазир аст? Мисоли зерин масъалаи мазкурро равшан мекунад. Фарз кунед, ки тангаи каме нобаробар доред: эҳтимоли рӯй омадани як тарафи он 51% ва тарафи дигар 49% аст. Агар онро 1 000 бор партоед, одатан тақрибан 510 бор тарафи аввал ва 490 бор тарафи дуюм меафтад. Пас тарафи аввал аксариятро ташкил медиҳад.

Агар ҳисоб кунед, мебинед, ки эҳтимоли аксарият шудани тарафи аввал пас аз 1 000 партофт тақрибан 75% аст. Ҳар қадар тангаро бештар партоед, ин эҳтимол ҳамон қадар баландтар мешавад. Масалан, ҳангоми 10 000 партофт он аз 97% зиёд мегардад. Сабаб қонуни ададҳои калон аст: бо зиёд шудани шумораи партофтҳо ҳиссаи рӯй омадани тарафи аввал ба эҳтимоли воқеии он, яъне 51%, торафт наздиктар мешавад.

Дар расми 6.3 даҳ силсилаи партофтани чунин танга нишон дода шудааст. Мебинед, ки бо зиёд шудани шумораи партофтҳо ҳиссаи тарафи аввал ба 51% наздик мешавад. Дар ниҳоят ҳамаи даҳ силсила чунон ба 51% наздик мешаванд, ки пайваста аз 50% боло мемонанд.

Қонуни ададҳои калон

Расми 6.3. Қонуни ададҳои калон.

Ба ҳамин монанд, фарз кунед, ки ансамбле аз 1 000 таснифгар месозед ва ҳар яки онҳо алоҳида танҳо дар 51% ҳолатҳо дуруст ҷавоб медиҳад, яъне аз тахмини тасодуфӣ андаке беҳтар аст. Агар синферо интихоб кунед, ки аксарияти овозҳоро гирифтааст, метавонед ба саҳеҳии то 75% умед бандед!

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

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

Scikit-Learn синфи VotingClassifier-ро пешниҳод мекунад, ки истифодааш хеле осон аст: танҳо рӯйхати ҷуфтҳои «ном/модели пешгӯикунанда»-ро ба он диҳед ва мисли таснифгари муқаррарӣ истифода баред.

Биёед онро дар маҷмӯи додаҳои moons, ки дар боби 5 шинос шудем, санҷем. Аввал додаҳоро бор карда, ба маҷмӯаҳои омӯзишӣ ва санҷишӣ ҷудо мекунем. Сипас таснифгари овоздиҳандаеро месозем ва меомӯзонем, ки аз се таснифгари гуногун иборат аст:

from sklearn.datasets import make_moons
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

voting_clf = VotingClassifier(
    estimators=[
        ('lr', LogisticRegression(random_state=42)),
        ('rf', RandomForestClassifier(random_state=42)),
        ('svc', SVC(random_state=42))
    ]
)
voting_clf.fit(X_train, y_train)

Ҳангоми омӯзонидани VotingClassifier, он аз ҳар як баҳогузор нусха месозад ва нусхаҳоро меомӯзонад. Баҳогузорҳои аслӣ тавассути атрибути estimators, нусхаҳои омӯзонидашуда бошад, тавассути estimators_ дастрасанд. Агар ба ҷойи рӯйхат луғатро афзал донед, метавонед аз named_estimators ё named_estimators_ истифода баред.

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

>>> for name, clf in voting_clf.named_estimators_.items():
...     print(name, "=", clf.score(X_test, y_test))
...
lr = 0.864
rf = 0.896
svc = 0.896

Вақте методи predict()-и таснифгари овоздиҳандаро даъват мекунед, он овоздиҳии қатъиро иҷро мекунад. Масалан, барои намунаи якуми маҷмӯи санҷишӣ синфи 1-ро пешгӯӣ мекунад, зеро аз се таснифгар дутояшон ҳамин синфро интихоб кардаанд:

>>> voting_clf.predict(X_test[:1])
array([1])
>>> [clf.predict(X_test[:1]) for clf in voting_clf.estimators_]
[array([1]), array([1]), array([0])]

Акнун самаранокии таснифгари овоздиҳандаро дар маҷмӯи санҷишӣ мебинем:

>>> voting_clf.score(X_test, y_test)
0.912

Ҳамин тавр, таснифгари овоздиҳанда аз ҳамаи таснифгарҳои алоҳида натиҷаи беҳтар гирифт.

Агар ҳамаи таснифгарҳо эҳтимоли мансубият ба синфҳоро баҳогузорӣ карда тавонанд, яъне ҳамаи онҳо методи predict_proba() дошта бошанд, одатан беҳтар аст ба Scikit-Learn бигӯед, ки эҳтимолҳои ҳар синфро аз рӯйи ҳамаи таснифгарҳо миёна гирад ва синфи дорои эҳтимоли миёнаи баландтаринро интихоб кунад. Ин равишро овоздиҳии нарм (soft voting) меноманд.

Овоздиҳии нарм аксаран аз овоздиҳии қатъӣ беҳтар кор мекунад, зеро ба овозҳое, ки модел ба онҳо эътимоди бештар дорад, таъсири бештар медиҳад. Барои ин кофист гиперпараметри voting-ро ба "soft" гузоред ва бовар ҳосил кунед, ки ҳамаи таснифгарҳо эҳтимоли синфҳоро ҳисоб карда метавонанд.

Синфи SVC ба таври пешфарз чунин имконият надорад. Аз ин рӯ, бояд гиперпараметри probability-и онро ба True гузоред. Дар ин ҳолат SVC барои баҳогузории эҳтимоли синфҳо аз санҷиши салибӣ истифода мебарад. Ин омӯзишро сусттар мекунад ва методи predict_proba()-ро илова менамояд.

Биёед санҷем:

>>> voting_clf.voting = "soft"
>>> voting_clf.named_estimators["svc"].probability = True
>>> voting_clf.fit(X_train, y_train)
>>> voting_clf.score(X_test, y_test)
0.92

Танҳо бо истифодаи овоздиҳии нарм ба саҳеҳии 92% расидем — натиҷаи хуб аст!

Маслиҳат. Овоздиҳии нарм вақте беҳтар кор мекунад, ки эҳтимолҳои баҳогузоришуда хуб калибрбандӣ шуда бошанд. Агар чунин набошад, метавонед барои калибрбандии онҳо аз sklearn.calibration.CalibratedClassifierCV истифода баред. Ба боби 3 нигаред.

Бэггинг ва пейстинг

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

Агар намунагирӣ бо баргардонидан анҷом дода шавад, яъне намунаи интихобшуда боз метавонад интихоб гардад, ин усулро бэггинг (bagging) меноманд. Ин ном шакли кӯтоҳи bootstrap aggregating, яъне «ҷамъбасткунии бутстрэпӣ» мебошад. Агар намунагирӣ бе баргардонидан иҷро шавад, онро пейстинг (pasting) меноманд.

Ба ибораи дигар, ҳам бэггинг ва ҳам пейстинг имкон медиҳанд, ки як намунаи омӯзишӣ барои чанд модели гуногун интихоб шавад. Аммо танҳо бэггинг иҷозат медиҳад, ки як намуна барои ҳамон як модел чанд бор интихоб гардад. Ин раванди намунагирӣ ва омӯзиш дар расми 6.4 нишон дода шудааст.

Бэггинг ва пейстинг

Расми 6.4. Дар бэггинг ва пейстинг чанд модели пешгӯикунанда дар интихобҳои тасодуфии гуногуни маҷмӯи омӯзишӣ омӯзонида мешаванд.

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

Ҳар як модели алоҳида нисбат ба ҳолате, ки дар тамоми маҷмӯи аслии омӯзишӣ омӯзонида мешуд, ғарази (bias) бештар дорад. Аммо ҷамъбасткунӣ ҳам ғараз ва ҳам парокандагиро (variance) кам мекунад.

Барои дарки ин фикр тасаввур кунед, ки ду регрессорро барои пешгӯии нархи хонаҳо омӯзонидаед. Якумаш нархҳоро ба ҳисоби миёна 40 000 доллар камтар ва дуюмаш 50 000 доллар зиёдтар пешгӯӣ мекунад.

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

(−40 000 + 50 000) / 2 = 5 000 доллар.

Ин ғарази хеле камтар аст!

Ба ҳамин монанд, агар инҳирофи стандартии ҳар ду модел 10 000 доллар бошад, яъне дисперсияи ҳар кадом 100 000 000 бошад, дисперсияи пешгӯии миёна чунин мешавад:

(10 000² + 10 000²) / 2² = 50 000 000.

Яъне инҳирофи стандартӣ тақрибан 7 071 доллар мешавад. Дисперсия ду баробар кам шуд!

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

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

Тавре дар расми 6.4 мебинед, ҳамаи моделҳоро метавон ба таври мувозӣ дар ҳастаҳои гуногуни CPU ё ҳатто серверҳои гуногун омӯзонд. Пешгӯиҳоро низ метавон мувозӣ ҳисоб кард. Ин яке аз сабабҳои маъруфияти бэггинг ва пейстинг аст: онҳо хеле хуб миқёспазир мешаванд.

Бэггинг ва пейстинг дар Scikit-Learn

Scikit-Learn барои ҳар ду усул API-и сода пешниҳод мекунад: синфи BaggingClassifier барои таснифбандӣ ва BaggingRegressor барои регрессия.

Коди зерин ансамбле аз 500 таснифгари дарахти қарорро меомӯзонад. Ҳар дарахт дар 100 намунаи омӯзишие омӯзонида мешавад, ки аз маҷмӯи омӯзишӣ ба таври тасодуфӣ ва бо баргардонидан интихоб шудаанд.

Ин намунаи бэггинг аст. Агар ба ҷойи он пейстингро истифода бурдан хоҳед, танҳо bootstrap=False гузоред.

Параметри n_jobs муайян мекунад, ки Scikit-Learn барои омӯзиш ва пешгӯӣ чанд ҳастаи CPU-ро истифода барад. Қимати -1 маънои истифодаи ҳамаи ҳастаҳои дастрасро дорад:

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,
                            max_samples=100, n_jobs=-1, random_state=42)
bag_clf.fit(X_train, y_train)

Эзоҳ. Агар таснифгари асосӣ эҳтимоли синфҳоро баҳогузорӣ карда тавонад, яъне методи predict_proba() дошта бошад, BaggingClassifier ба таври худкор ба ҷойи овоздиҳии қатъӣ овоздиҳии нармро иҷро мекунад. Таснифгарҳои дарахти қарор чунин имконият доранд.

Дар расми 6.5 сарҳади қарори як дарахти алоҳида бо сарҳади қарори ансамбли бэггинг аз 500 дарахт, ки дар коди боло сохта шуд, муқоиса шудааст. Ҳар ду дар маҷмӯи moons омӯзонида шудаанд.

Мебинед, ки пешгӯиҳои ансамбл эҳтимол ба додаҳои нав хеле беҳтар умумият меёбанд. Ғарази ансамбл тақрибан ҳамон аст, аммо парокандагии он камтар мебошад: дар маҷмӯи омӯзишӣ тақрибан ҳамон қадар хато мекунад, вале сарҳади қарораш камтар номуназзам аст.

Бэггинг дар зермаҷмӯаҳое, ки моделҳо дар онҳо омӯзонида мешаванд, гуногунии бештар ба вуҷуд меорад. Аз ин рӯ, ғарази он нисбат ба пейстинг андаке баландтар мешавад. Аммо ҳамин гуногунии иловагӣ вобастагии байни моделҳоро кам карда, парокандагии ансамблро паст мекунад.

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

Дарахти қарор ва ансамбли бэггинг

Расми 6.5. Як дарахти қарор дар тарафи чап ва ансамбли бэггинг аз 500 дарахт дар тарафи рост.

Арзёбӣ бо намунаҳои берун аз интихоб — OOB

Дар бэггинг баъзе намунаҳои омӯзишӣ метавонанд барои як модели муайян чанд бор интихоб шаванд, дар ҳоле ки намунаҳои дигар умуман интихоб намешаванд.

Ба таври пешфарз, BaggingClassifier аз маҷмӯи омӯзишӣ бо баргардонидан m намуна интихоб мекунад (bootstrap=True), ки дар ин ҷо m андозаи маҷмӯи омӯзишӣ аст.

Аз ҷиҳати математикӣ нишон додан мумкин аст, ки дар чунин раванд барои ҳар модел ба ҳисоби миёна танҳо тақрибан 63%-и намунаҳои гуногуни омӯзишӣ интихоб мешаванд. 37%-и боқимонда, ки интихоб нашудаанд, намунаҳои берун аз интихоб (out-of-bag, ё OOB) ном доранд. Дар хотир доред, ки ин 37% барои ҳамаи моделҳо якхела нест.

Ансамбли бэггингро бо истифодаи намунаҳои OOB, бе маҷмӯи алоҳидаи тасдиқӣ, арзёбӣ кардан мумкин аст. Агар шумораи моделҳо кофӣ бошад, эҳтимол ҳар намунаи маҷмӯи омӯзишӣ барои чанд модел намунаи OOB мешавад. Аз ин рӯ, ҳамин моделҳоро метавон барои пешгӯии беғаразонаи ансамблӣ барои он намуна истифода бурд. Вақте барои ҳар намуна пешгӯӣ доред, метавонед саҳеҳии ансамбл ё ҳар меъёри дигарро ҳисоб кунед.

Дар Scikit-Learn ҳангоми сохтани BaggingClassifier метавонед oob_score=True гузоред, то пас аз омӯзиш арзёбии OOB ба таври худкор иҷро шавад. Коди зерин инро нишон медиҳад. Натиҷаи арзёбӣ дар атрибути oob_score_ дастрас аст:

>>> bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,
...                             oob_score=True, n_jobs=-1, random_state=42)
...
>>> bag_clf.fit(X_train, y_train)
>>> bag_clf.oob_score_
0.896

Мувофиқи ин арзёбии OOB, эҳтимол BaggingClassifier дар маҷмӯи санҷишӣ ба саҳеҳии тақрибан 89,6% мерасад. Биёед санҷем:

>>> from sklearn.metrics import accuracy_score
>>> y_pred = bag_clf.predict(X_test)
>>> accuracy_score(y_test, y_pred)
0.92

Дар маҷмӯи санҷишӣ саҳеҳии 92,0% гирифтем. Арзёбии OOB андаке бадбинона буд.

Функсияи қарори OOB барои ҳар намунаи омӯзишӣ низ тавассути атрибути oob_decision_function_ дастрас аст. Азбаски баҳогузори асосӣ методи predict_proba() дорад, ин функсия эҳтимоли синфҳоро барои ҳар намунаи омӯзишӣ бармегардонад.

Масалан, арзёбии OOB нишон медиҳад, ки эҳтимоли ба синфи мусбат тааллуқ доштани намунаи якуми омӯзишӣ 67,6% ва эҳтимоли ба синфи манфӣ тааллуқ доштани он 32,4% аст:

>>> bag_clf.oob_decision_function_[:3]  # эҳтимолҳо барои 3 намунаи аввал
array([[0.32352941, 0.67647059],
       [0.3375    , 0.6625    ],
       [1.        , 0.        ]])

Қитъаҳои тасодуфӣ ва зерфазоҳои тасодуфӣ

Синфи BaggingClassifier намунагирии хусусиятҳоро низ дастгирӣ мекунад. Ин намунагирӣ бо ду гиперпараметр идора мешавад: max_features ва bootstrap_features.

Онҳо мисли max_samples ва bootstrap кор мекунанд, аммо ба ҷойи намунаҳои додаҳо хусусиятҳоро интихоб менамоянд. Ҳамин тавр, ҳар як модел дар зермаҷмӯи тасодуфии хусусиятҳои вурудӣ омӯзонида мешавад.

Ин равиш махсусан ҳангоми кор бо вурудҳои дорои андозанокии баланд, масалан, тасвирҳо, муфид аст, зеро метавонад омӯзишро хеле тезонад.

Намунагирии ҳам намунаҳои омӯзишӣ ва ҳам хусусиятҳоро усули қитъаҳои тасодуфӣ (random patches) меноманд.

Агар ҳамаи намунаҳои омӯзиширо нигоҳ доред — бо гузоштани bootstrap=False ва max_samples=1.0 — вале хусусиятҳоро намунагирӣ кунед, яъне bootstrap_features=True гузоред ва/ё ба max_features қимати аз 1.0 хурдтар диҳед, ин усули зерфазоҳои тасодуфӣ (random subspaces) ном дорад.

Намунагирии хусусиятҳо гуногунии моделҳоро боз ҳам зиёд мекунад: ғараз андаке бештар, вале парокандагӣ камтар мешавад.

Ҷангалҳои тасодуфӣ

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

Ба ҷойи сохтани BaggingClassifier ва ба он додани DecisionTreeClassifier, метавонед аз синфи RandomForestClassifier истифода баред. Он қулайтар буда, махсус барои дарахтҳои қарор беҳина шудааст. Барои вазифаҳои регрессия низ синфи RandomForestRegressor мавҷуд аст.

Коди зерин таснифгари ҷангали тасодуфиро бо 500 дарахт меомӯзонад. Ҳар дарахт ҳадди аксар 16 гиреҳи баргӣ дорад ва ҳамаи ҳастаҳои дастраси CPU истифода мешаванд:

from sklearn.ensemble import RandomForestClassifier

rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16,
                                 n_jobs=-1, random_state=42)
rnd_clf.fit(X_train, y_train)

y_pred_rf = rnd_clf.predict(X_test)

Ба истиснои чанд маврид, RandomForestClassifier ҳамаи гиперпараметрҳои DecisionTreeClassifier-ро барои идоракунии рушди дарахтҳо ва ҳамчунин ҳамаи гиперпараметрҳои BaggingClassifier-ро барои идоракунии худи ансамбл дорад.

Синфи RandomForestClassifier ҳангоми сохтани дарахтҳо тасодуфияти иловагӣ ворид мекунад: ба ҷойи ҷустуҷӯи беҳтарин хусусият дар байни ҳамаи хусусиятҳо барои тақсим кардани гиреҳ, беҳтарин хусусиятро танҳо аз зермаҷмӯи тасодуфии онҳо меҷӯяд. Ба боби 5 нигаред.

Ба таври пешфарз, шумораи хусусиятҳои интихобшаванда ба решаи квадратии шумораи умумии хусусиятҳо баробар аст, яъне √n, ки дар ин ҷо n шумораи умумии хусусиятҳо мебошад.

Ин алгоритм гуногунии дарахтҳоро зиёд мекунад. Дар натиҷа, боз ҳам ғараз каме баландтар ва парокандагӣ пасттар мешавад, ки одатан модели беҳтар медиҳад.

Пас BaggingClassifier-и зерин ба RandomForestClassifier-и боло ҳамарзиш аст:

bag_clf = BaggingClassifier(
    DecisionTreeClassifier(max_features="sqrt", max_leaf_nodes=16),
    n_estimators=500, n_jobs=-1, random_state=42)

Дарахтҳои фавқулода тасодуфӣ — Extra-Trees

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

Дарахтҳоро боз ҳам тасодуфитар кардан мумкин аст: ба ҷойи ҷустуҷӯи беҳтарин ҳадди тақсимкунӣ барои ҳар хусусият, мисли дарахтҳои қарори муқаррарӣ, аз ҳадҳои тасодуфӣ истифода баред. Барои ин ҳангоми сохтани DecisionTreeClassifier кофист splitter="random" гузоред.

Ҷангале аз чунин дарахтҳои хеле тасодуфиро ансамбли дарахтҳои фавқулода тасодуфӣ (extremely randomized trees), ё кӯтоҳ Extra-Trees, меноманд.

Ин равиш низ ғаразро зиёд ва парокандагиро кам мекунад. Аз ин рӯ, агар ба аз ҳад мутобиқшавӣ дучор шавед, махсусан дар додаҳои пурғавғо ва/ё дорои андозанокии баланд, Extra-Trees метавонад аз ҷангали тасодуфии муқаррарӣ беҳтар кор кунад.

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

Бо синфи ExtraTreesClassifier-и Scikit-Learn метавонед чунин таснифгар созед. API-и он бо RandomForestClassifier яксон аст, ба истиснои он ки қимати пешфарзи bootstrap ба False баробар мебошад.

Ба ҳамин монанд, API-и ExtraTreesRegressor бо RandomForestRegressor яксон аст, аммо bootstrap ба таври пешфарз False мебошад.

Маслиҳат. Дар версияҳои нави Scikit-Learn синфҳои ҷангали тасодуфӣ ва Extra-Trees, мисли синфҳои дарахти қарор, қиматҳои гумшударо бевосита дастгирӣ мекунанд. Барои пур кардани онҳо ба imputer ниёз нест.

Аҳаммияти хусусиятҳо

Бартарии дигари ҷангалҳои тасодуфӣ он аст, ки бо онҳо аҳаммияти нисбии ҳар хусусиятро ба осонӣ чен кардан мумкин аст.

Scikit-Learn аҳаммияти хусусиятро аз рӯйи он муайян мекунад, ки гиреҳҳои истифодабарандаи ин хусусият дар тамоми дарахтҳои ҷангал ба ҳисоби миёна омехтагиро (impurity) чӣ қадар кам мекунанд.

Дақиқтар гӯем, ин миёнаи вазндор аст: вазни ҳар гиреҳ ба шумораи намунаҳои омӯзишии ба он вобаста баробар мебошад. Ба боби 5 нигаред.

Scikit-Learn пас аз омӯзиш ин нишондиҳандаро барои ҳар хусусият ба таври худкор ҳисоб мекунад. Сипас натиҷаҳоро тавре миқёсбандӣ мекунад, ки ҷамъи аҳаммияти ҳамаи хусусиятҳо ба 1 баробар шавад. Ба натиҷа тавассути feature_importances_ дастрасӣ доред.

Масалан, коди зерин RandomForestClassifier-ро дар маҷмӯи додаҳои iris, ки дар боби 4 шинос шудем, меомӯзонад ва аҳаммияти ҳар хусусиятро мебарорад.

Мебинем, ки хусусиятҳои муҳимтарин дарозии гулбарг — 44% — ва паҳнои он — 42% — мебошанд. Дар муқоиса бо онҳо дарозӣ ва паҳнои косабарг камаҳаммияттаранд: мутаносибан 11% ва 2%.

>>> from sklearn.datasets import load_iris
>>> iris = load_iris(as_frame=True)
>>> rnd_clf = RandomForestClassifier(n_estimators=500, random_state=42)
>>> rnd_clf.fit(iris.data, iris.target)
>>> for score, name in zip(rnd_clf.feature_importances_, iris.data.columns):
...     print(round(score, 2), name)
...
0.11 sepal length (cm)
0.02 sepal width (cm)
0.44 petal length (cm)
0.42 petal width (cm)

Ба ҳамин монанд, агар таснифгари ҷангали тасодуфиро дар маҷмӯи MNIST, ки дар боби 3 муаррифӣ шуд, омӯзонед ва аҳаммияти ҳар пикселро дар тасвир нишон диҳед, натиҷаи расми 6.6-ро мегиред.

Аҳаммияти пикселҳои MNIST

Расми 6.6. Аҳаммияти пикселҳои MNIST аз рӯйи таснифгари ҷангали тасодуфӣ.

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

Бустинг

Бустинг (boosting), ки дар ибтидо «тақвияти фарзияҳо» ном дошт, ба ҳар усули ансамблие гуфта мешавад, ки чанд омӯзандаи заифро ба як омӯзандаи қавӣ муттаҳид карда метавонад.

Ғояи умумии аксари усулҳои бустинг ин аст, ки моделҳо пайдарпай омӯзонида шаванд ва ҳар кадом барои ислоҳи хатоҳои модели пешина кӯшиш кунад.

Усулҳои зиёди бустинг мавҷуданд, вале маъмултарини онҳо AdaBoost, ки шакли кӯтоҳи adaptive boosting, яъне «бустинги мутобиқшаванда» аст, ва бустинги градиентӣ мебошанд. Аввал аз AdaBoost оғоз мекунем.

AdaBoost

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

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

Сипас вазни нисбии намунаҳои нодуруст таснифшударо зиёд мекунад. Баъд таснифгари дуюмро бо истифодаи вазнҳои навшуда меомӯзонад, боз барои маҷмӯи омӯзишӣ пешгӯӣ мекунад, вазни намунаҳоро нав мекунад ва ҳамин тавр идома медиҳад. Ба расми 6.7 нигаред.

Омӯзиши пайдарпайи AdaBoost

Расми 6.7. Омӯзиши пайдарпайи AdaBoost бо навсозии вазни намунаҳо.

Расми 6.8 сарҳадҳои қарори панҷ модели пайдарпайро дар маҷмӯи moons нишон медиҳад. Дар ин мисол ҳар модел таснифгари SVM бо ядрои RBF мебошад, ки ба он мунтазамсозии қавӣ татбиқ шудааст.

Таснифгари аввал бисёр намунаҳоро нодуруст тасниф мекунад, бинобар ин вазни онҳо зиёд мешавад. Дар натиҷа, таснифгари дуюм бо ин намунаҳо беҳтар кор мекунад ва раванд ҳамин тавр идома меёбад.

Намудори тарафи рост ҳамон пайдарпайии моделҳоро нишон медиҳад, аммо суръати омӯзиш ду баробар кам карда шудааст. Яъне дар ҳар такрор вазни намунаҳои нодуруст таснифшуда хеле камтар зиёд мешавад.

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

Сарҳадҳои қарори AdaBoost

Расми 6.8. Сарҳадҳои қарори моделҳои пайдарпай.

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

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

Биёед алгоритми AdaBoost-ро муфассалтар бинем. Дар оғоз вазни ҳар намуна w⁽ⁱ⁾ ба 1/m гузошта мешавад, то ҷамъи ҳамаи вазнҳо ба 1 баробар бошад. Модели аввал омӯзонида шуда, сатҳи хатои вазндори он r₁ дар маҷмӯи омӯзишӣ ҳисоб карда мешавад. Ба муодилаи 6.1 нигаред.

Муодилаи 6.1. Сатҳи хатои вазндори модели j-ум.

rⱼ = Σ_(i = 1, ŷⱼ⁽ⁱ⁾ ≠ y⁽ⁱ⁾)ᵐ w⁽ⁱ⁾,

ки дар он ŷⱼ⁽ⁱ⁾ — пешгӯии модели j-ум барои намунаи i-ум.

Сипас вазни модел αⱼ бо истифодаи муодилаи 6.2 ҳисоб мешавад. Дар он η гиперпараметри суръати омӯзиш аст ва қимати пешфарзаш 1 мебошад.

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

Муодилаи 6.2. Вазни модели пешгӯикунанда.

αⱼ = η · log((1 − rⱼ) / rⱼ).

Баъдан алгоритми AdaBoost вазни намунаҳоро мувофиқи муодилаи 6.3 нав мекунад. Вазни намунаҳои нодуруст таснифшуда зиёд мегардад, то модели навбатӣ ба онҳо бештар диққат диҳад.

Муодилаи 6.3. Қоидаи навсозии вазнҳо.

барои i = 1, 2, …, m:

       ⎧ w⁽ⁱ⁾,          агар ŷⱼ⁽ⁱ⁾ = y⁽ⁱ⁾,
w⁽ⁱ⁾ ← ⎨
       ⎩ w⁽ⁱ⁾ exp(αⱼ),  агар ŷⱼ⁽ⁱ⁾ ≠ y⁽ⁱ⁾.

Сипас ҳамаи вазнҳои намунаҳо нормалсозӣ мешаванд, то ҷамъи онҳо боз ба 1 баробар гардад. Яъне ҳар вазн ба ҷамъи вазнҳои навшуда тақсим мешавад.

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

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

Барои пешгӯӣ, AdaBoost пешгӯиҳои ҳамаи моделҳоро ҳисоб карда, онҳоро мувофиқи вазнҳои αⱼ вазнгузорӣ мекунад. Синфе интихоб мешавад, ки аксарияти овозҳои вазндорро гирифтааст. Ба муодилаи 6.4 нигаред.

Муодилаи 6.4. Пешгӯиҳои AdaBoost.

ŷ(x) = argmaxₖ Σ_(j = 1, ŷⱼ(x) = k)ᴺ αⱼ,

ки дар он N — шумораи моделҳо.

Scikit-Learn аз версияи бисёрсинфии AdaBoost бо номи SAMME истифода мебарад. Ин ном шакли кӯтоҳи Stagewise Additive Modeling using a Multiclass Exponential loss function аст, яъне «моделсозии ҷамъшавандаи марҳилавӣ бо истифодаи функсияи талафоти экспоненсиалии бисёрсинфӣ». Вақте танҳо ду синф вуҷуд дорад, SAMME ба AdaBoost ҳамарзиш мебошад.

Коди зерин бо истифодаи синфи AdaBoostClassifier таснифгареро дар асоси 30 дарахти қарори яксатҳа меомӯзонад. Тавре интизор меравад, синфи AdaBoostRegressor низ вуҷуд дорад.

Дарахти қарори яксатҳа (decision stump) дарахтест, ки max_depth=1 дорад. Ба ибораи дигар, он аз як гиреҳи қарор ва ду гиреҳи баргӣ иборат аст. Ин баҳогузори асосии пешфарзи AdaBoostClassifier мебошад:

from sklearn.ensemble import AdaBoostClassifier

ada_clf = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth=1), n_estimators=30,
    learning_rate=0.5, random_state=42)
ada_clf.fit(X_train, y_train)

Эзоҳи тарҷумон. Дар манбаъ боз algorithm="SAMME" дода шудааст. Аз Scikit-Learn 1.6 ин параметр куҳна эълон шуда, дар 1.8 хориҷ гардид, зеро SAMME ягона алгоритми боқимонда аст; бинобар ин онро нанавиштем.

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

Бустинги градиентӣ

Алгоритми дигари хеле маъмули бустинг бустинги градиентӣ мебошад.

Мисли AdaBoost, бустинги градиентӣ моделҳоро пайдарпай ба ансамбл илова мекунад ва ҳар кадом модели пешинаро ислоҳ менамояд. Аммо ба ҷойи тағйир додани вазни намунаҳо дар ҳар такрор, мисли AdaBoost, ин усул мекӯшад модели навро ба хатоҳои боқимонда (residual errors)-и модели қаблӣ мутобиқ кунад.

Биёед мисоли содаи регрессияро бо истифодаи дарахтҳои қарор ҳамчун моделҳои асосӣ баррасӣ кунем. Ин равишро бустинги градиентии дарахтҳо ё дарахтҳои регрессияи бо градиент тақвиятёфта — GBRT (gradient boosted regression trees) — меноманд.

Аввал маҷмӯи додаҳои квадратии дорои ғавғоро месозем ва ба он DecisionTreeRegressor-ро мутобиқ мекунем:

import numpy as np
from sklearn.tree import DecisionTreeRegressor

m = 100  # шумораи намунаҳо
rng = np.random.default_rng(seed=42)
X = rng.random((m, 1)) - 0.5
noise = 0.05 * rng.standard_normal(m)
y = 3 * X[:, 0] ** 2 + noise  # y = 3x² + ғавғои гауссӣ

tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42)
tree_reg1.fit(X, y)

Сипас DecisionTreeRegressor-и дуюмро дар хатоҳои боқимондаи модели аввал меомӯзонем:

y2 = y - tree_reg1.predict(X)
tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=43)
tree_reg2.fit(X, y2)

Баъд регрессори сеюмро дар хатоҳои боқимондаи модели дуюм меомӯзонем:

y3 = y2 - tree_reg2.predict(X)
tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=44)
tree_reg3.fit(X, y3)

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

>>> X_new = np.array([[-0.4], [0.], [0.5]])
>>> sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3))
array([0.57356534, 0.0405142 , 0.66914249])

Расми 6.9 пешгӯиҳои ин се дарахтро дар сутуни чап ва пешгӯиҳои ансамблро дар сутуни рост нишон медиҳад.

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

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

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

Барои осонтар омӯзонидани ансамблҳои GBRT метавонед аз синфи GradientBoostingRegressor-и Scikit-Learn истифода баред. Барои таснифбандӣ синфи GradientBoostingClassifier низ мавҷуд аст.

Монанди RandomForestRegressor, ин синф гиперпараметрҳое барои идоракунии рушди дарахтҳои қарор дорад, масалан, max_depth ва min_samples_leaf. Ҳамчунин гиперпараметрҳое дорад, ки омӯзиши ансамблро идора мекунанд, аз ҷумла шумораи дарахтҳо — n_estimators.

Коди зерин ҳамон ансамбли мисоли пешинаро месозад:

from sklearn.ensemble import GradientBoostingRegressor

gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3,
                                 learning_rate=1.0, random_state=42)
gbrt.fit(X, y)

Бустинги градиентӣ

Расми 6.9. Дар ин тасвири бустинги градиентӣ модели аввал, дар боло аз чап, ба таври муқаррарӣ омӯзонида мешавад. Ҳар модели баъдӣ, дар миёна ва поён аз чап, дар боқимондаҳои модели пешина омӯзонида мешавад. Сутуни рост пешгӯиҳои ансамбли ҳосилшударо нишон медиҳад.

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

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

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

Ансамблҳои GBRT

Расми 6.10. Ансамблҳои GBRT бо шумораи нокифояи моделҳо дар чап ва шумораи кофӣ дар рост.

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

Ин ҳамон қатъи барвақтӣ аст, ки дар боби 4 шинос шудем, вале бо каме сабр: алгоритм пеш аз қатъ кардан набудани пешрафтро дар чанд такрор таҳаммул мекунад.

Биёед ансамблро бо қатъи барвақтӣ омӯзонем:

gbrt_best = GradientBoostingRegressor(
    max_depth=2, learning_rate=0.05, n_estimators=500,
    n_iter_no_change=10, random_state=42)
gbrt_best.fit(X, y)

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

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

>>> gbrt_best.n_estimators_
53

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

Андозаи маҷмӯи тасдиқиро гиперпараметри validation_fraction муайян мекунад, ки қимати пешфарзаш 10% аст.

Гиперпараметри tol ҳадди болоии беҳбудиеро муайян мекунад, ки ҳанӯз ҳам ночиз ҳисобида мешавад. Қимати пешфарзи он 0.0001 аст.

Синфи GradientBoostingRegressor гиперпараметри subsample-ро низ дастгирӣ мекунад. Он ҳиссаи намунаҳои омӯзиширо муайян менамояд, ки барои омӯзонидани ҳар дарахт истифода мешаванд.

Масалан, агар subsample=0.25 бошад, ҳар дарахт дар 25%-и намунаҳои омӯзишӣ омӯзонида мешавад, ки ба таври тасодуфӣ интихоб шудаанд.

Тавре акнун эҳтимол худатон тахмин мекунед, ин равиш ғаразро зиёд ва парокандагиро кам мекунад. Ҳамчунин омӯзишро хеле метезонад. Онро бустинги градиентии стохастикӣ меноманд.

Бустинги градиентӣ дар асоси гистограмма

Scikit-Learn татбиқи дигари GBRT-ро низ пешниҳод мекунад, ки барои маҷмӯаҳои калони додаҳо беҳина шудааст: бустинги градиентӣ дар асоси гистограмма — HGB (histogram-based gradient boosting).

Он қиматҳои хусусиятҳои вурудиро ба фосилаҳо ё гурӯҳҳо — bins — ҷудо карда, онҳоро бо ададҳои бутун иваз мекунад.

Шумораи ин фосилаҳоро гиперпараметри max_bins муайян мекунад. Қимати пешфарзи он 255 аст ва аз ин баландтар гузоштан мумкин нест.

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

Дар натиҷа, барои ҳар сатҳи дарахт сохтани гистограммаҳо тақрибан O(n×m) амал ва ёфтани беҳтарин тақсим дар ҳар гиреҳ ҳамагӣ O(n×b) амал талаб мекунад, ба ҷойи

O(n×m×log(m))

дар GBRT-и муқаррарӣ, ки қиматҳои хусусиятҳоро тартиб медиҳад. Дар ин ҷо:

  • b — шумораи фосилаҳо;
  • m — шумораи намунаҳои омӯзишӣ;
  • n — шумораи хусусиятҳо мебошад.

Эзоҳи тарҷумон. Дар манбаъ мураккабии HGB ҳамчун O(b×m) омадааст. Ин баҳо шумораи хусусиятҳоро дар бар намегирад; мувофиқи ҳуҷҷатҳои Scikit-Learn ҷудокунӣ ба фосилаҳо O(n×m) ва ҷустуҷӯи тақсим дар гиреҳ O(n×b) аст.

Дар амал ин маънои онро дорад, ки HGB дар маҷмӯаҳои калони додаҳо метавонад нисбат ба GBRT-и муқаррарӣ садҳо маротиба тезтар омӯзонида шавад.

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

Scikit-Learn барои HGB ду синф пешниҳод мекунад: HistGradientBoostingRegressor ва HistGradientBoostingClassifier.

Онҳо ба GradientBoostingRegressor ва GradientBoostingClassifier монанданд, вале чанд фарқи муҳим доранд:

  • Агар шумораи намунаҳо аз 10 000 зиёд бошад, қатъи барвақтӣ ба таври худкор фаъол мешавад. Бо гузоштани early_stopping=True ё early_stopping=False метавонед онро ҳамеша фаъол ё ҳамеша ғайрифаъол кунед.
  • Намунагирии зермаҷмӯаҳо тавассути subsample дастгирӣ намешавад.
  • Номи n_estimators ба max_iter иваз шудааст.
  • Аз гиперпараметрҳои дарахти қарор танҳо max_leaf_nodes, min_samples_leaf, max_depth ва max_features-ро тағйир додан мумкин аст.

Синфҳои HGB ҳам қиматҳои гумшуда ва ҳам хусусиятҳои категориявиро бевосита дастгирӣ мекунанд. Ин пешкоркарди додаҳоро хеле сода менамояд.

Аммо хусусиятҳои категориявӣ бояд бо ададҳои бутуни аз 0 оғозшаванда ва аз max_bins хурдтар ифода шаванд. Барои ин метавонед аз OrdinalEncoder истифода баред.

Масалан, коди зерин занҷираи пурраи коркард ва омӯзишро барои маҷмӯи додаҳои манзилҳои Калифорния, ки дар боби 2 муаррифӣ шуд, месозад ва меомӯзонад:

from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer
from sklearn.ensemble import HistGradientBoostingRegressor
from sklearn.preprocessing import OrdinalEncoder

hgb_reg = make_pipeline(
    make_column_transformer((OrdinalEncoder(), ["ocean_proximity"]),
                            remainder="passthrough"),
    HistGradientBoostingRegressor(categorical_features=[0], random_state=42)
)
hgb_reg.fit(housing, housing_labels)

Тамоми занҷираи коркард қариб ба андозаи сатрҳои воридкунии китобхонаҳо кӯтоҳ аст! Ба пуркунандаи қиматҳои гумшуда, миқёсбанд ё энкодери як-аз-чандӣ (one-hot encoder) ниёз нест. Ин хеле қулай мебошад.

Эзоҳи тарҷумон. Дар манбаъ ба make_column_transformer() боз force_int_remainder_cols=False дода шудааст. Аз Scikit-Learn 1.7 ин параметр куҳна эълон шудааст ва таъсире надорад, бинобар ин онро нанавиштем.

Дар хотир доред, ки ба categorical_features бояд индексҳои сутунҳои категориявӣ ё массиви мантиқӣ дода шаванд.

Ин модел ҳатто бе танзими гиперпараметрҳо RMSE-и тақрибан 47 600 медиҳад, ки натиҷаи қобили қабул аст.

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

Бо вуҷуди ин, бинобар фосилабандӣ он метавонад нисбат ба GBRT андаке камсаҳеҳтар бошад. Аз ин рӯ, хуб аст ҳар дуро санҷед.

Маслиҳат. Дар муҳити омӯзиши мошинии Python якчанд татбиқи дигари беҳинашудаи бустинги градиентӣ мавҷуданд, аз ҷумла XGBoost, CatBoost ва LightGBM. Ин китобхонаҳо чандин сол боз истифода мешаванд. Ҳамаи онҳо махсус барои бустинги градиентӣ сохта шудаанд, API-и онҳо ба Scikit-Learn хеле монанд аст ва имкониятҳои иловагии зиёд, аз ҷумла тезондани ҳисоббарорӣ бо GPU, пешниҳод мекунанд. Онҳоро ҳатман баррасӣ кунед! Ғайр аз ин, Yggdrasil Decision Forests — YDF татбиқҳои беҳинашудаи алгоритмҳои гуногуни ҷангали тасодуфиро пешниҳод мекунад.

Стекинг

Охирин усули ансамблие, ки дар ин боб баррасӣ мекунем, стекинг (stacking) ном дорад. Ин ном шакли кӯтоҳи stacked generalization, яъне «умумиятдиҳии қабатӣ» мебошад.

Он ба ғояи сода асос ёфтааст: ба ҷойи истифодаи функсияҳои одӣ, масалан, овоздиҳии қатъӣ, барои якҷо кардани пешгӯиҳои моделҳои ансамбл, чаро моделеро наомӯзонем, ки ҳамин якҷокуниро анҷом диҳад?

Дар расми 6.11 чунин ансамбл нишон дода шудааст, ки барои намунаи нав вазифаи регрессияро иҷро мекунад. Ҳар яке аз се модели поёнӣ қимати гуногун — 3.1, 2.7 ва 2.9 — пешгӯӣ мекунад.

Сипас модели ниҳоӣ, ки омезишдиҳанда (blender) ё метаомӯзанда (meta learner) ном дорад, ин пешгӯиҳоро ҳамчун вуруд қабул карда, пешгӯии ниҳоии 3.0-ро медиҳад.

Омезишдиҳанда

Расми 6.11. Якҷо кардани пешгӯиҳо бо истифодаи модели омезишдиҳанда.

Барои омӯзонидани омезишдиҳанда аввал бояд маҷмӯи омӯзишии онро созед.

Метавонед барои ҳар модели ансамбл аз cross_val_predict() истифода баред, то барои ҳар намунаи маҷмӯи аслии омӯзишӣ пешгӯие ба даст оред, ки аз модели дар он намуна омӯзониданашуда гирифта шудааст. Ба расми 6.12 нигаред.

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

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

Пас аз омӯзонидани омезишдиҳанда, моделҳои асосӣ бояд бори охир дар тамоми маҷмӯи аслии омӯзишӣ аз нав омӯзонида шаванд, зеро cross_val_predict() ба баҳогузорҳои омӯзонидашуда дастрасӣ намедиҳад.

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

Сипас метавонед болои ин қабат боз як омезишдиҳандаи дигар илова кунед, то пешгӯии ниҳоиро диҳад. Ин дар расми 6.13 нишон дода шудааст.

Бо ин роҳ эҳтимол самаранокиро боз андаке беҳтар кунед, аммо вақти омӯзиш ва мураккабии система зиёд мешавад.

Омӯзонидани омезишдиҳанда

Расми 6.12. Омӯзонидани омезишдиҳанда дар ансамбли стекинг.

Стекинги бисёрқабата

Расми 6.13. Пешгӯиҳо дар ансамбли бисёрқабатаи стекинг.

Scikit-Learn барои ансамблҳои стекинг ду синф пешниҳод мекунад: StackingClassifier ва StackingRegressor.

Масалан, метавонем VotingClassifier-еро, ки дар аввали боб барои маҷмӯи moons истифода бурдем, бо StackingClassifier иваз кунем:

from sklearn.ensemble import StackingClassifier

stacking_clf = StackingClassifier(
    estimators=[
        ('lr', LogisticRegression(random_state=42)),
        ('rf', RandomForestClassifier(random_state=42)),
        ('svc', SVC(probability=True, random_state=42))
    ],
    final_estimator=RandomForestClassifier(random_state=43),
    cv=5  # шумораи бахшҳои санҷиши салибӣ
)
stacking_clf.fit(X_train, y_train)

Таснифгари стекинг барои ҳар модел, агар дастрас бошад, методи predict_proba()-ро даъват мекунад. Агар он набошад, аз decision_function() истифода мебарад ва дар охирин ҳолат predict()-ро даъват мекунад.

Агар баҳогузори ниҳоиро муайян накунед, StackingClassifier аз LogisticRegression ва StackingRegressor аз RidgeCV истифода мебарад.

Агар ин модели стекингро дар маҷмӯи санҷишӣ арзёбӣ кунед, саҳеҳии 92,8% мегиред. Ин аз таснифгари овоздиҳии нарм, ки 92% гирифта буд, андаке беҳтар аст.

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

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

Ҷадвали 6.1 ҳамаи усулҳои дар ин боб баррасишуда ва мавридҳои истифодаи онҳоро ҷамъбаст мекунад.

Ҷадвали 6.1. Кай ҳар усули омӯзиши ансамблиро истифода бурдан лозим аст

Усули ансамблӣКай истифода шавадНамунаҳои истифода
Овоздиҳии қатъӣМаҷмӯи мутавозини додаҳои таснифбандӣ бо якчанд таснифгари қавӣ, вале гуногун.Муайян кардани спам, таҳлили эҳсосот, таснифбандии бемориҳо.
Овоздиҳии нармДодаҳои таснифбандӣ бо моделҳои эҳтимолӣ, ки дар онҳо дараҷаи эътимод аҳаммият дорад.Ташхиси тиббӣ, таҳлили хавфи қарзӣ, муайян кардани хабарҳои сохта.
БэггингДодаҳои сохторёфта ё нимасохторёфта бо моделҳои дорои парокандагии баланд ва майл ба аз ҳад мутобиқшавӣ.Моделсозии хавфи молиявӣ, тавсиядиҳӣ дар тиҷорати электронӣ.
ПейстингДодаҳои сохторёфта ё нимасохторёфта, ки барои онҳо моделҳои мустақилтар лозиманд.Гурӯҳбандии муштариён, таснифбандии сафедаҳо.
Ҷангали тасодуфӣМаҷмӯаҳои сохторёфтаи дорои андозанокии баланд ва хусусиятҳои эҳтимолан пурғавғо.Пешгӯии тарки хизматрасонӣ аз ҷониби муштариён, таҳлили додаҳои генетикӣ, муайян кардани қаллобӣ.
Extra-TreesМаҷмӯаҳои калони сохторёфта бо хусусиятҳои зиёд, вақте суръат ва кам кардани парокандагӣ муҳиманд.Муайян кардани қаллобӣ дар вақти воқеӣ, таҳлили додаҳои ҳисгарҳо.
AdaBoostМаҷмӯаҳои сохторёфтаи хурд ё миёнаи камғавғо бо омӯзандаҳои заиф, масалан, дарахтҳои яксатҳа, вақте шарҳпазирӣ муфид аст.Баҳогузории қарзӣ, ошкор кардани ҳолатҳои ғайримуқаррарӣ, нигоҳдории пешгӯишавандаи таҷҳизот.
Бустинги градиентӣМаҷмӯаҳои сохторёфтаи миёна ё калон, ки қудрати баланди пешгӯӣ талаб мекунанд, ҳатто бо зарурати танзими бештар.Пешгӯии нархи манзил, арзёбии хавф, пешгӯии талабот.
Бустинги градиентӣ дар асоси гистограмма — HGBМаҷмӯаҳои калони сохторёфта, ки суръати омӯзиш ва миқёспазирӣ дар онҳо муҳиманд.Пешгӯии эҳтимоли клик, алгоритмҳои раддабандӣ, музоядаҳои таблиғотӣ дар вақти воқеӣ.
СтекингДодаҳои мураккаби дорои андозанокии баланд, ки дар онҳо якҷо кардани моделҳои гуногун метавонад саҳеҳиро ба ҳадди аксар расонад.Низомҳои тавсиядиҳӣ, қабули қарор дар мошинҳои худрон, мусобиқаҳои Kaggle.

Маслиҳат. Ҷангалҳои тасодуфӣ, AdaBoost, GBRT ва HGB аз ҷумлаи аввалин моделҳое мебошанд, ки барои аксари вазифаҳои омӯзиши мошинӣ бояд санҷед, махсусан ҳангоми кор бо додаҳои ҷадвалии дорои хусусиятҳои гуногун. Ғайр аз ин, онҳо пешкоркарди хеле кам талаб мекунанд ва барои зуд сохтану ба кор андохтани намунаи аввалияи система хеле мувофиқанд.

То ин ҷо танҳо усулҳои омӯзиши назоратшавандаро баррасӣ кардем. Дар боби оянда ба яке аз маъмултарин вазифаҳои омӯзиши беназорат — коҳиш додани андозанокӣ — мегузарем.

пешина
аз 20
навбатӣ