數據的預處理是數據分析,或者機器學習訓練前的重要步驟。通過數據預處理,可以 提高數據質量,處理數據的缺失值、異常值和重覆值等問題,增加數據的準確性和可靠性 整合不同數據,數據的來源和結構可能多種多樣,分析和訓練前要整合成一個數據集 提高數據性能,對數據的值進行變換,規約等(比如無量綱化),讓演算法更加 ...
數據的預處理是數據分析,或者機器學習訓練前的重要步驟。
通過數據預處理,可以
- 提高數據質量,處理數據的缺失值、異常值和重覆值等問題,增加數據的準確性和可靠性
- 整合不同數據,數據的來源和結構可能多種多樣,分析和訓練前要整合成一個數據集
- 提高數據性能,對數據的值進行變換,規約等(比如無量綱化),讓演算法更加高效
本篇介紹的離散化處理,是一種數據預處理技術,用於將連續的、連續的數值型數據轉換為離散的、分類的標簽。
這種處理方式主要應用於一些需要轉化為分類問題的數據集,如機器學習和數據挖掘中的輸入變數。
1. 原理
離散化的原理主要是通過將連續的數值屬性轉化為離散的數值屬性來實現數據的轉化。
這個過程通常會採用分箱(Binning)的方法。
在分箱中,原始數據的值被分配到一些離散的、預定義的類別中,這些類別通常被稱為“箱子”或“桶”,
箱子的數量和大小可以根據數據的分佈和實際需求進行調整。
我們平時常用的離散化處理有兩種:
1.1. 二值化處理
二值化就是根據閾值將一系列連續的數據分為兩種類別。
二值化處理的實際應用場景很多,比如垃圾郵件的判定,信用卡欺詐的判定,還有各種的醫療檢測結果(陰性陽性)。
使用scikit-learn
中的Binarizer
對數據進行二值化處理:
from sklearn import preprocessing as pp
import numpy as np
data = np.random.randint(0, 100, size=(3, 3))
b = pp.Binarizer(threshold=80)
result = b.fit_transform(data)
print("原始數據: {}".format(data))
print("二值化後數據: {}".format(result))
# 運行結果
原始數據:
[[12 28 84]
[ 2 18 81]
[74 92 74]]
二值化後數據:
[[0 0 1]
[0 0 1]
[0 1 0]]
Binarizer
的參數threshold
就是分類的閾值。
上面的例子中,threshold=80
,則大於80的值為1
,小於等於80的值為0
。
1.2. K-bins處理
K-bins
離散化處理則可以控制數據分成多個類別。
它在實際中的應用比如電商領域,根據用戶的購買行為將用戶分為不同的消費類別;在統計學習成績時,按照成績分為不同的等級(優/良/中/差)等等。
這些場景下,不能簡單的進行二值化,需要離散化為多個分類。
對於K-bins
離散化,可以使用scikit-learn
中的KBinsDiscretizer
。
data = np.random.randint(0, 100, 10).reshape(-1, 1)
b = pp.KBinsDiscretizer(n_bins=3, encode="ordinal")
result = b.fit_transform(data)
print("原始數據: {}".format(data))
print("K-bins離散化後數據: {}".format(result))
# 運行結果
原始數據: [[12]
[82]
[19]
[32]
[81]
[84]
[92]
[25]
[61]
[31]]
K-bins離散化後數據: [[0.]
[2.]
[0.]
[1.]
[2.]
[2.]
[2.]
[0.]
[1.]
[1.]]
KBinsDiscretizer
的參數n_bins
表示分為幾類,上面的示例中設置分為了3類。
另一個參數encode
表示離散化後的數據編碼,上面的示例中"ordinal"
表示用順序的整數來編碼。
可以設置encode
為onehot
,使得離散化的數據變為獨熱編碼。
2. 作用
數據離散化的主要作用有:
- 降低計算量和複雜度:連續的數值數據轉化為離散的類別數據後,簡化了數據,從而降低計算量和複雜度,特別是在處理大規模數據集時效果更為顯著。
- 解決異常值和缺失值問題:將連續的數值數據中的異常值和缺失值進行合理的處理,從而避免對後續的影響。
- 提高模型的解釋性:連續的數值數據轉化為離散的類別數據後,使模型結果更加直觀和易於解釋。
- 剋服數據中的缺陷:將連續的數值數據轉化為離散的類別數據,能夠有效地剋服數據中隱藏的缺陷,使模型結果更加穩定。
- 提高演算法效率和精度:將連續的數值數據進行分段,並採用優化方法進行離散化處理,從而可以提高演算法的效率和精度。
當然,離散化處理簡化了數據,可能會導致原始數據中的一些細節信息的丟失。
其次,離散化處理可能會引入一些主觀性和不穩定性,因為分類的數量和大小通常是基於經驗和實際需求進行調整的,不同的決策可能會導致不同的結果。
3. 總結
總之,關註離散化處理給我們帶來的種種好處之時,在實際應用中也需要註意其局限性,如可能會造成數據的丟失和失真等問題。
因此,在具體的實踐中,需要根據實際情況和需求進行合理的選擇和應用。