資料的預處理是資料分析,或者機器學習訓練前的重要步驟。
通過資料預處理,可以
本篇介紹的離散化處理,是一種資料預處理技術,用於將連續的、連續的數值型資料轉換為離散的、分類的標籤。
這種處理方式主要應用於一些需要轉化為分類問題的資料集,如機器學習和資料探勘中的輸入變數。
離散化的原理主要是通過將連續的數值屬性轉化為離散的數值屬性來實現資料的轉化。
這個過程通常會採用分箱(Binning)的方法。
在分箱中,原始資料的值被分配到一些離散的、預定義的類別中,這些類別通常被稱為「箱子」或「桶」,
箱子的數量和大小可以根據資料的分佈和實際需求進行調整。
我們平時常用的離散化處理有兩種:
二值化就是根據閾值將一系列連續的資料分為兩種類別。
二值化處理的實際應用場景很多,比如垃圾郵件的判定,信用卡欺詐的判定,還有各種的醫療檢測結果(陰性陽性)。
使用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
。
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
,使得離散化的資料變為獨熱編碼。
資料離散化的主要作用有:
當然,離散化處理簡化了資料,可能會導致原始資料中的一些細節資訊的丟失。
其次,離散化處理可能會引入一些主觀性和不穩定性,因為分類的數量和大小通常是基於經驗和實際需求進行調整的,不同的決策可能會導致不同的結果。
總之,關注離散化處理給我們帶來的種種好處之時,在實際應用中也需要注意其侷限性,如可能會造成資料的丟失和失真等問題。
因此,在具體的實踐中,需要根據實際情況和需求進行合理的選擇和應用。