引言
在我們開始學習分類變數編碼之前,讓我們先了解數據類型及其規模的基礎知識。對於學習者來說,理解這些主題以繼續進行分類變數編碼變得至關重要。眾所周知,數據是一種獨特的信息類型,通常以特定的方式格式化。我們可以將數據分為三種類型,稱為結構化數據、半結構化數據和非結構化數據。
以具有行和列的矩陣形式體現的數據被表示為結構化數據。這些數據可以作為表格存儲在 SQL 資料庫中,可以作為行和列存儲在 excel 工作表中,也可以作為分隔符存儲在 CSV 中。
不以矩陣形式體現的數據稱為半結構化數據和非結構化數據。我們通常可以將半結構化數據存儲在 XML 文件、 JSON 格式等多種格式中,而非結構化數據以圖像、電子郵件、視頻、日誌數據和文本數據的形式存儲。
讓我們考慮一個基於機器學習或數據科學提供的業務問題。如果我們只處理結構化數據,收集的數據是連續變數和分類變數的組合,機器學習中的大多數演算法都不會理解或不能處理分類變數。
這種說法意味著,當數據以數字形式表示而不是分類到模型中進行訓練和測試時,機器學習中的演算法在準確性和其他性能指標上表現得更好。
因此,在使用分類數據來擬合和評估模型之前,必須將其編碼成數字。
機器學習的一些演算法,如基於樹的(如決策樹、隨機森林)演算法,在處理分類變數時表現更好。在任何與數據科學相關的項目中,最好的訓練是將分類數據轉換成數字數據。
既然目標現在很明確,在我們開始構建任何統計模型、深度學習模型或機器學習模型,並開始將分類數據編碼或轉換為數字形式之前,讓我們先了解幾種類型的分類數據。
理解名義規模
*名義標度**被定義為僅是名稱的變數。它們用於標記變數。名義尺度從不相互重疊,也沒有任何數值意義。*
*#### 注:名義規模僅指那些剛剛命名的變數。
以下是一些代表標稱刻度數據的示例。一旦我們收集了數據,我們必須分配一個數字代碼來代表一個名義變數。
| 什麼是人的性別? | 什麼是人的婚姻狀況? | 這個人住在哪個城市? |
| 男性的 | 單一的 | 德里 |
| 女性的 | 已婚的 | 孟買 | | 離婚的 | 金奈 | | 寡居的 | 班加羅爾 |
| 人居住的城市 | 指定的數字代碼 |
| 德里 | one |
| 孟買 | Two |
| 金奈 | three |
| 班加羅爾 | four |
例如,我們可以為一個分類變數分配一個數字代碼 1 來表示德里,2 來表示孟買,3 來表示欽奈,4 來表示班加羅爾——這個人居住在哪個城市。
重要提示:指定的數值沒有任何附加的數學值。
上面的陳述暗示了像除法、乘法、減法或加法這樣的基本數學運算是沒有意義的。因此,像德里/孟買或欽奈+班加羅爾這樣的運營完全沒有意義。
理解序數尺度
序數標度 是指一個變數,其中的數據值是從一個有序集合中存儲的。例如,數據利用李克特量表來表示有限的客戶反饋調查,如下表所示:
客戶反饋:5 分李克特量表
| 反饋 | 指定的數字代碼 |
| 非常窮 | one |
| 窮人 | Two |
| 令人滿意的 | three |
| 好的 | four |
| 很好 | five |
在上面的案例中,我們藉助五點李克特量表收集了反饋數據。我們將數字代碼 1 指定為非常差,2 表示差,3 表示滿意,4 表示好,5 表示非常好。我們還可以觀察到,5 比 4 好,比 3 好很多。然而,如果我們從滿意中減去非常好,那就沒有任何意義了。
正如我們已經知道的,大多數機器學習演算法只對數值或數據起作用。這就是將分類特徵編碼成與模型兼容的表示的原因。
因此,有幾種眾所周知的編碼方法,包括:
- 標籤編碼
- 一鍵編碼
- 序數編碼
但是,在本教程中,我們將只介紹標籤編碼:
理解標籤編碼
在 Python 標籤編碼中,我們需要使用一個介於 0 和類總數減 1 之間的數值來替換分類值。例如,如果分類變數的值有六個不同的類,我們將使用 0、1、2、3、4 和 5。
現在,讓我們以印度各邦的新冠肺炎病例數據為例,了解標籤編碼。在觀察下面的數據幀時,我們會發現 State 列由一個分類值組成,這對於機器來說並不友好。其他列由數值組成。現在,讓我們嘗試對狀態列進行標籤編碼。
印度各邦新冠肺炎病例
| 狀態 | 確認的 | 死亡 | 恢復 |
| 馬哈拉施特拉邦 | Two hundred and eighty-four thousand two hundred and eighty-one | Eleven thousand one hundred and ninety-four | One hundred and fifty-eight thousand one hundred and forty |
| 泰米爾納德邦 | One hundred and fifty-six thousand three hundred and sixty-nine | Two thousand two hundred and thirty-six | One hundred and seven thousand four hundred and sixteen |
| 德里 | One hundred and eighteen thousand six hundred and forty-five | Three thousand five hundred and forty-five | Ninety-seven thousand six hundred and ninety-three |
| 卡納塔克邦 | Fifty-one thousand four hundred and twenty-two | Two thousand and eighty-nine | Nineteen thousand seven hundred and twenty-nine |
| 古吉拉特邦 | Forty-five thousand four hundred and eighty-one | Two thousand and eighty-nine | Thirty-two thousand one hundred and three |
| 北方邦(北方邦) | Forty-three thousand four hundred and forty-one | One thousand and forty-six | Twenty-six thousand six hundred and seventy-five |
正如我們所觀察到的,在執行標籤編碼之後,我們已經為每個分類值分配了數值。我們中的一些人可能想知道為什麼編號是無序的(自上而下)。原因是我們按照字母順序分配了數字,這意味著德里被分配為 0,古吉拉特被分配為 1,卡納塔克邦被分配為 2,以此類推。
| 狀態(標稱刻度) | 狀態(標籤編碼) |
| 馬哈拉施特拉邦 | three |
| 泰米爾納德邦 | four |
| 德里 | Zero |
| 卡納塔克邦 | Two |
| 古吉拉特邦 | one |
| 北方邦(北方邦) | five |
使用 Python 的標籤編碼
Python 的 sklearn 庫為用戶提供了預定義的函數,以便在數據集上使用標籤編碼。
語法:
from sklearn import preprocessing
obj = preprocessing.LabelEncoder()
正如我們所觀察到的,我們已經創建了一個標籤編碼器類的對象,然後使用該對象將標籤編碼應用於數據。
標籤編碼主要有兩種方式:
- 藉助 scikit-learn 庫的 LabelEncoder 類
- 類別代碼
使用 scikit-learn 庫進行標籤編碼
讓我們從標籤編碼的過程開始。數據集編碼的主要步驟是擁有數據集。
因此,我們在這裡創建了一個簡單的數據集。
示例:創建數據集
import pandas as pd
my_data = {
"Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
"Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
}
blk = pd.DataFrame(my_data)
print("Geniune Data Frame:\n")
print(blk)
正如我們所觀察到的,藉助 Pandas 的 DataFrame() 功能,我們創建了一個字典『數據』,並將其轉換為數據幀。
輸出:
Geniune Data Frame:
Gender Name
0 F Cindy
1 M Carl
2 M Johnny
3 F Stacey
4 M Andy
5 F Sara
6 M Victor
7 F Martha
8 F Mindy
9 M Max
從上面的數據集中我們可以觀察到,我們有一個名為「性別」的變數,它的標籤分別為「F」和「M」。
接下來,讓我們嘗試導入標籤編碼器類。然後,我們將在數據集的【性別】變數上應用該類。
示例:
import pandas as pd
from sklearn import preprocessing
my_data = {
"Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
"Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
}
blk = pd.DataFrame( my_data )
print("Geniune Data Frame:\n")
print( blk )
my_label = preprocessing.LabelEncoder()
blk[ 'Gender' ]= my_label.fit_transform(blk[ 'Gender' ])
print(blk[ 'Gender' ].unique())
print("Data Frame after Label Encoding:\n")
print( blk )
輸出:
Geniune Data Frame:
Gender Name
0 F Cindy
1 M Carl
2 M Johnny
3 F Stacey
4 M Andy
5 F Sara
6 M Victor
7 F Martha
8 F Mindy
9 M Max
[0 1]
Data Frame after Label Encoding:
Gender Name
0 0 Cindy
1 1 Carl
2 1 Johnny
3 0 Stacey
4 1 Andy
5 0 Sara
6 1 Victor
7 0 Martha
8 0 Mindy
9 1 Max
說明:
在上例中,我們導入了 scikit-learn 庫的Pandas和預處理模塊。然後,我們將數據定義為字典,並列印一個數據幀供參考。
稍後,我們使用 fit_transform() 方法將對象指向的標籤編碼器功能添加到數據變數中。在執行標籤編碼後,我們列印了關於性別和最終數據幀的唯一代碼。
接下來,讓我們討論另一種藉助類別代碼的標籤編碼方法。
使用類別代碼的標籤編碼
在我們進入使用類別代碼進行標籤編碼的過程之前,讓我們檢查數據集變數的數據類型。
我們可以使用如下所示的數據類型功能來檢查數據類型:
import pandas as pd
my_data = {
"Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
"Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
}
blk = pd.DataFrame( my_data )
print( blk.dtypes )
輸出:
Gender object
Name object
dtype: object
一旦我們檢查了變數「性別」的數據類型,我們將轉換並將其轉換為類別類型。
這可以在下面的代碼片段中看到:
import pandas as pd
my_data = {
"Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
"Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
}
blk = pd.DataFrame( my_data )
blk[ 'Gender' ] = blk[ 'Gender' ].astype( 'category' )
print( blk.dtypes )
輸出:
Gender category
Name object
dtype: object
現在,讓我們嘗試用Pandas 將標籤轉換成整數類型。DataFrame.cat.codes 功能。下面是一個基於使用類別代碼的標籤編碼的完整示例:
示例:
import pandas as pd
my_data = {
"Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
"Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
}
blk = pd.DataFrame( my_data )
print("Genuine Data Frame:\n")
print( blk )
blk[ 'Gender' ] = blk[ 'Gender' ].astype( 'category' )
print("\nData Frame after Label Encoding using Category codes:\n")
blk[ 'Gender' ] = blk[ 'Gender' ].cat.codes
print( blk )
輸出:
Genuine Data Frame:
Gender Name
0 F Cindy
1 M Carl
2 M Johnny
3 F Stacey
4 M Andy
5 F Sara
6 M Victor
7 F Martha
8 F Mindy
9 M Max
Data Frame after Label Encoding using Category codes:
Gender Name
0 0 Cindy
1 1 Carl
2 1 Johnny
3 0 Stacey
4 1 Andy
5 0 Sara
6 1 Victor
7 0 Martha
8 0 Mindy
9 1 Max
說明:
在上面的例子中,我們已經導入了Pandas庫,並將數據定義為字典。然後,我們列印了原始數據幀供參考。之後,我們將變數「性別」的數據類型轉換為一個類別,並使用了Pandas。DataFrame.cat.codes 功能將其轉換為類別代碼。最後,我們使用類別代碼列印了標籤編碼後的結果。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/242963.html