Tento článek popisuje, proč je nutná normalizace. Rovněž ukazuje výhody a nevýhody normalizace min-max a normalizace z-skóre.
Proč normalizovat?
Mnoho algoritmů strojového učení se pokouší najít trendy v datech porovnáním vlastností datových bodů. Existuje však problém, když jsou funkce na drasticky odlišných měřítcích.
Vezměme si například datovou sadu domů. Dvěma potenciálními vlastnostmi může být počet místností v domě a celkové stáří domu v letech. Algoritmus strojového učení se může pokusit předpovědět, který dům by pro vás byl nejlepší. Když však algoritmus porovná datové body, prvek s větším měřítkem bude zcela dominovat druhému. Podívejte se na obrázek níže:
Když data vypadají takto zmačkaná, víme, že máme problém. Algoritmus strojového učení by si měl uvědomit, že je obrovský rozdíl mezi domem se 2 pokoji a domem s 20 pokoji. Ale právě teď, protože dva domy mohou být 100 let od sebe, rozdíl v počtu pokojů přispívá k celkovému rozdílu méně.
Jako extrémnější příklad si představte, jak by graf vypadal, kdyby na ose x byly náklady na dům. Data by vypadala ještě více zmačkaná; rozdíl v počtu pokojů by byl ještě méně relevantní, protože náklady na dva domy by mohly mít rozdíl v řádu tisíců dolarů.
Cílem normalizace je zajistit, aby každý datový bod měl stejné měřítko, takže každá funkce je stejně důležitá. Obrázek níže ukazuje stejná data domu normalizovaná pomocí min-max normalizace.
Min-Max normalizace
Min-max normalizace je jedním z nejběžnějších způsobů normalizace dat. Pro každý prvek se minimální hodnota tohoto prvku transformuje na 0, maximální hodnota se transformuje na 1 a každá další hodnota se transformuje na desetinné číslo mezi 0 a 1.
Pokud by například minimální hodnota prvku byla 20 a maximální hodnota byla 40, pak by se 30 transformovalo na přibližně 0.5, protože je v polovině mezi 20 a 40. Vzorec je následující:
Min-max normalizace má jednu poměrně významnou nevýhodu: neřeší příliš dobře odlehlé hodnoty. Pokud máte například 99 hodnot mezi 0 a 40 a jedna hodnota je 100, pak všech 99 hodnot bude transformováno na hodnotu mezi 0 a 0.4. Ta data jsou stejně vymakaná jako předtím! Podívejte se na obrázek níže, abyste viděli příklad tohoto.
Normalizace vyřešila problém se squishingem na ose y, ale osa x je stále problematická. Pokud bychom měli tyto body porovnat, dominovala by osa y; osa y se může lišit o 1, ale osa x se může lišit pouze o 0.4.
Normalizace Z-skóre
Normalizace Z-skóre je strategie normalizace dat, která zabraňuje tomuto odlehlému problému. Vzorec pro normalizaci Z-skóre je níže:
Zde je μ střední hodnota prvku a σ je standardní odchylka prvku. Pokud je hodnota přesně rovna průměru všech hodnot prvku, bude normalizována na 0. Pokud je pod průměrem, bude to záporné číslo, a pokud je nad průměrem, bude kladné číslo. Velikost těchto záporných a kladných čísel je určena směrodatnou odchylkou původního prvku. Pokud měla nenormalizovaná data velkou směrodatnou odchylku, budou normalizované hodnoty blíže 0.
Podívejte se na graf níže. Toto jsou stejná data jako dříve, ale tentokrát používáme normalizaci z-skóre.
Zatímco data stále vzhled zmáčknuté, všimněte si, že body jsou nyní na zhruba stejné stupnici pro oba prvky — téměř všechny body jsou mezi -2 a 2 na ose x i na ose y. Jedinou potenciální nevýhodou je, že funkce nejsou na přesný stejné měřítko.
S normalizací min-max bylo zaručeno, že obě naše vlastnosti přebudujeme tak, aby byly mezi 0 a 1. Pomocí normalizace skóre z má nyní osa x rozsah od přibližně -1.5 do 1.5, zatímco osa y má rozsah od asi -2 do 2. To je určitě lepší než dříve; osa x, která měla dříve rozsah 0 až 40, již ose y nedominuje.
přezkoumání
Normalizace vašich dat je nezbytnou součástí strojového učení. Můžete mít úžasnou datovou sadu s mnoha skvělými funkcemi, ale pokud zapomenete normalizovat, jedna z těchto funkcí může zcela dominovat ostatním. Je to, jako byste zahodili téměř všechny své informace! Normalizace tento problém řeší. V tomto článku jste se naučili následující techniky normalizace:
- Min-max normalizace: Zaručuje, že všechny funkce budou mít přesně stejné měřítko, ale nezvládá dobře odlehlé hodnoty.
- Normalizace Z-skóre: Zpracovává odlehlé hodnoty, ale nevytváří normalizovaná data s přesný stejné měřítko.
Share Šipka Šipka dolů vyplněná ikona
V tomto článku si vyzkoušíte několik různých způsobů normalizace dat v Pythonu pomocí scikit-learn, známého také jako sklearn. Když normalizujete data, změníte měřítko dat. Data se běžně mění tak, aby spadala mezi 0 a 1, protože algoritmy strojového učení mají tendenci podávat lepší výkony nebo rychleji konvergovat, když jsou různé funkce v menším měřítku. Než začnete trénovat modely strojového učení na datech, je běžnou praxí nejprve data normalizovat, abyste potenciálně získali lepší a rychlejší výsledky. Normalizace také činí tréninkový proces méně citlivým na rozsah funkcí, což má za následek lepší koeficienty po tréninku.
Tento proces přizpůsobení funkcí pro trénování změnou měřítka se nazývá škálování funkcí.
Tento tutoriál byl testován pomocí Pythonu verze 3.9.13 a scikit-learn verze 1.0.2.
Použití funkce scikit-learn preprocessing.normalize() k normalizaci dat
K normalizaci datové sady podobné poli můžete použít funkci scikit-learn preprocessing.normalize().
Funkce normalize() měří vektory jednotlivě na jednotkovou normu, takže vektor má délku jedna. Výchozí norma pro normalize() je L2, známá také jako euklidovská norma. Vzorec normy L2 je druhou odmocninou součtu druhých mocnin každé hodnoty. Přestože použití funkce normalize() vede k hodnotám mezi 0 a 1, není to totéž, jako prosté škálování hodnot tak, aby spadaly mezi 0 a 1.
Normalizace pole pomocí funkce normalize().
Jednorozměrné pole NumPy můžete normalizovat pomocí funkce normalize().
Importujte modul sklearn.preprocessing:
from sklearn import preprocessing
Importujte NumPy a vytvořte pole:
import numpy as np x_array = np.array([2,3,5,6,7,4,8,7,6])
Pomocí funkce normalize() na poli normalizujte data podél řádku, v tomto případě jednorozměrného pole:
normalized_arr = preprocessing.normalize([x_array]) print(normalized_arr)
Spusťte úplný ukázkový kód a demonstrujte, jak normalizovat pole NumPy pomocí funkce normalize():
from sklearn import preprocessing import numpy as np x_array = np.array([2,3,5,6,7,4,8,7,6]) normalized_arr = preprocessing.normalize([x_array]) print(normalized_arr)
Output[[0.11785113 0.1767767 0.29462783 0.35355339 0.41247896 0.23570226 0.47140452 0.41247896 0.35355339]]
Výstup ukazuje, že všechny hodnoty jsou v rozsahu 0 až 1. Pokud odmocníte každou hodnotu ve výstupu a poté je sečtete, výsledek je 1, nebo velmi blízko 1.
Normalizace sloupců z datového rámce pomocí funkce normalize().
V datovém rámci pandas jsou prvky sloupce a řádky jsou vzorky. Sloupec DataFrame můžete převést na pole NumPy a poté normalizovat data v poli.
Příklady v této a následujících částech používají datovou sadu California Housing.
První část ukázkového kódu importuje moduly, načte datovou sadu, vytvoří DataFrame a vytiskne popis datové sady:
import numpy as np from sklearn import preprocessing from sklearn.datasets import fetch_california_housing # create the DataFrame california_housing = fetch_california_housing(as_frame=True) # print the dataset description print(california_housing.DESCR)
Všimněte si, že parametr as_frame je nastaven na hodnotu True, aby se objekt california_housing vytvořil jako pandas DataFrame.
Výstup obsahuje následující výňatek z popisu datové sady, který můžete použít k výběru funkce, kterou chcete normalizovat:
Output.. _california_housing_dataset: California Housing dataset -------------------------- **Data Set Characteristics:** :Number of Instances: 20640 :Number of Attributes: 8 numeric, predictive attributes and the target :Attribute Information: - MedInc median income in block group - HouseAge median house age in block group - AveRooms average number of rooms per household - AveBedrms average number of bedrooms per household - Population block group population - AveOccup average number of household members - Latitude block group latitude - Longitude block group longitude .
Dále převeďte sloupec (funkci) na pole a vytiskněte jej. Tento příklad používá sloupec HouseAge:
x_array = np.array(california_housing['HouseAge']) print("HouseAge array: ",x_array)
Nakonec pomocí funkce normalize() normalizujte data a vytiskněte výsledné pole:
normalized_arr = preprocessing.normalize([x_array]) print("Normalized HouseAge array: ",normalized_arr)
Spusťte úplný příklad a demonstrujte, jak normalizovat funkci pomocí funkce normalize():
from sklearn import preprocessing import numpy as np from sklearn.datasets import fetch_california_housing california_housing = fetch_california_housing(as_frame=True) # print(california_housing.DESCR) x_array = np.array(california_housing.data['HouseAge']) print("HouseAge array: ",x_array) normalized_arr = preprocessing.normalize([x_array]) print("Normalized HouseAge array: ",normalized_arr)
OutputHouseAge array: [41. 21. 52. . 17. 18. 16.] Normalized HouseAge array: [[0.00912272 0.00467261 0.01157028 . 0.00378259 0.0040051 0.00356009]]
Výstup ukazuje, že funkce normalize() změnila pole středních hodnot věku domu tak, že druhá odmocnina součtu druhých mocnin hodnot je rovna jedné. Jinými slovy, hodnoty byly škálovány na jednotku délky pomocí normy L2.
Normalizace datových sad podle řádku nebo sloupce Pomocí funkce normalize().
Když normalizujete datovou sadu bez převodu prvků nebo sloupců na pole pro zpracování, data se normalizují podle řádku. Výchozí osa pro funkci normalize() je 1, což znamená, že každý vzorek nebo řádek je normalizován.
Následující příklad ukazuje normalizaci datové sady California Housing pomocí výchozí osy:
from sklearn import preprocessing import pandas as pd from sklearn.datasets import fetch_california_housing california_housing = fetch_california_housing(as_frame=True) d = preprocessing.normalize(california_housing.data) scaled_df = pd.DataFrame(d, columns=california_housing.data.columns) print(scaled_df)
Output MedInc HouseAge AveRooms . AveOccup Latitude Longitude 0 0.023848 0.117447 0.020007 . 0.007321 0.108510 -0.350136 1 0.003452 0.008734 0.002594 . 0.000877 0.015745 -0.050829 2 0.014092 0.100971 0.016093 . 0.005441 0.073495 -0.237359 3 0.009816 0.090449 0.010119 . 0.004432 0.065837 -0.212643 4 0.006612 0.089394 0.010799 . 0.003750 0.065069 -0.210162 . . . . . . . . 20635 0.001825 0.029242 0.005902 . 0.002995 0.046179 -0.141637 20636 0.006753 0.047539 0.016147 . 0.008247 0.104295 -0.320121 20637 0.001675 0.016746 0.005128 . 0.002291 0.038840 -0.119405 20638 0.002483 0.023932 0.007086 . 0.002823 0.052424 -0.161300 20639 0.001715 0.011486 0.003772 . 0.001879 0.028264 -0.087038 [20640 rows x 8 columns]
Výstup ukazuje, že hodnoty jsou normalizovány podél řádků, takže každý vzorek je normalizován místo každého prvku.
Můžete však normalizovat podle prvku určením osy.
Následující příklad ukazuje normalizaci datové sady California Housing pomocí axis=0 k normalizaci podle funkce:
from sklearn import preprocessing import pandas as pd from sklearn.datasets import fetch_california_housing california_housing = fetch_california_housing(as_frame=True) d = preprocessing.normalize(california_housing.data, axis=) scaled_df = pd.DataFrame(d, columns=california_housing.data.columns) print(scaled_df)
Output MedInc HouseAge AveRooms . AveOccup Latitude Longitude 0 0.013440 0.009123 0.008148 . 0.001642 0.007386 -0.007114 1 0.013401 0.004673 0.007278 . 0.001356 0.007383 -0.007114 2 0.011716 0.011570 0.009670 . 0.001801 0.007381 -0.007115 3 0.009110 0.011570 0.006787 . 0.001638 0.007381 -0.007116 4 0.006209 0.011570 0.007329 . 0.001402 0.007381 -0.007116 . . . . . . . . 20635 0.002519 0.005563 0.005886 . 0.001646 0.007698 -0.007048 20636 0.004128 0.004005 0.007133 . 0.002007 0.007700 -0.007055 20637 0.002744 0.003783 0.006073 . 0.001495 0.007689 -0.007056 20638 0.003014 0.004005 0.006218 . 0.001365 0.007689 -0.007061 20639 0.003856 0.003560 0.006131 . 0.001682 0.007677 -0.007057 [20640 rows x 8 columns]
Když prozkoumáte výstup, všimnete si, že výsledky pro sloupec HouseAge odpovídají výstupu, který jste získali, když jste sloupec HouseAge převedli na pole a normalizovali jej v předchozím příkladu.
Použití funkce scikit-learn preprocessing.MinMaxScaler() k normalizaci dat
Funkci scikit-learn preprocessing.MinMaxScaler() můžete použít k normalizaci každé funkce změnou měřítka dat na určitý rozsah.
Funkce MinMaxScaler() škáluje každý prvek individuálně tak, aby hodnoty měly danou minimální a maximální hodnotu, s výchozí hodnotou 0 a 1.
Vzorec pro škálování hodnot prvků mezi 0 a 1 je:
Odečtěte minimální hodnotu od každého záznamu a poté vydělte výsledek rozsahem, kde rozsah je rozdíl mezi maximální a minimální hodnotou.
Následující příklad ukazuje, jak použít funkci MinMaxScaler() k normalizaci datové sady California Housing:
from sklearn import preprocessing import pandas as pd from sklearn.datasets import fetch_california_housing california_housing = fetch_california_housing(as_frame=True) scaler = preprocessing.MinMaxScaler() d = scaler.fit_transform(california_housing.data) scaled_df = pd.DataFrame(d, columns=california_housing.data.columns) print(scaled_df)
Output MedInc HouseAge AveRooms . AveOccup Latitude Longitude 0 0.539668 0.784314 0.043512 . 0.001499 0.567481 0.211155 1 0.538027 0.392157 0.038224 . 0.001141 0.565356 0.212151 2 0.466028 1.000000 0.052756 . 0.001698 0.564293 0.210159 3 0.354699 1.000000 0.035241 . 0.001493 0.564293 0.209163 4 0.230776 1.000000 0.038534 . 0.001198 0.564293 0.209163 . . . . . . . . 20635 0.073130 0.470588 0.029769 . 0.001503 0.737513 0.324701 20636 0.141853 0.333333 0.037344 . 0.001956 0.738576 0.312749 20637 0.082764 0.313725 0.030904 . 0.001314 0.732200 0.311753 20638 0.094295 0.333333 0.031783 . 0.001152 0.732200 0.301793 20639 0.130253 0.294118 0.031252 . 0.001549 0.725824 0.309761 [20640 rows x 8 columns]
Výstup ukazuje, že hodnoty jsou škálovány tak, aby měly výchozí minimální hodnotu 0 a maximální hodnotu 1.
Můžete také zadat různé minimální a maximální hodnoty pro změnu měřítka. V následujícím příkladu je minimální hodnota 0 a maximální hodnota je 2:
from sklearn import preprocessing import pandas as pd from sklearn.datasets import fetch_california_housing california_housing = fetch_california_housing(as_frame=True) scaler = preprocessing.MinMaxScaler(feature_range=(, 2)) d = scaler.fit_transform(california_housing.data) scaled_df = pd.DataFrame(d, columns=california_housing.data.columns) print(scaled_df)
MedInc HouseAge AveRooms . AveOccup Latitude Longitude 0 1.079337 1.568627 0.087025 . 0.002999 1.134963 0.422311 1 1.076054 0.784314 0.076448 . 0.002281 1.130712 0.424303 2 0.932056 2.000000 0.105513 . 0.003396 1.128587 0.420319 3 0.709397 2.000000 0.070482 . 0.002987 1.128587 0.418327 4 0.461552 2.000000 0.077068 . 0.002397 1.128587 0.418327 . . . . . . . . 20635 0.146260 0.941176 0.059538 . 0.003007 1.475027 0.649402 20636 0.283706 0.666667 0.074688 . 0.003912 1.477152 0.625498 20637 0.165529 0.627451 0.061808 . 0.002629 1.464400 0.623506 20638 0.188591 0.666667 0.063565 . 0.002303 1.464400 0.603586 20639 0.260507 0.588235 0.062505 . 0.003098 1.451647 0.619522 [20640 rows x 8 columns]
Výstup ukazuje, že hodnoty jsou škálovány tak, aby měly minimální hodnotu 0 a maximální hodnotu 2.
Proč investovat do čističky vzduchu?
V tomto článku jste použili dvě funkce scikit-learn k normalizaci dat různými způsoby podle vzorku (řádek) a podle prvku (sloupec). Pokračujte v učení o dalších tématech strojového učení.
Děkujeme, že jste se učili s komunitou DigitalOcean. Podívejte se na naši nabídku pro výpočetní, úložné, síťové a spravované databáze.