【scikit-learn基礎】--『預處理』之 分類編碼

2023-12-20 12:02:30

資料的預處理是資料分析,或者機器學習訓練前的重要步驟。
通過資料預處理,可以

  • 提高資料質量,處理資料的缺失值、異常值和重複值等問題,增加資料的準確性和可靠性
  • 整合不同資料,資料的來源和結構可能多種多樣,分析和訓練前要整合成一個資料集
  • 提高資料效能,對資料的值進行變換,規約等(比如無量綱化),讓演演算法更加高效

本篇介紹的分類編碼處理,主要用於將類別型資料轉換為可以用於分析或機器學習的形式。
類別型資料是指具有離散、不連續取值的資料,例如性別(男/女)、等級(優/良/中/差)之類資料。
對這些資料進行適當的編碼,可以提高資料處理效率和準確度。

1. 原理

分類編碼的原理比較簡單,常用的兩種是順序編碼獨熱編碼

1.1. 順序編碼

順序編碼很好理解,就是按照順序給離散的資料編碼,比如下面成績和班級資訊的資料:

data = np.array(
    [
        ["優", "三班"],
        ["及格", "二班"],
        ["良", "一班"],
        ["優", "五班"],
        ["中", "八班"],
        ["良", "六班"],
        ["不及格", "三班"],
        ["優", "十班"],
    ]
)

原始資料是用中文描述的,無法直接用於機器學習演演算法之中,所以要編碼。
scikit-learn庫的OrdinalEncoder就是用來順序編碼的。

from sklearn import preprocessing as pp

data = np.array(
    [
        ["優", "三班"],
        ["及格", "二班"],
        ["良", "一班"],
        ["優", "五班"],
        ["中", "八班"],
        ["良", "六班"],
        ["不及格", "三班"],
        ["優", "十班"],
    ]
)
oenc = pp.OrdinalEncoder()

# 順序編碼
oenc.fit_transform(data)

# 執行結果
array([[2., 1.],
       [3., 2.],
       [4., 0.],
       [2., 3.],
       [1., 4.],
       [4., 5.],
       [0., 1.],
       [2., 6.]])

從執行結果可以看出,雖然"優", "良", "中"等成績等級,"一班", "二班", "三班"等班級資訊都被編碼成順序的數位。
但是,並不是按照中文含義的順序來編碼的,比如優對應2及格對應3三班對應1二班卻對應2等等。

為了讓編碼後的數位和原來的中文含義的順序有對應,我們可以定義編碼的順序。

# 定義中文的順序
catagories = [
    ["優", "良", "中", "及格", "不及格"],
    ["一班", "二班", "三班", "五班", "六班", "八班", "十班"],
]

oenc = pp.OrdinalEncoder(categories=catagories)
oenc.fit_transform(data)

# 執行結果
array([[0., 2.],
       [3., 1.],
       [1., 0.],
       [0., 3.],
       [2., 5.],
       [1., 4.],
       [4., 2.],
       [0., 6.]])

這樣,編碼後的數位的順序就能和中文所代表的含義對應起來了。

1.2. 獨熱編碼

上面範例中的成績等級班級資訊都有順序,如果對沒有順序含義的資訊進行順序編碼的話,
就會賦予給資訊新增了順序的含義,對於後續演演算法的應用可能會產生影響。

這時,就可以用獨熱編碼的方式來處理,比如對於下面的科目資訊:

data = np.array([["語文"], ["數學"], ["英語"], ["物理"], ["化學"]])

這些科目資訊之間是沒有順序概念的,語文不一定排在數學前面,化學也不一定要排在英語後面。
這時,用獨熱編碼就比較合適了。

data = np.array([["語文"], ["數學"], ["英語"], ["物理"], ["化學"]])

enc = pp.OneHotEncoder()
enc.fit_transform(data).toarray()

# 執行結果
array([[0., 0., 0., 0., 1.],
       [0., 1., 0., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 1., 0., 0.],
       [1., 0., 0., 0., 0.]])

從中可以看出,語文編碼成了陣列[0., 0., 0., 0., 1.],數學編碼成了[0., 1., 0., 0., 0.]陣列等等。
科目資訊之間不存在順序。

2. 作用

分類編碼是資料探勘和機器學習領域中非常重要的一個環節,主要的作用有:

  1. 轉換資料格式:將類別型資料轉換為數值型資料,從而使其能夠被計算機處理和建模。
  2. 提高處理效率:分類編碼可以將多個類別型變數轉換為多個數值型變數,從而簡化了資料處理過程,提高了資料處理效率。
  3. 提高效能:分類編碼可以通過獨熱編碼等方式,將類別型變數轉換為多個二元特徵,從而增加了模型的非線效能力和表達能力,從而提高了模型的效能。
  4. 降低複雜度:分類編碼可以將多個類別型變數轉換為多個數值型變數,從而降低了模型的複雜度。這有利於減少模型的過擬合,提高模型的泛化能力。
  5. 處理不平衡類別:分類編碼可以通過生成額外的特徵或者使用其他技術來處理不平衡類別的資料。
  6. 去除噪聲和冗餘特徵:分類編碼可以通過刪除不相關或冗餘的特徵來減少資料的噪聲和冗餘,從而提高資料的質量和模型的效能。

3. 總結

本篇介紹了兩種編碼方式,順序編碼(OrdinalEncoder)和獨熱編碼(OneHotEncoder),但scikit-learn庫提供的編碼方式並不只有這兩種。

還有目標編碼(TargetEncoder),標籤編碼(LabelEncoder)等等,可以參考官方檔案中的使用方法,在合適的場景中使用。