一日一学--如何对数值型特征进行分桶
點(diǎn)擊上方“算法猿的成長“,關(guān)注公眾號,選擇加“星標(biāo)“或“置頂”
總第 120 篇文章,本文大約 1200 字,閱讀大約需要 3?分鐘
今天這篇文章主要是介紹在特征工程中,對數(shù)值型特征進(jìn)行分桶操作的方法。
簡介
分桶是離散化的常用方法,將連續(xù)型特征離線化為一系列 0/1 的離散特征;
當(dāng)數(shù)值特征跨越不同的數(shù)量級的時候,模型可能會只對大的特征值敏感,這種情況可以考慮分桶操作。
分桶操作可以看作是對數(shù)值變量的離散化,之后通過二值化進(jìn)行 one-hot 編碼。
分桶的數(shù)量和寬度可以根據(jù)業(yè)務(wù)領(lǐng)域的經(jīng)驗(yàn)來指定,但也有一些常規(guī)的做法:
等距分桶。每個桶的寬度是固定的,即值域范圍是固定的,比如是 0-99,100-199,200-299等;這種適合樣本分布比較均勻的情況,避免出現(xiàn)有的桶的數(shù)量很少,而有的桶數(shù)量過多的情況;
等頻分桶,也稱為分位數(shù)分桶。也就是每個桶有一樣多的樣本,但可能出現(xiàn)數(shù)值相差太大的樣本放在同個桶的情況;
模型分桶。使用模型找到最佳分桶,比如聚類,將特征分成多個類別,或者樹模型,這種非線性模型天生具有對連續(xù)型特征切分的能力,利用特征分割點(diǎn)進(jìn)行離散化。
分桶的優(yōu)點(diǎn):
分桶后得到的稀疏向量,內(nèi)積乘法運(yùn)算速度更快,計(jì)算結(jié)果更方便存儲;
對異常數(shù)據(jù)有很強(qiáng)的魯棒性
需要注意的是:
要讓桶內(nèi)的屬性取值變化對樣本標(biāo)簽的影響基本在一個不大的范圍,即不能出現(xiàn)單個桶內(nèi),樣本標(biāo)簽輸出變化很大的情況;
每個桶內(nèi)都有足夠的樣本,如果樣本太少,隨機(jī)性太大,不具有統(tǒng)計(jì)意義上的說服力;
每個桶內(nèi)的樣本進(jìn)行分布均勻;
等距分桶
對于等距分桶的操作:
當(dāng)數(shù)字跨越多個數(shù)量級時,最好用10個冪(或任何常數(shù)的冪)來分組:0-9、10-99、100-999、100-9999等。
容器寬度呈指數(shù)增長,從O(10)、O(100)到O(1000)和以上。要從計(jì)數(shù)映射到bin,取計(jì)數(shù)的log值。
對數(shù)變換是處理具有重尾分布的正數(shù)的有力工具。(重尾分布在尾部范圍內(nèi)的概率比高斯分布的概率大)。它將分布在高端的長尾壓縮成較短的尾部,并將低端擴(kuò)展成較長的頭部。
下面是展示的代碼例子:
數(shù)值較少的例子:
import numpy as np # 生成 20 個 0-99 之間的隨機(jī)整數(shù) small_counts?=?np.random.randint(0,?100,?20)# 進(jìn)行分箱操作, 通過對數(shù)據(jù)除以 10 分到 0-9 總共 9 個箱里, # 返回的結(jié)果就是對應(yīng)數(shù)據(jù)應(yīng)該劃分到的箱的編號 np.floor_divide(small_counts,?10)數(shù)據(jù)之間的間隔較大的例子:
# 構(gòu)造一個間隔更大的數(shù)組例子,可以通過取對數(shù) log10 來進(jìn)行分箱 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))等頻分桶
對于等頻分桶,也稱為按分位數(shù)分桶,為了計(jì)算分位數(shù)和映射數(shù)據(jù)到分位數(shù)箱,我們可以使用 Pandas 庫。pandas.DataFrame.quantile 和 pandas.Series.quantile 用于計(jì)算分位數(shù)。pandas.qcut 將數(shù)據(jù)映射到所需數(shù)量的分位數(shù)。
代碼例子如下:
large_counts = [296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971, 926, 122, 22222] # 將數(shù)據(jù)映射到所需數(shù)量的分位數(shù) pd.qcut(large_counts, 4, labels=False) # 計(jì)算指定分位數(shù)點(diǎn)的數(shù)據(jù) large_counts_series = pd.Series(large_counts) large_counts_series.quantile([0.25,?0.5,?0.75])參考文章:
淺談微視推薦系統(tǒng)中的特征工程
http://fe4ml.apachecn.org/#/docs/2.簡單數(shù)字的奇特技巧
精選AI文章
1.?機(jī)器學(xué)習(xí)入門學(xué)習(xí)資料推薦
2.初學(xué)者的機(jī)器學(xué)習(xí)入門實(shí)戰(zhàn)教程!
3.常用機(jī)器學(xué)習(xí)算法匯總比較(完)
4.特征工程之?dāng)?shù)據(jù)預(yù)處理(上)
5.實(shí)戰(zhàn)|手把手教你訓(xùn)練一個基于Keras的多標(biāo)簽圖像分類器
精選python文章
1.?Python 基礎(chǔ)入門--簡介和環(huán)境配置
2.?python版代碼整潔之道
3.?快速入門 Jupyter notebook
4.?Jupyter 進(jìn)階教程
5.?10個高效的pandas技巧
精選教程資源文章
1.?[資源分享] TensorFlow 官方中文版教程來了
2.?[資源]推薦一些Python書籍和教程,入門和進(jìn)階的都有!
3.?[Github項(xiàng)目推薦] 推薦三個助你更好利用Github的工具
4.?Github上的各大高校資料以及國外公開課視頻
5.?GitHub上有哪些比較好的計(jì)算機(jī)視覺/機(jī)器視覺的項(xiàng)目?
歡迎關(guān)注我的微信公眾號--算法猿的成長,或者掃描下方的二維碼,大家一起交流,學(xué)習(xí)和進(jìn)步!
?如果覺得不錯,在看、轉(zhuǎn)發(fā)就是對小編的一個支持!
總結(jié)
以上是生活随笔為你收集整理的一日一学--如何对数值型特征进行分桶的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库:SQL 语法速成手册,建议新手收
- 下一篇: 高并发 多线程批量ping工具 nbpi