05 Support Vector Machines#
Въведение#
Проект
обучаване на модели върху данни,
как подаваме данни, как конфигурираме хиперпараметрите,
как диагностицираме модела,
как обясняваме тегловните коефициенти (на линейна регресия, PCA),
за класификация: residual plot, както на скалираните така и на първоначалния ИЗХОД
как решаваме кой хиперпараметри да оптимизираме,
смисъл на хиперпараметри
какви метрики използваме,
кой scaler да използвам
feature extraction, PCA, на неструктурирани данни
да показа classification_report, confusion_matrix,
примери (от тестът)в които моделът бърка
да използвам pipelines
обработка на човешка реч = NLP
saliency map
Когато имаме не-таблични данни, първо трябва да ги превърнем в таблични.
SVM#
Интуиция#
всички алгоритми дотук може да ползваме и за регресия и за класификация дъветата са по-добри класификатори отколкото регресори
входни параметъра = променливи на фунцкията
Спирка с чакащи гледана огторе. Трябва да стигна от start (S) до end (E). Как може да опитимизам пътеката така че да блъсна най-малко хора?
Нова картинка. Два класа. Искаме да ги отделим. Може да направим Анова тест, F test, ще ни покаже че са разделени двете групи наблюдения. Търся коя функиця е възможно най-далече от тях.
И двете линии имат 100% accuracy. Но някакси жълтата е по-далече от данните. Тук идва идеята на опорните вектори.
Support Vector Machines = метод на опорните вектори
по-логично би било да се наричат ‘опорни точки’, но ползваме ‘вектори’
интересува ме само разстоянието до най-близките точки, него искам да оптимизирам това разстояние ще наричаме margin - разстояние до най-близката точка от група
support vector са защото ‘подпират’ точките points of the edge of the dividing hyperplane
уравнение на права
разделянето се нарича още shattering
soft margin
SVM
algorithm
tries to fit a line (= hyperplane) between the different classes to separate them
the line shall be chosen so that the distance to the points of the classes is max
Хиперпараметри#
C - penalty for misclassification
SVM е непрактично бавен при данни с голям брой записи (напр > 1M)
Винаги на практика трябва да скалираме данните. Само в единични случай това влошава данните.w
LinearSVC е по-бърз, SVC може да прави повече неща
хиперпараметрите на SVC много приличат на тези на логистична регресия
Най-важният хиперпараметър (отново) е коеф на регуляризация.
при SVC/SVR имаме САМО L1 или L2 регуляризация, не може и двете
L1 - прави feature selection L2 - намалява стойността на всички тегла заедно
SVM са математически доказано универсални, работят за всичко
Пример: LinearSVC#
имаме една група .coef_
защото имаме 2 класа
тегловните коефициенти на класификатора (модела) можем да ползваме за интерпретация кои са важните feature-и. Това се нарича feature importances.
поредица от импорти от sklean:
preprocessing
модели
алгоритми за избор на модел
метрикки
метриката за оптимизиране в GridSearch по подразбиране е accuracy. Само че ние имаме небалансирани класове (23% са с високи доходи), така че accuracy не е добра метрика. Вместо това, искаме да ползваме F1.
използваме make_scorer
защото не може да извикаме f1_score()
. Така извикано f1_score()
е call функцията и ще иска y_true и y_pred.
Задаваме си и положителния label - този, който ни интересува, в случея - хората с високи доходи (които са по-малко записи).
linear_grid_search = GridSearchCV(
estimator=LinearSVC(max_iter = 1000),
param_grid=param_grid,
scoring = make_scorer(f1_score, pos_label=">50K"),
)
Интерпретация на classification_report#
Интерпретация на classification_report-а долу:
‘>50K’ има сравнително голям precission и малък recall
голям precission = предсказанията са точни, където е казал че е ‘>50К’ наистина е познал
малък recall = хванал е малко от хората с висок доход (‘>50К’), пропуснал е по-голямата част
?? Моделът предсказва еднакво добре и двата сета следоватално моделът е стабилен. Няма голяма нестабилност, няма high variance.
Нестабилен модел (high variance, overfitting) би предсказвал много точно трениращите данни, но би се представял значително по-лошо на тестови.
![[Pasted image 20221013141413.png]]
Kernal trick#
Колкото повече измерения имат входните данни, толко по-вероятно е да има хипер-равнина, която ги разделя (Cover’s theorem).
Превръщане на задача с 1 измерение на входните данни (1 feature) в задача с 2 измерения. Правим данните линейно разделими като добавяме повече измерения.
Идеята прилича на това да направим полиномна регресия от линейна като създадем допълнителни колони с произведения (между колони; polynomial features).
Взимаме данните и проектираме в нови измерения. Целта е новия сет вече да е линейно разделим. Функцията която прави преобразуването се нарича kernal function.
kernal при конволюции на изображения != kernal функция при SVM
radial basis function (rbf)
функция, която е радиална
едно гаусово разпределение в повече на брой измерения
kernel=’poly’ ще работи както работят полиномните feature-и
Пример: SVC with polynomial kernel#
имам голям P на единия клас и голям процент A на другия. Това означава че моделът бърка голяма част от данните. Индикация е че моделът има нужда от повече итерации за да тренира.
Нормално е да направим хубава настройка на хиперпараметрите (grid-search). Друга идея - да увеличим C (по-малко регуляризация).
Алгоритъм, който не е научен, т.е. не е направил достатъчно стъпки за да достигне минимум, има голям bais. ![[Pasted image 20221013162218.png]]
различни kernels link
Линейният kernal представлява скаларното произведение на 2 вектора.
триъгълните скоби (angled brackets) е друг за скаларно произведение
Интуиция rbf#
Имаме гаусов кернел, 3Д. Той прави ‘шапка’. С параметърът \(\gamma\) контролираме стандартното отклонение, т.е. колко е ‘широка’ шапката.
Всяка точка от данните се проектира на повърхността на шапката. Всяка точка ПОД шапката ще е от единия клас, всяка точка ИЗВЪН - от другия.
Тясна шапка -> напр само 1 точка под нея, всички точки са извън -> overfitting?
Широка шапка -> всички точки са под нея
Голяма \(\gamma\) => голяма регуляризация.
kernal-а е функция, която ни дава разстояние.
Въпрос: каква е размерността на пространството на kernel-ите?
линеен n -> n
полиномен n -> 1 + n + (n choose 2)
Проблеми:
не можем да интерпретираме, разберем резултатите
много бавно
SVM е подходящ за:
данни с много измерения (вкл ако променливите > записи). Дърветата и ансамблите - не са.
неструктурирани данни
например текст
k-nearest neighbours#
k най-близки съседи
Избираме k, в примера долу е 5. Взимаме 5-те най-близки наблюдения. Ефективният радиус зависи къде избираме точката.
Предсказанието е:
класификация -> избираме класа с най-голяма честота (majority vote)
регресия -> средно или медиана
Имаме 100% accuracy на трениращите данни.