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

Таснифот

Таснифот барои чӣ лозим аст

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

Категорияҳои маълумро синфҳо ва ҷавоби объекти мушаххасро тамғаи синф меноманд. Ҷадвали X мисли пеш аломатҳо ва y барои ҳар сатр як тамғаро дар бар мегирад. Интерфейс шинос аст: fit аз мисолҳои тамғадор меомӯзад, predict тамғаҳои объектҳои навро бармегардонад. Ду тарзи гуногуни чунин интихобро мебинем.

1. Овоздиҳии ҳамсояҳо

Усули ҳамсояҳои наздиктарин, ё kNN, ба ин фарз такя мекунад: объектҳои монанд аксаран ба як синф тааллуқ доранд. Барои нуқтаи нав модел k нуқтаи наздиктарини омӯзиширо ёфта, тамғаи сершумортарини онҳоро интихоб мекунад. n_neighbors шумораи овоздиҳандагон аст, на шумораи синфҳо.

Дар мисоли якченакаи одӣ наздикӣ фарқи хурди қиматҳоро мефаҳмонад. Тамғаҳои A ва B нишонаҳои шартии ду навъи мавод ва аломат ченаки сенсор аст.

from sklearn.neighbors import KNeighborsClassifier
X = [[1], [2], [4], [8], [9], [11]]
y = ["A", "A", "A", "B", "B", "B"]
model = KNeighborsClassifier(n_neighbors=3).fit(X, y)
print(model.predict([[3], [10]]).tolist())
print(model.classes_.tolist())

Натиҷа:

['A', 'B']
['A', 'B']

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

2. Интихоби шумораи ҳамсояҳо

Ҳангоми k=1 наздиктарин объект ҳама чизро ҳал мекунад: як хатои тамғагузорӣ пешгӯиро осон дигар мекунад. Бо k-и калон қарор ҳамвортар шуда, гурӯҳи хурдро гум карда метавонад. Танҳо аз дурустии омӯзишӣ қимати беҳтаринро муайян кардан намешавад: сифатро дар додаҳои ҷудошуда муқоиса мекунанд. k набояд аз шумораи объектҳои омӯзишӣ зиёд бошад.

Дар мисол як нуқтаи синфи B бо нуқтаҳои A иҳота шудааст. Ҳамсояи наздиктарин ва аксарияти се ҳамсоя ҷавобҳои гуногун медиҳанд:

from sklearn.neighbors import KNeighborsClassifier
X = [[0], [2], [3], [7], [9]]
y = ["A", "B", "A", "A", "A"]
for k in [1, 3]:
    model = KNeighborsClassifier(n_neighbors=k).fit(X, y)
    print(k, model.predict([[2.1]]).tolist())

Натиҷа:

1 ['B']
3 ['A']

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

3. Регрессияи логистикӣ

Бо вуҷуди номаш регрессияи логистикӣ таснифгар аст. Дар ҳолати дусинфа он баҳои хаттии z = a + b1 x1 + …-ро ҳисоб ва бо сигмоидаи p = 1/(1+e-z) ба адади байни 0 ва 1 табдил медиҳад. Ин арзёбии эҳтимолияти синфи дуюм бо тартиби classes_ аст.

Параметрҳо тавре интихоб мешаванд, ки синфҳои дуруст эҳтимолияти баланд гиранд. Бо нобаёнӣ регуляризатсия — маҳдуд кардани коэффисиентҳои аз ҳад калон — истифода мешавад. Он аз мутобиқшавии зиёдатӣ ба мисолҳои ҷудогона кӯмак мекунад. C қувваи онро идора мекунад: C ҳар қадар хурд бошад, маҳдудият қавитар аст.

from sklearn.linear_model import LogisticRegression
X = [[0], [1], [2], [6], [7], [8]]
y = [0, 0, 0, 1, 1, 1]
model = LogisticRegression().fit(X, y)
print(model.predict([[1.5], [6.5]]).tolist())
print(model.predict_proba([[1.5], [6.5]]).round(3).tolist())

Натиҷа:

[0, 1]
[[0.919, 0.081], [0.081, 0.919]]

4. Эҳтимолиятҳоро чӣ гуна хонем

predict барои ҳар объект як тамға бармегардонад. predict_proba ҷадвали андозааш (объектҳо, синфҳо) медиҳад: сатр ба объект ва сутун ба синф тааллуқ дорад. Ҷамъи қиматҳои сатр бо назардошти хатои ҳисобӣ 1 аст. Эҳтимолияти 0.8 арзёбии модел аст, на ваъдаи ҳатман рӯй додани воқеаи мушаххас.

Тартиби сутунҳоро ҳамеша аз model.classes_ санҷед, махсусан агар тамғаҳо сатр бошанд. Сутуни дуюм ҳатман ҳодисаи лозимро ифода намекунад. Дар мисол синфи мақсаднок A аст, бинобар ин индексашро ошкоро меёбем:

from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=3).fit([[0], [2], [4]], ["A", "B", "A"])
proba = model.predict_proba([[1]])
index = list(model.classes_).index("A")
print(model.classes_.tolist())
print(proba.round(3).tolist())
print(round(proba[0, index], 3))

Натиҷа:

['A', 'B']
[[0.667, 0.333]]
0.667

Дар kNN бо вазнҳои баробар эҳтимолиятҳо ҳиссаи овозҳои ҳамсояҳоянд. Ду овоз аз се 2/3 медиҳад. Дар регрессияи логистикӣ эҳтимолиятҳо аз коэффисиентҳои омӯхташуда ҳосил мешаванд, аз ин рӯ бо ҳиссаҳои 1/k маҳдуд нестанд. Ҳангоми зарурат остонаи қарорро мустақилона интихоб кардан мумкин аст; арзёбии чунин интихобро дар мавзӯи метрикаҳо меомӯзем.

5. Ҳиссаи ҷавобҳои дуруст

Accuracy шумораи тамғаҳои мувофиқ ба шумораи объектҳо тақсимшуда аст. Он барои шиносоии аввал мувофиқ аст, махсусан агар синфҳо тақрибан баробар ва арзиши хатоҳо яксон бошад. Масофаи ададии байни рамзҳои синфҳо истифода намешавад: ба ҷойи 1 пешгӯӣ кардани 2 аз ҳолати баръакс «ду баробар бадтар» нест.

from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=1).fit([[0], [2], [8], [10]], [0, 0, 1, 1])
X_test = [[1], [3], [9], [11]]
y_test = [0, 1, 1, 1]
pred = model.predict(X_test)
print(pred.tolist())
print(accuracy_score(y_test, pred))
print(model.score(X_test, y_test))

Натиҷа:

[0, 0, 1, 1]
0.75
0.75

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

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

Яксон будани методҳои fit, predict, score маънои яксон будани алгоритми дохилиро надорад. score-и таснифгар одатан accuracy ва барои регрессори мавзӯи гузашта R² аст. Ҳамеша ададро бо метрикаи мушаххас ва додаҳои ҷудогонаи санҷишӣ пайваст кунед.

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

  1. Ҳамсояҳои аз ҳад зиёд: n_neighbors=10 бо шаш объекти омӯзишӣ ҳангоми пешгӯӣ хато медиҳад. Баъд аз тақсимот шумораи объектҳоро маҳз дар қисми омӯзишӣ ҳисоб кунед.
  2. Синф ба ҷойи эҳтимолият: model.predict(X_new) тамғаҳо медиҳад. Барои эҳтимолиятҳо predict_proba ва сутуни мувофиқ аз classes_-ро истифода баред.
  3. Миқёсҳои омехта: додани синну сол ва даромад бе омодасозӣ метавонад даромадро ягона аломати назарраси масофа гардонад. Миқёсбандии танҳо аз қисми омӯзишӣ омӯхташударо истифода баред.
  4. Ҳамгароӣ нест: max_iter-и хеле хурд дар LogisticRegression метавонад ConvergenceWarning диҳад. Миқёси аломатҳоро санҷед, ҳангоми зарурат max_iter-ро зиёд кунед ва моделро боз арзёбӣ намоед.
  5. Як синф дар омӯзиш: агар дар y_train танҳо як тамға бошад, LogisticRegression сарҳади байни синфҳоро омӯхта наметавонад. Таркиби маҷмуаҳоро санҷед; барои додаҳои мувофиқ дар тақсимот stratify=y-ро истифода баред.

Ёднома

Метод Натиҷа
KNeighborsClassifier(n_neighbors=k) овоздиҳии ҳамсояҳо
LogisticRegression() таснифгар бо эҳтимолиятҳо
fit(X_train, y_train) омӯзиш аз объектҳои тамғадор
predict(X_new) як тамға барои ҳар объект
predict_proba(X_new) як эҳтимолият барои ҳар объект ва синф
classes_ тартиби сутунҳои эҳтимолият
accuracy_score(y_true, y_pred) ҳиссаи тамғаҳои дуруст