Дарахтони қарор ва санҷиши салибӣ
Дарахтон барои чӣ лозиманд
Баъзан вобастагиро бо пайдарпайии саволҳо фаҳмондан осон аст: «ҳарорат аз остона баланд аст?» → «ларзиш сахт аст?» → «дастгоҳ ба санҷиш фиристода шавад». Дарахти қарор чунин қоидаҳоро аз мисолҳои омӯзишӣ месозад. Ҳар савол объектҳоро ба ду гурӯҳ ҷудо мекунад ва гурӯҳи ниҳоӣ ҷавоб медиҳад.
Дарахтон ҳам барои таснифот ва ҳам барои регрессия мувофиқанд. Онҳоро ҳамчун нақшаи қарор хондан мумкин аст; барои аломатҳои ададии маъмулӣ стандартонӣ лозим нест, зеро муқоиса бо остона тартиби қиматҳоро нигоҳ медорад. Категорияҳои сатриро ҳамоно пешакӣ рамзгузорӣ бояд кард. Хатари асосии дарахт аз ҳад муфассал аз ёд кардани додаҳои омӯзишӣ аст.
1. Реша, гиреҳҳо ва баргҳо
Реша саволи аввал, гиреҳ саволи дохили дарахт ва барг ҷойест, ки саволҳо тамом шуда, пешгӯӣ дода мешавад. Дар дарахти ададӣ савол шакли аломат <= остона дорад. Объектҳои ҷавобашон «ҳа» ба як шоха ва боқимонда ба шохаи дигар мераванд.
DecisionTreeClassifier тақсимотеро меҷӯяд, ки баъд аз он гурӯҳҳо аз рӯйи синф якҷинстар шаванд. Дар мисоли одӣ як остона барои ҷудо кардани ду синфи ченкуниҳо кофист. export_text қоидаи омӯхташударо нишон медиҳад; feature_names номи аломатро медиҳад, вале моделро дигар намекунад.
from sklearn.tree import DecisionTreeClassifier, export_text
X = [[2], [4], [6], [14], [16], [18]]
y = [0, 0, 0, 1, 1, 1]
tree = DecisionTreeClassifier(max_depth=1, random_state=0).fit(X, y)
print(tree.predict([[5], [15]]).tolist())
print(export_text(tree, feature_names=["sensor"]).strip())
Натиҷа:
[0, 1]
|--- sensor <= 10.00
| |--- class: 0
|--- sensor > 10.00
| |--- class: 1
Остона байни қиматҳои ҳамсояи фарқкунанда ҷой мегирад, дар ин ҷо байни 6 ва 14. Нуқтаи маҳз дар остонабуда ба шохаи <= меравад. Барои ҳар объекти нав дарахт танҳо саволҳои як роҳро мехонад, бинобар ин модели хурд зуд пешгӯӣ мекунад.
2. Чуқурӣ ва азёдкунӣ
Чуқурӣ шумораи калонтарини гузаришҳо аз реша то барг аст; дарахти дорои як савол чуқурии 1 дорад. max_depth ҳадди болоиро медиҳад, вале дарахти воқеӣ метавонад камчуқуртар бошад. min_samples_leaf сохтани баргҳои дорои объектҳои хеле камро манъ мекунад.
Дарахти аз ҳад камчуқур қонуниятро намебинад — ин камомӯзӣ аст. Дарахти хеле чуқур метавонад ғавғоро аз ёд кунад — азёдомӯзӣ. Афзоишро маҳдуд карда, мураккабии мувофиқро бо санҷиши мустақил интихоб мекунанд. Мисоли навбатӣ танҳо дурустии омӯзиширо нишон медиҳад: афзоиши он ҳанӯз далели умумисозии беҳтар нест.
from sklearn.tree import DecisionTreeClassifier
X = [[0], [1], [2], [3], [4], [5]]
y = [0, 0, 1, 1, 0, 0]
for depth in [1, 3]:
tree = DecisionTreeClassifier(max_depth=depth, random_state=0).fit(X, y)
print(tree.get_depth(), tree.get_n_leaves(), round(tree.score(X, y), 3))
Натиҷа:
1 2 0.667
2 3 1.0
Агар саволҳои яксонхуб беҳбудии баробар диҳанд, интихоб метавонад аз тасодуф вобаста бошад. random_state омӯзишро такроршаванда мекунад, вале азёдомӯзиро бартараф намекунад. Ду дарахт бо ҳолатҳои ибтидоии гуногун метавонанд каме фарқ кунанд.
3. Ҷавоби ададӣ дар барг
Дарахти регрессия ҳамин сохторро дорад, вале бо меъёри стандартии squared_error дар барг миёнаи ҷавобҳои омӯзишии ҳамин барг пешгӯӣ мешавад. Он мисли регрессияи хаттӣ хати моилро берун аз ҳудуди додаҳо идома намедиҳад. Дар дохили як барг пешгӯӣ доимист.
Дар мисоли навбатӣ ҷавобҳо ба ду гурӯҳ ҷудо мешаванд. Объекти нави берун аз ҳудуди омӯзиш ба барги канорӣ афтода, миёнаи онро мегирад.
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor(max_depth=1, random_state=0).fit([[0], [1], [2], [3]], [2, 4, 10, 12])
print(model.predict([[0.5], [2.5], [10]]).tolist())
Натиҷа:
[3.0, 11.0, 11.0]
4. Аҳамияти аломатҳо
Дарахт feature_importances_-ро нигоҳ медорад: ҳар аломат ҳангоми омӯзиш чӣ қадар ба кам кардани омехтагии гурӯҳҳо кӯмак кард. Барои таснифот бо нобаёнӣ меъёри Gini ва барои регрессия квадрати хато истифода мешавад. Камшавиҳо аз рӯйи шумораи объектҳо вазн гирифта, барои ҳар аломат ҷамъ ва меъёрбандӣ мешаванд. Агар тақсимоти муфид бошад, ҷамъи аҳамиятҳо 1 аст.
Аломати истифоданашуда 0 мегирад. Агар дарахт умуман тақсимот накунад, ҳамаи аҳамиятҳо сифр мешаванд, на ҷамъашон 1. Ҳар ду ҳолатро месанҷем; сутуни дуюми вуруд доимист.
from sklearn.tree import DecisionTreeClassifier
X = [[0, 7], [1, 7], [2, 7], [3, 7]]
tree = DecisionTreeClassifier(random_state=0).fit(X, [0, 0, 1, 1])
print(tree.feature_importances_.tolist())
constant = DecisionTreeClassifier(random_state=0).fit(X, [1, 1, 1, 1])
print(constant.feature_importances_.tolist())
Натиҷа:
[1.0, 0.0]
[0.0, 0.0]
Аҳамият модели мушаххасро тавсиф мекунад, на сабабиятро, ва метавонад ба аломатҳои дорои остонаҳои зиёди имконпазир моил бошад. Ҳангоми аломатҳои ивазшаванда дарахт метавонад якеро интихоб карда, дигареро сифр гузорад. Барои таҳлили ҷиддӣ аҳамияти ҷойивазкунӣ дар додаҳои санҷиширо низ истифода мебаранд.
5. Санҷиши салибӣ ба ҷойи як санҷиши тасодуфӣ
Санҷиши салибӣ (cross-validation) додаҳоро ба якчанд қисм, ё folds, ҷудо мекунад. Барои ҳар қисм модели нави мустақил сохта мешавад: дар қисмҳои дигар меомӯзад ва дар қисми интихобшуда арзёбӣ мешавад. Бо cv=5 панҷ баҳо ҳосил мешавад; ҳар объект як бор дар санҷиш ва чор бор дар омӯзиш иштирок мекунад.
cross_val_score як экземплярро пайдарпай намеомӯзонад: он нусхаҳои моделро бо танзимоти яксон истифода мебарад. Барои таснифгар баҳои стандартӣ accuracy аст. Маҷмуаи дохилии Iris-ро истифода мебарем: он бо китобхона меояд ва боргириро талаб намекунад.
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
X, y = load_iris(return_X_y=True)
scores = cross_val_score(DecisionTreeClassifier(max_depth=2, random_state=0), X, y, cv=5)
print(scores.round(3).tolist())
print(round(scores.mean(), 3))
Натиҷа:
[0.933, 0.967, 0.9, 0.867, 1.0]
0.933
Бо cv-и бутун барои таснифоти маъмулӣ қисмҳои стратификатсияшуда истифода мешаванд: ҳиссаҳои синфҳоро нигоҳ доштан мекӯшанд. Бо нобаёнӣ омехтакунӣ нест. Аз ин рӯ, додаҳо бояд аз ҳар синф объектҳои кофӣ дошта бошанд; панҷ қисм санҷиши боэътимоди синфи дорои ду объект нест. Барои регрессор бо нобаёнӣ KFold-и одӣ истифода мешавад ва score маънои R² дорад.
Агар омехтакунии такроршаванда лозим бошад, StratifiedKFold-ро ошкоро созед ва ба cv диҳед. Барои муқоисаи танзимоти гуногун як splitter-ро истифода бурдан қулай аст.
from sklearn.model_selection import StratifiedKFold
X = [[i] for i in range(12)]
y = [0] * 6 + [1] * 6
splitter = StratifiedKFold(n_splits=3, shuffle=True, random_state=4)
for train, test in splitter.split(X, y):
print(len(train), len(test), sum(y[i] for i in test))
Натиҷа:
8 4 2
8 4 2
8 4 2
Дарахт ва санҷиш дар дохил чӣ гуна кор мекунанд
Омӯзиши дарахт ҳарисона аст: дар гиреҳи ҷорӣ беҳтарин саволи дастрас интихоб шуда, баъд алгоритм барои гурӯҳҳои фарзандӣ такрор мешавад. Он ҳамаи дарахтони пурраи имконпазирро намесанҷад ва сохтори беҳтарини умумиро кафолат намедиҳад. Бо Gini-и стандартӣ саволи хуб омехтагии синфҳоро кам мекунад; дар гиреҳи пок ҳамаи тамғаҳо яксонанд. Қатъшавӣ ҳамчунин аз маҳдудиятҳо, имкони тақсимот ва мавҷудияти беҳбудӣ вобаста аст.
Дар таснифот барг ҳиссаҳои синфҳои объектҳои омӯзиширо нигоҳ медорад; predict синфи дорои ҳиссаи калонтаринро интихоб мекунад. Дар регрессия бо меъёри квадрати маъмулии хато миёна гирифта мешавад. Ҳамин тавр саволҳо ва ҷавобҳои ниҳоӣ қисмҳои гуногуни як модел мемонанд.
Миёнаи санҷиши салибӣ вобастагиро аз як тақсимот кам мекунад, вале сифатро барои ҳамаи додаҳои оянда кафолат намедиҳад. Барои вақт тақсимоти вақтӣ ва барои мушоҳидаҳои такрории як объект тақсимоти гурӯҳӣ лозим аст. Агар миқёсбандӣ ё рамзгузорӣ бошад, тамоми Pipeline-ро ба санҷиши салибӣ диҳед: он гоҳ омодасозӣ дар ҳар қисми омӯзишӣ меомӯзад.
Барои интихоби гиперпараметрҳо баҳои номзадҳоро дар қисмҳои яксон муқоиса мекунанд; абзори худкор GridSearchCV аст. Баъд аз интихоб моделро одатан дар ҳамаи додаҳои дастраси омӯзишӣ аз нав меомӯзонанд ва баҳои ниҳоиро дар тести алоҳида мегиранд. RandomForestClassifier дарахтони зиёди бо унсурҳои тасодуфӣ омӯхташударо муттаҳид карда, аксаран пешгӯиҳои устувортар медиҳад.
Хатоҳои маъмул ва ислоҳи онҳо
- Мураккабӣ маҳдуд нест:
DecisionTreeClassifier()метавонад ғавғоро аз ёд кунад.max_depth-ро маҳдуд ёmin_samples_leaf-ро зиёд карда, баҳои санҷиширо муқоиса кунед. - Чуқурӣ ҳамчун шумораи баргҳо:
max_depth=3маънои се баргро надорад. Чуқуриро боget_depth()ва баргҳоро боget_n_leaves()бинед. - Аҳамиятҳо пеш аз омӯзиш: муроҷиат ба
feature_importances_пеш азfitқиматҳои омӯхташударо намедиҳад. Аввал моделро омӯзонед, баъд элементҳоро бо сутунҳои аслӣ бо ҳамон тартиб мувофиқ кунед. - Қисмҳои номуносиб:
cv=5бо объектҳои хеле ками як синф огоҳӣ, хато ё баҳои нобовар медиҳад. Басомади синфҳоро санҷида, шумораи иҷозатпазири қисмҳоро интихоб кунед. - Омодасозӣ берун аз CV: рамзгузорӣ ё миқёсбандӣ дар тамоми
Xпеш азcross_val_scoreмаълумоти қисмҳои санҷиширо ба омӯзиш медиҳад. Омодасозӣ ва моделро дар Pipeline ҷой диҳед.
Ёднома
| Абзор | Маъно |
|---|---|
DecisionTreeClassifier |
синф аз саволҳо дар бораи аломатҳо |
DecisionTreeRegressor |
ҷавоби ададӣ аз барг |
max_depth, min_samples_leaf |
маҳдудияти мураккабӣ |
random_state |
интихоби тасодуфии такроршаванда |
export_text(tree) |
матни саволҳои омӯхташуда |
feature_importances_ |
аҳамиятҳо бо тартиби аломатҳо, ҳама метавонанд сифр бошанд |
cross_val_score(..., cv=5) |
панҷ баҳодиҳии мустақили санҷишӣ |
scores.mean() |
сифати миёна аз рӯйи қисмҳо |