Normalzarea datelor. Mașn cu vector suport (SVM) 1. Normalzarea datelor Metode obșnute de preprocesare a datelor. În partea stângă sunt reprezentate datele D orgnale. În mjloc acestea sunt centrate în 0, prn scăderea mede pe fecare dmensune. În partea dreaptă fecare dmensune este scalată folosnd devața standard corespunzătoare Spre deosebre de magnea dn centru, unde datele au lungm dferte pe cele două axe, ac ele sunt egale.. 1.1. Standardzarea - transformă vector de caracterstc astfel încât fecare să abă mede 0 ș devațe standard 1 x_scaled = x mean(x) σ, unde x_mean- meda valorlor lu x σ - devața standard from sklearn mport preprocessng mport numpy as np x_tran = np.array([[1, -1, ], [, 0, 0], [0, 1, -1]], dtype=np.float64) x_test = np.array([[-1, 1, 0]], dtype=np.float64) # facem statstcle pe datele de antrenare scaler = preprocessng.standardscaler() scaler.ft(x_tran) # afsam meda prnt(scaler.mean_) # => [1. 0. 0.33333333] # afsam devata standard prnt(scaler.scale_) # => [0.81649658 0.81649658 1.471913] # scalam datele de antrenare scaled_x_tran = scaler.transform(x_tran) prnt(scaled_x_tran) # => [[0. -1.474487 1.3363061] # [1.474487 0. -0.67614] # [-1.474487 1.474487-1.06904497]] # scalam datele de test scaled_x_test = scaler.transform(x_test) prnt(scaled_x_test) # => [[-.44948974 1.474487-0.67614]]
1.. Scalarea într-un anumt nterval - transformă datele astfel încât valorle fecăre caracterstc să se încadreze într-un anumt nterval, de obce [0, 1], sau astfel încât valoarea maxmă să devnă 1 - formula generală pentru ntervalul dat [mn_val, max_val]: x mn(x) x_std = max(x) mn(x) x_scaled = x_std (max_val mn_val) + mn_val from sklearn mport preprocessng mport numpy as np x_tran = np.array([[1, -1, ], [, 0, 0], [0, 1, -1]], dtype=np.float64) x_test = np.array([[-1, 1, 0]], dtype=np.float64) # facem statstcle pe datele de antrenare mn_max_scaler = preprocessng.mnmaxscaler(feature_range=(0, 1)) # (0, 1) default mn_max_scaler.ft(x_tran) # scalam datele de antrenare scaled_x_tran = mn_max_scaler.transform(x_tran) prnt(scaled_x_tran) # => [[0.5 0. 1. ] # [1. 0.5 0.33333333] # [0. 1. 0. ]] # scalam datele de test scaled_x_test = mn_max_scaler.transform(x_test) prnt(scaled_x_test) # => [[-0.5 1. 0.33333333]] 1.3. Normalzarea L1. Normalzarea L - scalarea ndvduală a vectorlor de caracterstc corespunzător fecăru exemplu astfel încât norma lor să devnă 1 Folosnd norma L1: x_scaled = X Folosnd norma L: x_scaled = X X 1, X 1 = X, X = n =1 x n =1 x
. Mașn cu vector suport În partea stângă sunt prezentate drepte de decze posble pentru clasfcarea celor două tpur de obecte. SVM-ul, exemplfcat în partea dreaptă, alege hperplanul care maxmzează margnea dntre cele doua clase. Hard Margn Funcța de decze prmală < x, w > + b 0 duală α y < x, x > + b 0 Problema de optmzare mn w cu constr.y (< x, w > + b) 1 0 α 1 j cu constr. α 0 α α j y y j K(x, x j ) Soft Margn prmală < x, w > + b 0 mn w + C cu constr. y (< x, w > + b) 1 ξ ξ duală α y < x, x > + b 0 α 1 α α j y y j K(x, x j ) j cu constr.0 α C Funcțle de decze ș problemele de optmzare asocate pentru formele SVM: prmală, respectv duală ș folosnd soft, respectv hard margn. Pentru mplementarea acestu algortm vom folos bbloteca ScktLearn. Aceasta este dezvoltată în Python, fnd ntegrată cu NumPy ș pune la dspozțe o sere de algortm optmzaț pentru probleme de clasfcare, regrese ș clusterzare. Instalarea bblotec se face prn comanda sstem: pp nstall -U sckt-learn
Importarea modelulu: from sklearn mport svm Detal de mplementare: Exstă două abordăr pentru a clasfca datele aparțnând ma multor clase: 1. ONE VS ALL: Sunt antrenaț num_classes clasfcator, câte unul corespunzător fecăre clase, care să o dferențeze pe aceasta de toate celelalte (toate celelalte exemple sunt prvte ca aparțnând aceleaș clase). Etcheta fnală pentru un exemplu nou va f dată de clasfcatorul care a obțnut scorul maxm. num_classes (num_classes 1). ONE VS ONE: Sunt antrenaț clasfcator, câte unul corespunzător fecare perech de câte două clase. Etcheta fnală pentru un exemplu nou va f cea care obțne cele ma multe votur pe baza acestor clasfcator. Implementarea dn ScktLearn are o abordare one-vs-one, adcă pentru fecare clase este antrenat un clasfcator bnar care să dferențeze între acestea. Astfel, dacă avem un număr de clase egal cu num_classes, vor f num_classes (num_classes 1) antrenaț clasfcator. La testare, clasa asgnată fecăru exemplu este cea care obțne cele ma multe votur pe baza acestor clasfcator. 1. Defnrea modelulu: class sklearn.svm.svc(c, kernel, gamma)
Parametr: C (float, default = 1.0) Influența parametrulu C în alegerea margn optme: în partea stângă este folostă abordarea hard margn, în care clasfcatorul nu este dspus să clasfce greșt date de antrenare, ar în partea dreaptă este folostă abordarea soft margn. Varabla ξ sugerează cât de mult exemplul x are voe să depășească margnea. ξ = max(0, 1 y (< x, w > + b)) - parametru de penaltate pentru eroare, sugerează cât de mult este dspus modelul să evte clasfcarea greștă a exemplelor dn setul de antrenare: C mare - va f ales un hperplan cu o margne ma mcă, dacă acesta are rezultate ma bune pe setul de antrenare (ma mulț vector suport). Dacă C va f ales prea mare, se poate ajunge la supraînvățare. C mc - va f ales un hperplan cu o margne ma mare, char dacă acesta duce la clasfcarea greștă a unor puncte dn setul de antrenare (ma puțn vector suport). Dacă C va f ales prea mc, modelul nu va f capabl să învețe, ajungându-se la subînvățare. kernel (strng, default = lnear )
Funcțle kernel sunt foloste atunc când datele nu sunt lnar separable. Acestea funcțonează prn următor do paș: 1. Datele sunt scufundate într-un spațu (Hlbert) cu ma multe dmensun. Relațle lnare sunt căutate în acest spațu - tpul de kernel folost: în cadrul laboratorulu vom lucra cu lnear ș rbf Kernel lnear: K(u, v) = u T v Kernel RBF: K(u, v) = exp( gamma u v ) 1 gamma (float, default = auto, având valoarea num_features ) - coefcent pentru kernelul rbf 1 - dacă gamma = scale va f folostă valoarea num_features X.std() - în versunea 0. valoarea default auto va f schmbată cu scale. Antrenarea: svm_model.ft(tran_data, tran_labels) Parametr: tran_data - setul de antrenare având exemplele stocate pe ln => dmensune (num_samples x num_features) tran_labels - etchetele corespunzătoare fecăru exemplu de antrenare 3. Predcța: svm_model.predct(test_data) Parametr: test_data - setul de test având exemplele stocate pe ln => dmensune (num_test_samples x num_features) Funcța întoarce un vector cu num_test_sampleselemente, fecare reprezentând d-ul clase prezse.
Exercț În contnuare vom lucra pe subsetul MNIST prmt în laboratorul 3. 1. Defnț funcța normalze_data(tran_data, test_data, type=none) care prmește ca parametr datele de antrenare, respectv de testare ș tpul de normalzare ({None, standard, mn_max, l1, l }) ș întoarce aceste date normalzate.. Defnț funcța svm_classfer(tran_data, tran_labels, test_data, C) care prmește ca parametr datele de antrenare, respectv de testare ș parametrul C. Aceasta antrenează un SVM lnar ș returnează predcțle obțnute de model pe setul de antrenare, respectv de testare. 3. Folosnd funcța defntă anteror calculaț acuratețea pe mulțmle de antrenare ș de testare. Utlzaț normalzarea L ș următoarele valor pentru parametrul C: [1e-, 1, 100]. Plotaț rezultatele folosnd pe axa OX log10(c), ar pe OY acuratețea. 4. Calculaț matrcea de confuze pentru cel ma bun model obțnut la exercțul anteror. 5. Pe baza matrce de confuze calculaț precza ș recall-ul corespunzătoare fecăre clase. 6. Antrenaț un model SVM folosnd kernelul rbf ș parametrul gamma = auto. Încercaț atât cu datele normalzate, cât ș cu ele neprocesate. Pentru prma varantă cel ma bun C este 1e-8, ar pentru cea de-a doua 1000. Comparaț rezultatele.