ce este o codificare fierbinte și cum se face

dacă sunteți în învățarea automată, atunci veți întâlni în mod inevitabil acest lucru numit „o codificare fierbinte”. Cu toate acestea, este unul dintre acele lucruri care sunt greu de înțeles ca începător la învățarea automată, deoarece trebuie să știți câteva lucruri despre învățarea automată pentru a o înțelege. Pentru a ajuta, M-am gândit că voi încerca să ofer o explicație pentru începători.

primul lucru pe care îl faci atunci când faci orice fel de program de învățare automată este de obicei pre-procesare. Prin asta, mă refer la pregătirea datelor pentru a fi analizate de programul dvs. La urma urmei, nu puteți arunca doar o foaie de calcul sau câteva imagini în programul dvs. și vă așteptați să știe ce să facă. Nu suntem încă la acel nivel de AI.

o mare parte din preprocesare este ceva care codifică. Aceasta înseamnă reprezentarea fiecărei bucăți de date într-un mod pe care computerul îl poate înțelege, de unde și numele encode, care înseamnă literalmente „convertiți în cod”. Există multe moduri diferite de codificare, cum ar fi codificarea etichetelor sau, după cum ați putea ghici, o codificare fierbinte. Codificarea etichetelor este intuitivă și ușor de înțeles, așa că voi explica mai întâi. Sperăm că de acolo veți putea înțelege pe deplin o codificare fierbinte.

să presupunem că lucrăm cu date categorice, cum ar fi pisicile și câinii. Privind numele codificării etichetelor, s-ar putea să ghiciți că codifică etichete, unde eticheta este doar o categorie (adică pisică sau câine), iar codificarea înseamnă doar să le oferiți un număr care să reprezinte acea categorie (1 pentru pisică și 2 pentru câine). Dând fiecărei categorii un număr, computerul știe acum să le reprezinte, deoarece computerul știe să lucreze cu numere. Și acum am terminat de explicat codificarea etichetelor. Dar există o problemă care face adesea să nu funcționeze pentru date categorice.

problema este că, odată cu codificarea etichetelor, categoriile au acum relații ordonate natural. Computerul face acest lucru pentru că este programat să trateze numere mai mari ca numere mai mari; va da în mod natural numere mai mari greutăți mai mari. Putem vedea problema cu acest lucru într-un exemplu:

  • Imaginați-vă dacă ați avea 3 categorii de alimente: mere, pui și broccoli. Folosind codificarea etichetelor, ați atribui fiecăruia dintre acestea un număr pentru a le clasifica: mere = 1, pui = 2 și broccoli = 3. Dar acum, dacă modelul dvs. intern trebuie să calculeze media pe categorii, s-ar putea să facă 1+3 = 4/2 = 2. Aceasta înseamnă că, în funcție de modelul dvs., media merelor și a puiului împreună este broccoli.

evident că linia de gândire a modelului tău va duce la corelații complet greșite, așa că trebuie să introducem codificarea one-hot.

în loc să etichetăm lucrurile ca număr începând de la 1 și apoi crescând pentru fiecare categorie, vom merge mai mult pentru un stil binar de clasificare. S-ar putea să vă fi gândit că dacă ați ști ce este un one-hot (se referă la codarea binară, dar nu vă faceți griji). Permiteți-mi să ofer o diferență vizualizată între etichetă și codificarea one-hot. Vezi dacă poți rezolva diferența:

care e diferența? Ei bine, categoriile noastre au fost anterior rânduri, dar acum sunt coloane. Variabila noastră numerică, caloriile, a rămas totuși aceeași. Un 1 într-o anumită coloană va spune computerului categoria corectă pentru datele acelui rând. Cu alte cuvinte, am creat o coloană binară suplimentară pentru fiecare categorie.

nu este clar imediat de ce acest lucru este mai bun (în afară de problema pe care am menționat-o mai devreme) și asta pentru că nu există un motiv clar. La fel ca multe lucruri din învățarea automată, nu vom folosi acest lucru în fiecare situație; nu este pur și simplu mai bun decât codificarea etichetelor. Doar rezolvă o problemă pe care o veți întâlni cu codificarea etichetelor atunci când lucrați cu date categorice

o codificare fierbinte în cod (înțelegeți? Este un joc de cuvinte)

este întotdeauna util să vedem cum se face acest lucru în cod, deci să facem un exemplu. În mod normal, sunt un credincios ferm că ar trebui să facem ceva fără biblioteci pentru a învăța, dar doar pentru aceste lucruri plictisitoare de pre-procesare nu avem nevoie. Bibliotecile pot face acest lucru atât de simplu. Vom folosi numpy, sklearn și panda, deoarece veți găsi că utilizați aceste 3 biblioteci în multe dintre proiectele dvs.

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
import pandas as pd

acum că avem instrumentele, să începem. Vom lucra cu un set de date alcătuit. Introduceți setul de date cu panda .read_csv caracteristică:

dataset = pd.read_csv('made_up_thing.csv')

sperăm că este auto-explicativ. Următorul este un pic mai complicat. Lucrul despre foile de calcul este că este posibil sau nu să vă pese de unele dintre coloane. Din motive de simplitate, să spunem că ne pasă de toate, cu excepția ultimei coloane. Vom folosi caracteristica panda lui .iloc, care devine datele de la orice coloană(e) că vă spun să:

X = dataset.iloc.values

.iloc de fapt ia în, așa că am introdus . Les : este pentru că vrem toate rândurile din aceste coloane, și : este doar modul în care faci asta. Adăugăm .valori pentru a obține valorile la ce segmente am selectat. Cu alte cuvinte, prima parte Selectează valorile, a doua parte primește valorile.

acum să facem codificarea reală. Sklearn face incredibil de ușor, dar există o captură. S-ar putea fi observat am importat atât labelencoder și un codificator fierbinte. Sklearn ‘ s one hot encoder nu știe de fapt cum să convertească categoriile în numere, știe doar cum să convertească numerele în binare. Trebuie să folosim eticheta mai întâi.

în primul rând, vom configura un labelencoder la fel ca tine ar fi orice obiect normal:

le = LabelEncoder()

apoi trebuie să folosim sklearn ‘ s .funcția fit_transform. Să presupunem că trebuie să codificăm doar prima coloană. Ne-ar face:

X = le.fit_transform(X)

această funcție este doar o combinație a .fit și .transformă comenzile. .fit ia X (în acest caz prima coloană a lui X din cauza X-ului nostru) și convertește totul în date numerice. .transformarea aplică apoi această conversie.

tot ce a mai rămas este să folosiți un codificator fierbinte. Din fericire, este aproape la fel ca ceea ce tocmai am făcut:

ohe = OneHotEncoder(categorical_features = )
X = ohe.fit_transform(X).toarray()

Categorical_feartures este un parametru care specifică ce coloană dorim să o codifica fierbinte, și din moment ce vrem să codifice prima coloană, am pus . În cele din urmă, am fit_transform în binar, și să-l într-o matrice, astfel încât să putem lucra cu ea merge cu ușurință înainte.

și asta este! E destul de simplu. O notă finală, deși, dacă aveți nevoie pentru a face mai mult decât doar prima coloană, faci ceea ce tocmai am făcut, dar în loc de 0 ai pus orice coloană doriți. Pentru mai multe coloane, îl puteți pune într-o buclă pentru:

le = LabelEncoder()#for 10 columns
for i in range(10):
X = le.fit_transform(X)

mult noroc pe tine aventuri de învățare mașină!