co to jest jedno gorące kodowanie i jak to zrobić
jeśli jesteś w uczeniu maszynowym, to nieuchronnie natkniesz się na coś o nazwie „jedno gorące kodowanie”. Jednak jest to jedna z tych rzeczy, które są trudne do uchwycenia jako początkujący do uczenia maszynowego, ponieważ trzeba wiedzieć kilka rzeczy na temat uczenia maszynowego, aby go zrozumieć. Aby pomóc, pomyślałem, że spróbuję udzielić początkującego wyjaśnienia.
pierwszą rzeczą, którą robisz podczas tworzenia jakiegokolwiek programu uczenia maszynowego, jest zwykle wstępne przetwarzanie. Mam na myśli przygotowanie danych do analizy przez twój program. W końcu nie możesz po prostu wrzucić arkusza kalkulacyjnego lub niektórych zdjęć do programu i oczekiwać, że będzie wiedział, co robić. Nie jesteśmy jeszcze na takim poziomie sztucznej inteligencji.
duża część wstępnego przetwarzania to coś kodującego. Oznacza to reprezentowanie każdego kawałka danych w sposób, który komputer może zrozumieć, stąd nazwa encode, która dosłownie oznacza „Konwertuj na kod”. Istnieje wiele różnych sposobów kodowania, takich jak kodowanie etykiet lub jak można się domyślić, jedno kodowanie na gorąco. Kodowanie etykiet jest intuicyjne i łatwe do zrozumienia, więc wyjaśnię to najpierw. Mam nadzieję, że stamtąd będziesz w stanie w pełni zrozumieć jedno gorące kodowanie.
Załóżmy, że pracujemy z kategorycznymi danymi, jak koty i psy. Patrząc na nazwę kodowania etykiet, możesz być w stanie odgadnąć, że koduje etykiety, gdzie etykieta jest tylko kategorią (np. kot lub pies), a kodowanie oznacza po prostu nadanie im numeru reprezentującego tę kategorię (1 dla kota i 2 dla psa). Dając każdej kategorii numer, komputer wie teraz, jak je reprezentować, ponieważ komputer wie, jak pracować z liczbami. A teraz skończyliśmy już wyjaśniać kodowanie etykiet. Ale jest problem, który sprawia, że często nie działa dla danych kategorycznych.
problem polega na tym, że przy kodowaniu etykiet kategorie mają teraz naturalne uporządkowane relacje. Komputer robi to, ponieważ jest zaprogramowany, aby traktować wyższe liczby jako wyższe liczby; naturalnie da wyższym liczbom wyższą wagę. Problem z tym możemy zobaczyć na przykładzie:
- wyobraź sobie, że masz 3 kategorie żywności: jabłka, kurczak i brokuły. Używając kodowania etykiet, możesz przypisać każdemu z nich liczbę, aby je skategoryzować: jabłka = 1, kurczak = 2 i brokuły = 3. Ale teraz, jeśli twój model wewnętrznie musi obliczyć średnią między kategoriami, może zrobić 1+3 = 4/2 = 2. Oznacza to, że według Twojego modelu średnia jabłek i kurczaka razem to brokuły.
oczywiście ta linia myślenia według Twojego modelu doprowadzi do tego, że korelacje będą całkowicie błędne, więc musimy wprowadzić kodowanie jedno-gorące.
zamiast oznaczać rzeczy jako liczbę zaczynającą się od 1, a następnie zwiększającą dla każdej kategorii, przejdziemy do bardziej binarnego stylu kategoryzacji. Można by pomyśleć, że gdybyś wiedział, czym jest one-hot (odnosi się do kodowania binarnego, ale nie martw się o to). Pozwólcie, że przedstawię wizualną różnicę między etykietą a kodowaniem one-hot. Zobacz, czy potrafisz rozpracować różnicę:
co za różnica? Cóż, nasze kategorie były kiedyś wierszami, ale teraz są kolumnami. Nasza zmienna liczbowa, kalorie, pozostała jednak taka sama. 1 w konkretnej kolumnie powie komputerowi właściwą kategorię dla danych tego wiersza. Innymi słowy, stworzyliśmy dodatkową kolumnę binarną dla każdej kategorii.
nie od razu wiadomo, dlaczego jest lepiej (pomijając problem, o którym wspomniałem wcześniej), a to dlatego, że nie ma wyraźnego powodu. Podobnie jak wiele rzeczy w uczeniu maszynowym, nie będziemy tego używać w każdej sytuacji; nie jest to wprost lepsze niż kodowanie etykiet. To po prostu rozwiązuje problem, który napotkasz z kodowaniem etykiet podczas pracy z danymi kategorycznymi
jedno gorące kodowanie w kodzie (rozumiesz? To kalambur)
zawsze warto zobaczyć, jak to się robi w kodzie, więc zróbmy przykład. Normalnie jestem przekonany, że powinniśmy zrobić coś bez żadnych bibliotek, aby się tego nauczyć, ale tylko dla tego żmudnego przetwarzania wstępnego nie musimy. Biblioteki mogą to tak uprościć. Będziemy używać numpy, skleparn i pand, ponieważ będziesz używał tych 3 bibliotek w wielu swoich projektach
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
import pandas as pd
teraz, gdy mamy już narzędzia,zacznijmy. Będziemy pracować z przygotowanym zestawem danych. Wprowadź zestaw danych z pand .funkcja read_csv:
dataset = pd.read_csv('made_up_thing.csv')
mam nadzieję, że to oczywiste. Następny jest trochę trudniejszy. Rzecz o arkuszach kalkulacyjnych jest to, że możesz lub nie musisz dbać o niektóre kolumny. Dla uproszczenia powiedzmy, że zależy nam na wszystkim, z wyjątkiem ostatniej kolumny. Użyjemy funkcji pand .iloc, który pobiera dane w dowolnej kolumnie(kolumnach), którą:
X = dataset.iloc.values
.iloc faktycznie przyjmuje, więc wprowadziliśmy . The: is because we want all the rows in these columns, and : is just the way you do that. Dodajemy .wartości, aby, dobrze, uzyskać wartości w jakich segmentach wybraliśmy. Innymi słowy, pierwsza część wybiera wartości, druga część otrzymuje wartości.
teraz zróbmy rzeczywiste kodowanie. Skleparn sprawia, że jest to niezwykle łatwe, ale jest haczyk. Być może zauważyłeś, że zaimportowaliśmy zarówno labelencoder, jak i one hot encoder. Jeden gorący koder sklepu nie wie, jak konwertować Kategorie na liczby, wie tylko, jak konwertować liczby na binarne. Najpierw musimy użyć labelencodera.
najpierw skonfigurujemy labelencoder tak, jak każdy normalny obiekt:
le = LabelEncoder()
następnie musimy użyć sklearn ’ s .funkcja fit_transform. Powiedzmy, że musimy zakodować tylko pierwszą kolumnę. Zrobilibyśmy:
X = le.fit_transform(X)
ta funkcja jest po prostu kombinacją .fit i .polecenia transform. .fit pobiera X (w tym przypadku pierwszą kolumnę x ze względu na nasze X) i konwertuje wszystko na dane liczbowe. .transformacja następnie stosuje tę konwersję.
pozostaje tylko użyć jednego gorącego kodera. Na szczęście jest prawie tak samo, jak to, co właśnie zrobiliśmy:
ohe = OneHotEncoder(categorical_features = )
X = ohe.fit_transform(X).toarray()
Categorial_feartures jest parametrem, który określa, jaką kolumnę chcemy zakodować na gorąco, a ponieważ chcemy zakodować pierwszą kolumnę, umieszczamy . Wreszcie, dopasowujemy_transform do binarnego i zamieniamy go w tablicę, abyśmy mogli z nim łatwo pracować.
i tyle! To całkiem proste. Ostatnia uwaga, jeśli chcesz zrobić coś więcej niż tylko pierwszą kolumnę, robisz to, co właśnie zrobiliśmy, ale zamiast 0 wstawiasz dowolną kolumnę. Dla wielu kolumn możesz umieścić go w pętli for:
le = LabelEncoder()#for 10 columns
for i in range(10):
X = le.fit_transform(X)
powodzenia w przygodach uczenia maszynowego!