資料的預處理是資料分析,或者機器學習訓練前的重要步驟。
通過資料預處理,可以
本篇介紹的分類編碼處理,主要用於將類別型資料轉換為可以用於分析或機器學習的形式。
類別型資料是指具有離散、不連續取值的資料,例如性別(男/女)、等級(優/良/中/差)之類資料。
對這些資料進行適當的編碼,可以提高資料處理效率和準確度。
分類編碼的原理比較簡單,常用的兩種是順序編碼和獨熱編碼。
順序編碼很好理解,就是按照順序給離散的資料編碼,比如下面成績和班級資訊的資料:
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.]])
這樣,編碼後的數位的順序就能和中文所代表的含義對應起來了。
上面範例中的成績等級和班級資訊都有順序,如果對沒有順序含義的資訊進行順序編碼的話,
就會賦予給資訊新增了順序的含義,對於後續演演算法的應用可能會產生影響。
這時,就可以用獨熱編碼的方式來處理,比如對於下面的科目資訊:
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.]陣列等等。
科目資訊之間不存在順序。
分類編碼是資料探勘和機器學習領域中非常重要的一個環節,主要的作用有:
本篇介紹了兩種編碼方式,順序編碼(OrdinalEncoder
)和獨熱編碼(OneHotEncoder
),但scikit-learn
庫提供的編碼方式並不只有這兩種。
還有目標編碼(TargetEncoder
),標籤編碼(LabelEncoder
)等等,可以參考官方檔案中的使用方法,在合適的場景中使用。