mikä on yksi kuuma koodaus ja miten se tehdään
jos on kiinnostunut koneoppimisesta, törmää väistämättä tähän asiaan nimeltä ”yksi kuuma koodaus”. Se on kuitenkin yksi niistä asioista, joita on vaikea ymmärtää aloittelijana koneoppimiseen, koska sinun täytyy tietää joitakin asioita koneoppimisesta ymmärtääksesi sitä. Auttaakseni ajattelin, että yrittäisin antaa aloittelijalle selityksen.
koneoppimisohjelmaa tehtäessä ensimmäinen asia on yleensä esikäsittely. Sillä tarkoitan tietojen valmistamista ohjelman analysoitavaksi. Loppujen lopuksi, et voi vain heittää taulukkolaskenta tai joitakin kuvia ohjelmaan ja odottaa, että se tietää, mitä tehdä. Emme ole vielä tekoälyn tasolla.
iso osa esikäsittelystä on jotain koodaavaa. Tämä tarkoittaa, että jokainen pala dataa tavalla, että tietokone voi ymmärtää, joten nimi koodata, joka kirjaimellisesti tarkoittaa ”muuntaa koodiksi”. On olemassa monia eri tapoja koodata, kuten etiketti koodaus, tai kuten ehkä arvata, yksi kuuma koodaus. Etiketin koodaus on intuitiivinen ja helppo ymmärtää, joten selitän sen ensin. Toivottavasti sieltä voit täysin ymmärtää yksi kuuma koodaus.
oletetaan, että työskentelemme kategorisen datan kanssa, kuten kissat ja koirat. Tarkasteltaessa nimen koodaus, saatat pystyä arvata, että se koodaa tarroja, jossa etiketti on vain luokka (eli kissa tai koira), ja koodata vain tarkoittaa antaa heille numero edustaa kyseistä luokkaa (1 kissa ja 2 koira). Antamalla jokaiselle luokalle numeron tietokone osaa nyt esittää niitä, koska tietokone osaa käsitellä numeroita. Ja nyt olemme jo lopettaneet etiketin koodauksen selittämisen. Mutta on olemassa ongelma, jonka vuoksi se ei useinkaan toimi kategorinen data.
ongelmana on se, että etikettien koodauksen myötä luokilla on nyt luonnollisia järjestyssuhteita. Tietokone tekee tämän koska se on ohjelmoitu käsittelemään suurempia lukuja suurempina lukuina; se luonnollisesti antaa suuremmille luvuille suuremmat painot. Voimme nähdä ongelman tässä esimerkissä:
- Kuvittele, jos sinulla olisi 3 elintarvikeryhmää: omenat, kana ja parsakaali. Käyttämällä etiketti koodaus, voit antaa jokaiselle näistä numero luokitella ne: omenat = 1, kana = 2, ja parsakaali = 3. Mutta nyt, jos mallisi on sisäisesti laskettava keskiarvo eri kategorioiden välillä, se saattaa tehdä 1 + 3 = 4/2 = 2. Tämä tarkoittaa sitä, että mallisi mukaan keskimäärin omenat ja kana yhdessä ovat parsakaalia.
ilmeisesti tuo mallisi ajattelutapa johtaa siihen, että se saa korrelaatiot täysin väärin, joten meidän on otettava käyttöön one-hot-koodaus.
sen sijaan, että leimaisimme asiat luvuksi, joka alkaa 1: stä ja kasvaa sitten kunkin luokan kohdalla, siirrymme enemmänkin binääriseen luokittelutyyliin. Olet ehkä ajatellut, että jos tiedät, mitä one-hot on (se liittyy binäärikoodaukseen, mutta älä huoli siitä). Anna minun tarjota visualisoitu ero etiketti ja One-hot koodaus. Katso, saatko eron selvitettyä:
mitä väliä sillä on? Kategoriamme olivat ennen rivejä, mutta nyt ne ovat sarakkeita. Meidän numeerinen muuttuja, kalorit, on kuitenkin pysynyt samana. Tietyn sarakkeen numero 1 kertoo tietokoneelle oikean luokan kyseisen rivin tiedoille. Toisin sanoen, olemme luoneet ylimääräinen binary sarake kullekin luokalle.
ei ole heti selvää, miksi tämä on parempi (lukuun ottamatta aiemmin mainitsemaani ongelmaa), ja se johtuu siitä, että selkeää syytä ei ole. Kuten monet asiat koneoppimisessa, emme käytä tätä joka tilanteessa; se ei ole suoranaisesti parempi kuin etiketin koodaus. Se vain korjaa ongelman, jonka kohtaat etiketin koodauksessa työskennellessäsi kategorisen tiedon
yhden kuuman koodauksen kanssa koodina (ymmärrätkö? It ’ s a pun)
on aina hyödyllistä nähdä, miten tämä tapahtuu koodissa, joten tehdään esimerkki. Yleensä olen vakaasti sitä mieltä, että meidän pitäisi tehdä jotain ilman kirjastoja oppiaksemme sen, mutta vain tämän tylsän esikäsittelyn takia meidän ei oikeastaan tarvitse. Kirjastot voivat tehdä tästä niin yksinkertaista. Tulemme käyttämään numpya, sklearnia ja pandoja, sillä löydät itsesi käyttämästä noita 3 kirjastoa monissa projekteissasi
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import numpy as np
import pandas as pd
nyt kun meillä on Työkalut, aloitetaan. Teemme töitä keksityn aineiston kanssa. Syötä tietokokonaisuus pandojen kanssa .read_csv-ominaisuus:
dataset = pd.read_csv('made_up_thing.csv')
toivottavasti se on itsestään selvää. Seuraava on hieman hankalampi. Asia taulukkolaskenta on, että saatat tai ei välitä joitakin sarakkeita. Sanotaan yksinkertaisuuden vuoksi, että välitämme kaikesta paitsi viimeisestä palstasta. Käytämme Pandan ominaisuutta .iloc, joka saa tiedot mistä tahansa sarakkeesta(sarakkeista), johon (joille) kerrot sen:
X = dataset.iloc.values
.iloc hoitaa homman, joten syötimme . Koska haluamme kaikki rivit noissa sarakkeissa, ja: on vain tapa, jolla teet sen. Lisäämme .arvot, no, saada arvot mitä segmenttejä olemme valinneet. Toisin sanoen ensimmäinen osa valitsee arvot, toinen osa saa arvot.
nyt tehdään varsinainen koodaus. Sklearn tekee siitä uskomattoman helppoa, mutta siinä on juju. Olet ehkä huomannut, että toimme sekä labelencoder että one hot encoder. Sklearnin one hot encoder ei oikeastaan osaa muuntaa luokkia numeroiksi, se osaa vain muuntaa numerot binääriksi. Meidän täytyy käyttää labelencoderia ensin.
ensin perustamme labelencoderin aivan kuten minkä tahansa normaalin objektin:
le = LabelEncoder()
seuraavaksi meidän on käytettävä sklearn ’ sia .fit_transform-funktio. Sanotaan, että meidän täytyy koodata vain ensimmäinen sarake. Would do:
X = le.fit_transform(X)
tämä toiminto on vain yhdistelmä .fit ja .muuta komentoja. .fit vie X (tässä tapauksessa ensimmäinen sarake x koska meidän X) ja muuntaa kaiken numeeriseen dataan. .transform sitten soveltaa, että muuntaminen.
jäljellä on vain yksi hot encoder. Onneksi se on melkein sama kuin mitä juuri teimme.:
ohe = OneHotEncoder(categorical_features = )
X = ohe.fit_transform(X).toarray()
Categorical_feartures on parametri, joka määrittää minkä sarakkeen haluamme yhteen hot-koodiin, ja koska haluamme koodata ensimmäisen sarakkeen, laitamme . Lopuksi, me fit_transform osaksi binary, ja muuttaa sen array, jotta voimme työskennellä sen kanssa helposti eteenpäin.
ja se siitä! Se on aika yksinkertaista. Viimeinen huomautus kuitenkin, jos sinun täytyy tehdä enemmän kuin vain ensimmäinen sarake, teet mitä me juuri teimme, mutta sijaan 0 laitat mitä sarake haluat. Monille sarakkeille voit laittaa sen for-silmukkaan:
le = LabelEncoder()#for 10 columns
for i in range(10):
X = le.fit_transform(X)
onnea koneoppimisen seikkailuihin!