Daugumoje realaus gyvenimo duomenų rinkinių, su kuriais susiduriame kurdami duomenų mokslo projektą, yra mišraus tipo duomenų stulpeliai. Šiuos duomenų rinkinius sudaro abu kategoriškas taip pat skaitiniai stulpeliai. Tačiau įvairūs mašininio mokymosi modeliai neveikia su kategoriniais duomenimis ir norint pritaikyti šiuos duomenis į mašininio mokymosi modelį, juos reikia konvertuoti į skaitinius duomenis. Pavyzdžiui, tarkime, kad duomenų rinkinys turi a Lytis stulpelis su kategoriniais elementais kaip Vyras ir Moteris . Šios etiketės neturi konkrečios pirmenybės tvarkos, o kadangi duomenys yra eilučių etiketės, mašininio mokymosi modeliai klaidingai suprato, kad juose yra tam tikra hierarchija.
Vienas iš būdų išspręsti šią problemą gali būti etikečių kodavimas, kai, pavyzdžiui, šioms etiketėms priskirsime skaitinę reikšmę Patinas ir Moteris susietas su 0 ir 1 . Tačiau tai gali padidinti mūsų modelio šališkumą, nes pradės teikti didesnę pirmenybę Moteris parametras yra 1>0, tačiau idealiu atveju abi etiketės yra vienodai svarbios duomenų rinkinyje. Norėdami išspręsti šią problemą, naudosime „One Hot Encoding“ techniką.
Vienas karštas kodavimas
Vienas karštasis kodavimas yra metodas, kurį naudojame kategoriškiems kintamiesiems kaip skaitines vertes pateikti mašininio mokymosi modelyje.
Vieno karštojo kodavimo pranašumai yra šie:
- Tai leidžia modeliuose, kuriems reikalinga skaitmeninė įvestis, naudoti kategorinius kintamuosius.
- Jis gali pagerinti modelio našumą, pateikdamas modeliui daugiau informacijos apie kategorinį kintamąjį.
- Tai gali padėti išvengti eiliškumo problemos, kuri gali atsirasti, kai kategorinis kintamasis turi natūralią tvarką (pvz., mažas, vidutinis, didelis).
Vieno karštojo kodavimo trūkumai yra šie:
- Dėl to gali padidėti matmenys, nes kiekvienai kintamojo kategorijai sukuriamas atskiras stulpelis. Dėl to modelis gali būti sudėtingesnis ir lėtas treniruojamas.
- Tai gali sukelti negausų duomenų, nes daugumos stebėjimų reikšmė bus 0 daugumoje vienkartinių koduotų stulpelių.
- Tai gali sukelti per daug pritaikymą, ypač jei kintamajame yra daug kategorijų, o imties dydis yra palyginti mažas.
- Vienkartinis kodavimas yra galingas metodas kategoriškiems duomenims apdoroti, tačiau dėl to gali padidėti matmenys, retumas ir perteklius. Svarbu jį naudoti atsargiai ir apsvarstyti kitus metodus, pvz., eilės kodavimą arba dvejetainį kodavimą.
Vienas karštas kodavimo pavyzdžiai
Į Vienas karštas kodavimas , kategoriniai parametrai parengs atskirus stulpelius ir vyriškoms, ir moteriškoms etiketėms. Taigi, visur, kur yra vyras, stulpelyje Vyras reikšmė bus 1, stulpelyje Moteris – 0 ir atvirkščiai. Supraskime pavyzdžiu: apsvarstykite duomenis, kuriuose pateikiami vaisiai, jų atitinkamos kategorinės vertės ir kainos.
| Vaisius | Vaisiaus kategoriška vertė | Kaina |
|---|---|---|
| obuolys | 1 | 5 |
| mango | 2 | 10 |
| obuolys | 1 | penkiolika |
| oranžinė | 3 | dvidešimt |
Išvestis pritaikius vienkartinį duomenų kodavimą pateikiama taip:
| obuolys | mango | oranžinė | kaina |
|---|---|---|---|
| 1 | 0 | 0 | 5 |
| 0 | 1 | 0 | 10 |
| 1 | 0 | 0 | penkiolika |
| 0 | 0 | 1 | dvidešimt |
Vienkartinis kodavimas naudojant Python
Duomenų rėmelio kūrimas
Duomenų rėmelio kūrimas, kad būtų galima įdiegti vieną karštąją kodavimą iš CSV failo.
nustatyti javaPython3
# Program for demonstration of one hot encoding # import libraries import numpy as np import pandas as pd # import the data required data = pd.read_csv('employee_data.csv') print(data.head())> Išvestis:

Pirmos penkios duomenų rėmelio eilutės
Unikalūs elementai kategoriškoje stulpelyje
galime naudoti Unikalus() funkcija iš pandos biblioteką, kad gautumėte unikalius elementus iš duomenų rėmelio stulpelio.
Python3 print(data['Gender'].unique()) print(data['Remarks'].unique())>
Išvestis:
array(['Male', 'Female'], dtype=object) array(['Nice', 'Good', 'Great'], dtype=object)>
Elementų skaičius stulpelyje
Galime naudoti value_counts() funkcija iš pandų, kad gautų kiekvieno elemento skaičių duomenų rėmelyje.
Python3 data['Gender'].value_counts() data['Remarks'].value_counts()>
Išvestis:
Female 7 Male 5 Name: Gender, dtype: int64 Nice 5 Great 4 Good 3 Name: Remarks, dtype: int64>
Turime du būdus, kaip atlikti vienkartinį kodavimą kategoriškame stulpelyje.
Vienkartinis kategorinio stulpelio kodavimas naudojant Pandas biblioteką
Galime naudoti pd.get_dummies() funkcija nuo pandų iki one-hot koduoti kategorinius stulpelius. Ši funkcija
Python3 one_hot_encoded_data = pd.get_dummies(data, columns = ['Remarks', 'Gender']) print(one_hot_encoded_data)>
Išvestis:

„One-Hot“ užkoduoti duomenų rinkinio stulpeliai
Galime pastebėti, kad turime 3 Pastabos ir 2 Lytis duomenų stulpelius. Tačiau galite tiesiog naudoti n-1 stulpelius, kad nustatytų parametrus, jei yra n unikalios etiketės. Pavyzdžiui, jei išsaugosime tik Lytis Moteris stulpelį ir nuleiskite Lytis Vyras stulpelyje, tada taip pat galime perteikti visą informaciją, nes kai etiketė yra 1, tai reiškia moterį, o kai etiketė yra 0, tai reiškia vyrą. Tokiu būdu galime užkoduoti kategoriškus duomenis ir sumažinti parametrų skaičių.
Vienas karštas kodavimas naudojant Sci-kit Learn Library
Scikit-learn(sklearn) yra populiari Python mašininio mokymosi biblioteka, teikianti daugybę išankstinio duomenų apdorojimo įrankių. Tai suteikia a OneHotEncoder funkcija, kurią naudojame koduodami kategorinius ir skaitinius kintamuosius į dvejetainius vektorius.
Python3 #one hot encoding using OneHotEncoder of Scikit-Learn import pandas as pd from sklearn.preprocessing import OneHotEncoder #Building a dummy employee dataset for example data = {'Employee id': [10, 20, 15, 25, 30], 'Gender': ['M', 'F', 'F', 'M', 'F'], 'Remarks': ['Good', 'Nice', 'Good', 'Great', 'Nice'], } #Converting into a Pandas dataframe df = pd.DataFrame(data) #Print the dataframe: print(f'Employee data :
{df}') #Extract categorical columns from the dataframe #Here we extract the columns with object datatype as they are the categorical columns categorical_columns = df.select_dtypes(include=['object']).columns.tolist() #Initialize OneHotEncoder encoder = OneHotEncoder(sparse_output=False) # Apply one-hot encoding to the categorical columns one_hot_encoded = encoder.fit_transform(df[categorical_columns]) #Create a DataFrame with the one-hot encoded columns #We use get_feature_names_out() to get the column names for the encoded data one_hot_df = pd.DataFrame(one_hot_encoded, columns=encoder.get_feature_names_out(categorical_columns)) # Concatenate the one-hot encoded dataframe with the original dataframe df_encoded = pd.concat([df, one_hot_df], axis=1) # Drop the original categorical columns df_encoded = df_encoded.drop(categorical_columns, axis=1) # Display the resulting dataframe print(f'Encoded Employee data :
{df_encoded}')> Išvestis
Employee data : Employee id Gender Remarks 0 10 M Good 1 20 F Nice 2 15 F Good 3 25 M Great 4 30 F Nice Encoded Employee data : Employee id Gender_F Gender_M Remarks_Good Remarks_Great Remarks_Nice 0 10 0.0 1.0 1.0 0.0 0.0 1 20 1.0 0.0 0.0 0.0 1.0 2 15 1.0 0.0 1.0 0.0 0.0 3 25 0.0 1.0 0.0 1.0 0.0 4 30 1.0 0.0 0.0 0.0 1.0>