數據的預處理是數據分析,或者機器學習訓練前的重要步驟。通過數據預處理,可以 提高數據質量,處理數據的缺失值、異常值和重覆值等問題,增加數據的準確性和可靠性 整合不同數據,數據的來源和結構可能多種多樣,分析和訓練前要整合成一個數據集 提高數據性能,對數據的值進行變換,規約等(比如無量綱化),讓演算法更加 ...
數據的預處理是數據分析,或者機器學習訓練前的重要步驟。
通過數據預處理,可以
- 提高數據質量,處理數據的缺失值、異常值和重覆值等問題,增加數據的準確性和可靠性
- 整合不同數據,數據的來源和結構可能多種多樣,分析和訓練前要整合成一個數據集
- 提高數據性能,對數據的值進行變換,規約等(比如無量綱化),讓演算法更加高效
本篇介紹的分類編碼處理,主要用於將類別型數據轉換為可以用於分析或機器學習的形式。
類別型數據是指具有離散、不連續取值的數據,例如性別(男/女)、等級(優/良/中/差)之類數據。
對這些數據進行適當的編碼,可以提高數據處理效率和準確度。
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. 作用
分類編碼是數據挖掘和機器學習領域中非常重要的一個環節,主要的作用有:
- 轉換數據格式:將類別型數據轉換為數值型數據,從而使其能夠被電腦處理和建模。
- 提高處理效率:分類編碼可以將多個類別型變數轉換為多個數值型變數,從而簡化了數據處理過程,提高了數據處理效率。
- 提高性能:分類編碼可以通過獨熱編碼等方式,將類別型變數轉換為多個二元特征,從而增加了模型的非線性能力和表達能力,從而提高了模型的性能。
- 降低複雜度:分類編碼可以將多個類別型變數轉換為多個數值型變數,從而降低了模型的複雜度。這有利於減少模型的過擬合,提高模型的泛化能力。
- 處理不平衡類別:分類編碼可以通過生成額外的特征或者使用其他技術來處理不平衡類別的數據。
- 去除雜訊和冗餘特征:分類編碼可以通過刪除不相關或冗餘的特征來減少數據的雜訊和冗餘,從而提高數據的質量和模型的性能。
3. 總結
本篇介紹了兩種編碼方式,順序編碼(OrdinalEncoder
)和獨熱編碼(OneHotEncoder
),但scikit-learn
庫提供的編碼方式並不只有這兩種。
還有目標編碼(TargetEncoder
),標簽編碼(LabelEncoder
)等等,可以參考官方文檔中的使用方法,在合適的場景中使用。