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!