Python中的標(biāo)簽編碼和獨(dú)熱編碼示例詳解
在機(jī)器學(xué)習(xí)項(xiàng)目中,我們通常處理具有不同分類(lèi)列的數(shù)據(jù)集,其中一些列的元素在有序變量類(lèi)別中,例如列收入水平具有低,中或高的元素,在這種情況下,我們可以用1,2,3替換這些元素。其中1表示“低”,2表示“中”,3表示“高”。通過(guò)這種類(lèi)型的編碼,我們?cè)噲D保留元素的含義,其中較高的權(quán)重被分配給具有較高優(yōu)先級(jí)的元素。
標(biāo)簽編碼
標(biāo)簽編碼是一種用于將分類(lèi)列轉(zhuǎn)換為數(shù)值列的技術(shù),以便它們可以通過(guò)僅采用數(shù)值數(shù)據(jù)的機(jī)器學(xué)習(xí)模型進(jìn)行擬合。它是機(jī)器學(xué)習(xí)項(xiàng)目中重要的預(yù)處理步驟。
標(biāo)簽編碼示例
假設(shè)我們?cè)谀硞€(gè)數(shù)據(jù)集中有一個(gè)列Height,其中包含Tall,Medium和short元素。要將此分類(lèi)列轉(zhuǎn)換為數(shù)值列,我們將對(duì)此列應(yīng)用標(biāo)簽編碼。在應(yīng)用標(biāo)簽編碼之后,“高度”列被轉(zhuǎn)換為具有元素0、1和2的數(shù)值列,其中0是高的標(biāo)簽,1是中等的標(biāo)簽,2是矮的標(biāo)簽。
我們將在目標(biāo)列Species上的虹膜數(shù)據(jù)集上應(yīng)用Label Encoding。它包含三個(gè)物種Iris-setosa,Iris-versicolor,Iris-virginica。
# Import libraries import numpy as np import pandas as pd # Import dataset df = pd.read_csv('../../data/Iris.csv') df['species'].unique() ''' array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object) '''
使用LabelEncoder()應(yīng)用Label Encoding后,我們的分類(lèi)值將替換為數(shù)值[int]。
# Import label encoder from sklearn import preprocessing # label_encoder object knows # how to understand word labels. label_encoder = preprocessing.LabelEncoder() # Encode labels in column 'species'. df['species']= label_encoder.fit_transform(df['species']) df['species'].unique() ''' array([0, 1, 2], dtype=int64) '''
標(biāo)簽編碼的局限
標(biāo)簽編碼將分類(lèi)數(shù)據(jù)轉(zhuǎn)換為數(shù)字?jǐn)?shù)據(jù),但它為每個(gè)數(shù)據(jù)類(lèi)別分配一個(gè)唯一的數(shù)字(從0開(kāi)始)。這可能導(dǎo)致在數(shù)據(jù)集的模型訓(xùn)練期間產(chǎn)生優(yōu)先級(jí)問(wèn)題。具有高值的標(biāo)簽可以被認(rèn)為具有比具有較低值的標(biāo)簽高的優(yōu)先級(jí)。
具有輸出類(lèi)Mexico、Paris、Dubai的屬性。在“標(biāo)簽編碼”上,此列允許將“Mexico”替換為“0”,將“Paris”替換為“1”,將“Dubai”替換為“2”。由此,可以解釋為在訓(xùn)練模型時(shí),Dubai具有比Mexico和Paris更高的優(yōu)先級(jí),但實(shí)際上,這些城市之間不存在這種優(yōu)先級(jí)關(guān)系。
獨(dú)熱編碼
我們?cè)跀?shù)據(jù)科學(xué)項(xiàng)目開(kāi)發(fā)過(guò)程中遇到的大多數(shù)現(xiàn)實(shí)數(shù)據(jù)集都具有混合數(shù)據(jù)類(lèi)型的列。這些數(shù)據(jù)集由分類(lèi)列和數(shù)值列組成。然而,各種機(jī)器學(xué)習(xí)模型不適用于分類(lèi)數(shù)據(jù),為了將這些數(shù)據(jù)擬合到機(jī)器學(xué)習(xí)模型中,需要將其轉(zhuǎn)換為數(shù)值數(shù)據(jù)。例如,假設(shè)數(shù)據(jù)集有一個(gè)Gender列,其中包含Male和Female等分類(lèi)元素。這些標(biāo)簽沒(méi)有特定的偏好順序,而且由于數(shù)據(jù)是字符串標(biāo)簽,機(jī)器學(xué)習(xí)模型會(huì)誤解其中存在某種層次結(jié)構(gòu)。解決這個(gè)問(wèn)題的一種方法是標(biāo)簽編碼,我們將為這些標(biāo)簽分配一個(gè)數(shù)值,例如映射到0和1的男性和女性。但這可能會(huì)在我們的模型中增加偏差,因?yàn)樗鼘㈤_(kāi)始對(duì)女性參數(shù)給予更高的偏好,因?yàn)?>0,但理想情況下,兩個(gè)標(biāo)簽在數(shù)據(jù)集中同等重要。為了解決這個(gè)問(wèn)題,我們將使用獨(dú)熱編碼技術(shù)。
獨(dú)熱編碼是我們用來(lái)在機(jī)器學(xué)習(xí)模型中將分類(lèi)變量表示為數(shù)值的技術(shù)。
使用獨(dú)熱編碼的優(yōu)點(diǎn)包括:
- 它允許在需要數(shù)值輸入的模型中使用分類(lèi)變量。
- 它可以通過(guò)向模型提供有關(guān)分類(lèi)變量的更多信息來(lái)提高模型性能。
- 它可以幫助避免排序問(wèn)題,當(dāng)分類(lèi)變量具有自然排序時(shí)可能發(fā)生這種情況(例如,“小”、“中”、“大”)。
使用獨(dú)熱編碼的缺點(diǎn)包括:
- 它可能導(dǎo)致維度增加,因?yàn)闉樽兞恐械拿總€(gè)類(lèi)別創(chuàng)建了單獨(dú)的列。這可能會(huì)使模型更加復(fù)雜,訓(xùn)練速度更慢。
- 它可能導(dǎo)致稀疏數(shù)據(jù),因?yàn)榇蠖鄶?shù)觀測(cè)值在大多數(shù)獨(dú)熱編碼列中的值為0。
- 它可能會(huì)導(dǎo)致過(guò)度擬合,特別是當(dāng)變量中有許多類(lèi)別并且樣本量相對(duì)較小時(shí)。
- 獨(dú)熱編碼是一種處理分類(lèi)數(shù)據(jù)的強(qiáng)大技術(shù),但它可能導(dǎo)致增加的維度,稀疏性和過(guò)擬合。重要的是要謹(jǐn)慎使用它,并考慮其他方法,如序數(shù)編碼或二進(jìn)制編碼。
示例
在獨(dú)熱編碼中,分類(lèi)參數(shù)將為男性和女性標(biāo)簽準(zhǔn)備單獨(dú)的列。因此,只要有男性,男性列中的值將為1,女性列中的值將為0,反之亦然。讓我們用一個(gè)例子來(lái)理解:考慮給定水果、其對(duì)應(yīng)的分類(lèi)值和價(jià)格的數(shù)據(jù)。
在對(duì)數(shù)據(jù)應(yīng)用獨(dú)熱編碼之后的輸出如下給出,
創(chuàng)建一個(gè)dataframe來(lái)實(shí)現(xiàn)CSV文件的獨(dú)熱編碼。
# 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())
分類(lèi)列中的唯一元素
print(data['Gender'].unique()) print(data['Remarks'].unique()) ''' array(['Male', 'Female'], dtype=object) array(['Nice', 'Good', 'Great'], dtype=object) '''
列中元素的計(jì)數(shù)
data['Gender'].value_counts() data['Remarks'].value_counts() ''' Female 7 Male 5 Name: Gender, dtype: int64 Nice 5 Great 4 Good 3 Name: Remarks, dtype: int64 '''
我們有兩種方法可用于對(duì)分類(lèi)列執(zhí)行one-hot編碼。
利用Pandas庫(kù)實(shí)現(xiàn)分類(lèi)列的獨(dú)熱編碼
我們可以使用pandas中的pd.get_dummies()函數(shù)對(duì)分類(lèi)列進(jìn)行one-hot編碼。
one_hot_encoded_data = pd.get_dummies(data, columns = ['Remarks', 'Gender']) print(one_hot_encoded_data)
我們可以觀察到數(shù)據(jù)中有3個(gè)備注和2個(gè)性別列。但是,如果它有n個(gè)唯一標(biāo)簽,則可以只使用n-1列來(lái)定義參數(shù)。例如,如果我們只保留Gender_Female列并刪除Gender_Male列,那么我們也可以傳達(dá)整個(gè)信息,當(dāng)標(biāo)簽為1時(shí),它表示女性,當(dāng)標(biāo)簽為0時(shí),它表示男性。通過(guò)這種方式,我們可以對(duì)分類(lèi)數(shù)據(jù)進(jìn)行編碼,并減少參數(shù)的數(shù)量。
使用Scikit Learn Library進(jìn)行獨(dú)熱編碼
Scikit-learn(sklearn)是Python中一個(gè)流行的機(jī)器學(xué)習(xí)庫(kù),它提供了許多用于數(shù)據(jù)預(yù)處理的工具。它提供了一個(gè)OneHotEncoder函數(shù),我們使用該函數(shù)將分類(lèi)和數(shù)值變量編碼為二進(jìn)制向量,也是在實(shí)現(xiàn)該算法之前。確保分類(lèi)值必須被標(biāo)記和編碼,因?yàn)楠?dú)熱編碼僅采用數(shù)字分類(lèi)值。
# importing libraries import pandas as pd import numpy as np from sklearn.preprocessing import OneHotEncoder # Retrieving data data = pd.read_csv('Employee_data.csv') # Converting type of columns to category data['Gender'] = data['Gender'].astype('category') data['Remarks'] = data['Remarks'].astype('category') # Assigning numerical values and storing it in another columns data['Gen_new'] = data['Gender'].cat.codes data['Rem_new'] = data['Remarks'].cat.codes # Create an instance of One-hot-encoder enc = OneHotEncoder() # Passing encoded columns enc_data = pd.DataFrame(enc.fit_transform( data[['Gen_new', 'Rem_new']]).toarray()) # Merge with main New_df = data.join(enc_data) print(New_df)
注意:這里我們已經(jīng)將enc.fit_transform()方法轉(zhuǎn)換為數(shù)組,因?yàn)镺neHotEncoder的fit_transform方法返回SpiPy稀疏矩陣,因此當(dāng)我們有大量分類(lèi)變量時(shí),首先轉(zhuǎn)換為數(shù)組可以保存空間。
到此這篇關(guān)于Python中的標(biāo)簽編碼和獨(dú)熱編碼的文章就介紹到這了,更多相關(guān)Python標(biāo)簽編碼和獨(dú)熱編碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DRF跨域后端解決之django-cors-headers的使用
這篇文章主要介紹了DRF跨域后端解決之django-cors-headers的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01解決pytorch 數(shù)據(jù)類(lèi)型報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決pytorch 數(shù)據(jù)類(lèi)型報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python多線程通信queue隊(duì)列用法實(shí)例分析
這篇文章主要介紹了Python多線程通信queue隊(duì)列用法,結(jié)合實(shí)例形式分析了Python多線程通信queue隊(duì)列相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03高效測(cè)試用例組織算法pairwise之Python實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇高效測(cè)試用例組織算法pairwise之Python實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07全網(wǎng)最簡(jiǎn)約的Anaconda+Python3.7安裝教程Win10
這篇文章主要介紹了全網(wǎng)最簡(jiǎn)約的Anaconda+Python3.7安裝教程Win10,圖文講解全流程安裝方法,還不會(huì)的小伙伴快來(lái)看看吧2023-03-03