Kvantilis normalizáló létrehozása és használata, majd teljesítményének összehasonlítása egy z-score normalizálóval.
Bevezetés
A Data Science és Data Engineering csodálatos világában az adatok feldolgozásának képessége nagyon fontos. Az adatok tipikus formátumukban tisztítatlanok, és szinte minden modell számára nehéz dolgozni. Ez nagyban hozzájárul a Data Science automatizálásának hiányához, mivel sok megfigyelésre van szükség az adatok diagnosztizálásához és ismételt javításához. Ezenkívül a problémák néha nincsenek egyértelműen megírva, és nehéz lehet problémákat találni az adatokkal kapcsolatban.
A folytonos értékekkel kapcsolatos egyik nagyon gyakran megfigyelhető probléma a szórás és az adatok mennyisége. Természetesen számos nagyszerű megközelítés létezik egy ilyen probléma kijavításához vagy akár észrevételéhez. Azonban a módszer, amelyet ma szerettem volna egy pillantást vetni, a kvantilis módszer. Úgy gondolom, hogy ez egy nagyon ritka módszer, de nem hiszem, hogy ez jogosan történik.
"jegyzetfüzet"
Mi az a kvantilis?
Természetesen egy kvantilis transzformátor vagy kvantilis normalizáló használatához először meg kell értenünk, mi az a kvantilis. A kvantilis egy logikai pont az adatokban, amely numerikus indexpozíción alapul. Ezt szem előtt tartva, ez jelentős különbséget és érdekes kapcsolatot tart fenn az átlagos használattal, hogy ugyanazt a dolgot megtegye. Példa egy olyan kvantilisre, amelyet valószínűleg a legtöbben ismernek, a medián. A mediánt második kvantilisként is ismerik. Két további címkézett kvantilis van, az első kvantilis, amely a 25 százalékos indexnél van rögzítve, majd ugyanez a 75 százalékos indexnél. Mivel nincs függvényünk ennek kiszámítására, meg kell írnunk egyet. Egy függvényt úgy fogok elindítani, hogy létrehozok 2 új argumentumot, az x-et, ami lesz az a tömb, amelynek a kvantilist meg akarjuk találni, majd a q-t. Q lesz az adatok osztási pontja. Azt is megengedem, hogy ehhez az érvhez számot és lebegőpontot is megadjunk.
function quantile(x::Array, q::Real = .5)
Ezután egy új szótárt készítek számbillentyűkkel a q1-q3-hoz. Ez lehetővé teszi számunkra, hogy egyszerűen indexeljük a szótárunkat, így a felhasználó megadhat egy egész számot és egy float64-et is. Természetesen ezt többszörös kiküldéssel is meg lehetett volna oldani, de fontosnak tartom megjegyezni, hogy egyszerűen a szótárt használjuk arra, hogy ezeket a számokat lebegővé alakítsuk.
qdict = Dict(1 => .25, 2 => .5, 3 => .75) if q >= 1 try q = qdict[q] catch throw(ArgumentError(" The quantile parameter is not set to a percentage, or quantile!")) end end
Most, ha a számunk a „qdictben” van, a q paraméterünk egyenlő lesz az adott kvantilis megfelelő töredékével. Ha az érték nem szerepel a szótárunkban, de nagyobb is egynél, akkor dobásunk lesz. Alapvetően a kódnak ezt a részét arra használjuk, hogy mind a 2–4. kvantilis hívható legyen, mind pedig a float egy adott szintű címkézetlen kvantilis. Ezután rendezzük a tömböt, ami elengedhetetlen a numerikus távolság helyességéhez. Ezt követően megkapjuk a tömb hosszát.
sorted = sort(x) div = length(x)
Végül indexeljük a hosszunk és a kiválasztott hosszúságunk szorzatát kerekítve, hogy megtaláljuk a tömb pozíciójának azt a részét:
return(x[Int64(round(div * q))]) end
A végső kvantilis függvényünk kicsit így néz ki:
function quantile(x::Array, q::Real = .5) qdict = Dict(1 => .25, 2 => .5, 3 => .75) if q >= 1 try q = qdict[q] catch throw(ArgumentError(" The quantile parameter is not set to a percentage, or quantile!")) end end sorted = sort(x) div = length(x) return(x[Int64(round(div * q))]) end
Most mediánfüggvényt készíthetünk a második kvantilis vagy .5 meghívásával:
median(x) = quantile(x, .5)
Kvantilis normalizáló
Mielőtt használnánk a kvantilis normalizálót, meg kell értenünk, hogyan működik. A normalizáló mögötti filozófia az, hogy a harmadik kvantilis körüli és az első kvantilis alatti értékek valószínűleg némileg kiugró értékek. A pozíciókat argumentumok segítségével is szerkeszthetővé fogom tenni. Ezután ezeket a számokat a kvantilis metódushívásainkba fogom csatlakoztatni.
mutable struct QuantileNormalizer <: LatheObject q1 q3 function QuantileNormalizer(x::Array, lower::Float64 = .25, upper::Float64 = .75) q1 = quantile(x, lower) q3 = quantile(x, upper) end end
Most módosítsuk ezt a belső konstruktort, hogy valóban létrehozzuk ezt a típust, valamint egy valós függvényt, amely bizonyos dolgokat kiszámít. Ezt szem előtt tartva hozzáadtam egy új adatot a struktúránkhoz, majd befejeztem ezt a konstruktort az említett függvényhívással, majd az új() metódusunkba helyeztem.
mutable struct QuantileNormalizer <: LatheObject q1::Real q3::Real predict::Function function QuantileNormalizer(x::Array, lower::Float64 = .25, upper::Float64 = .75) q1 = quantile(x, lower) q3 = quantile(x, upper) predict(x::Array) = qn_pred(x, q1, q3) new(q1, q3, predict) end
Végül az utolsó komponens az adatok normalizálása az új qn_pred() függvényünkben. Itt van az általam kitalált függvény, amely egy iteratív ciklust használ feltételes utasításokkal:
function qn_pred(x, q1, q3) [if i > q3 x[current] = q3 elseif i < q1 x[current] = q1 else x[current] = i end for (current, i) in enumerate(x)] end
Vizsgáljuk meg gyorsan, hogy ez valójában mit tesz bizonyos adatokkal:
x = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50] 5 10 15 20 25 30 35 40 45 50
Az első lépés egy normalizáló létrehozása ezekkel az adatokkal, például:
normalier = QuantileNormalizer(x)
Végül visszavezetjük a tömbünkbe:
normaledx = normalier.predict(x) 10 10 15 20 25 30 35 40 40 40
Látjuk, hogy az alacsonyabb számainkat nagyobbra, a magasabbakat pedig a legkisebbekre változtattuk. Ez segít az adatok központosításában. Ez lehetővé teszi számunkra, hogy jelentősen módosítsuk adataink varianciáját, miközben lényegében nincs hatással az átlagra, ami elengedhetetlen a folyamatos adatok konzisztenciájának megőrzéséhez:
using Lathe.stats: mean println(mean(x)) println(mean(normaledx)) 26.5 26.5
Következtetés
A kvantilis metrika egy nagyon klassz, de gyakran alulhasznált mérőszám a statisztikák és mérőszámok világában. A kvantilis sokat elárulhat az adatok térközéről, és ezt nagyon fontos megérteni az adatokkal való munka során. Úgy gondolom, hogy ez a kvantilis normalizáló biztosan jól jön, bár az alkalmazása normális eloszlású vagy szabványosan skálázott adatokkal jobb lehet. Ettől függetlenül ebben a cikkben csak egyet akartam írni, majd folytatni, hogy megmutassam. Ezt szem előtt tartva köszönöm szépen, hogy elolvastad; a világot jelenti nekem!