點擊上方“算法猿的成長“,關注公衆號,選擇加“星標“或“置頂”
總第 120 篇文章,本文大約 1200 字,閱讀大約需要 3 分鐘
今天這篇文章主要是介紹在特徵工程中,對數值型特徵進行分桶操作的方法。
簡介
分桶是離散化的常用方法,將連續型特徵離線化爲一系列 0/1 的離散特徵;
當數值特徵跨越不同的數量級的時候,模型可能會只對大的特徵值敏感,這種情況可以考慮分桶操作。
分桶操作可以看作是對數值變量的離散化,之後通過二值化進行 one-hot 編碼。
分桶的數量和寬度可以根據業務領域的經驗來指定,但也有一些常規的做法:
等距分桶。每個桶的寬度是固定的,即值域範圍是固定的,比如是 0-99,100-199,200-299等;這種適合樣本分佈比較均勻的情況,避免出現有的桶的數量很少,而有的桶數量過多的情況;
等頻分桶,也稱爲分位數分桶。也就是每個桶有一樣多的樣本,但可能出現數值相差太大的樣本放在同個桶的情況;
模型分桶。使用模型找到最佳分桶,比如聚類,將特徵分成多個類別,或者樹模型,這種非線性模型天生具有對連續型特徵切分的能力,利用特徵分割點進行離散化。
分桶的優點:
分桶後得到的稀疏向量,內積乘法運算速度更快,計算結果更方便存儲;
對異常數據有很強的魯棒性
需要注意的是:
要讓桶內的屬性取值變化對樣本標籤的影響基本在一個不大的範圍,即不能出現單個桶內,樣本標籤輸出變化很大的情況;
每個桶內都有足夠的樣本,如果樣本太少,隨機性太大,不具有統計意義上的說服力;
每個桶內的樣本進行分佈均勻;
等距分桶
對於等距分桶的操作:
當數字跨越多個數量級時,最好用10個冪(或任何常數的冪)來分組:0-9、10-99、100-999、100-9999等。
容器寬度呈指數增長,從O(10)、O(100)到O(1000)和以上。要從計數映射到bin,取計數的log值。
對數變換是處理具有重尾分佈的正數的有力工具。(重尾分佈在尾部範圍內的概率比高斯分佈的概率大)。它將分佈在高端的長尾壓縮成較短的尾部,並將低端擴展成較長的頭部。
下面是展示的代碼例子:
數值較少的例子:
import numpy as np
# 生成 20 個 0-99 之間的隨機整數
small_counts = np.random.randint(0, 100, 20)
# 進行分箱操作, 通過對數據除以 10 分到 0-9 總共 9 個箱裏,
# 返回的結果就是對應數據應該劃分到的箱的編號
np.floor_divide(small_counts, 10)
數據之間的間隔較大的例子:
# 構造一個間隔更大的數組例子,可以通過取對數 log10 來進行分箱
large_counts = [296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222]
np.floor(np.log10(large_counts))
等頻分桶
對於等頻分桶,也稱爲按分位數分桶,爲了計算分位數和映射數據到分位數箱,我們可以使用 Pandas
庫。pandas.DataFrame.quantile
和 pandas.Series.quantile
用於計算分位數。pandas.qcut
將數據映射到所需數量的分位數。
代碼例子如下:
large_counts = [296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222]
# 將數據映射到所需數量的分位數
pd.qcut(large_counts, 4, labels=False)
# 計算指定分位數點的數據
large_counts_series = pd.Series(large_counts)
large_counts_series.quantile([0.25, 0.5, 0.75])
參考文章:
http://fe4ml.apachecn.org/#/docs/2.簡單數字的奇特技巧
精選AI文章
1. 機器學習入門學習資料推薦
5.實戰|手把手教你訓練一個基於Keras的多標籤圖像分類器
精選python文章
4. Jupyter 進階教程
精選教程資源文章
1. [資源分享] TensorFlow 官方中文版教程來了
2. [資源]推薦一些Python書籍和教程,入門和進階的都有!
3. [Github項目推薦] 推薦三個助你更好利用Github的工具
5. GitHub上有哪些比較好的計算機視覺/機器視覺的項目?
歡迎關注我的微信公衆號--算法猿的成長,或者掃描下方的二維碼,大家一起交流,學習和進步!
如果覺得不錯,在看、轉發就是對小編的一個支持!