浅析 Python 中数据离散化的实现方式
一、什么是数据离散化在数据分析和机器学习的预处理阶段数据离散化是一个非常核心且常用的操作。简单来说数据离散化就是将连续的数值型数据按照一定的规则划分成若干个离散的区间 / 类别。连续数据身高175.5cm、年龄28 岁、薪资15000 元离散数据青年、中年、高薪、低薪、[18-30]、[31-50]为什么要做离散化简化模型减少连续值的计算量降低模型复杂度提升效果有效处理异常值避免极端数据干扰模型适配算法决策树、朴素贝叶斯等算法更擅长处理离散特征业务解读离散后的特征更符合业务逻辑如用户分层、价格分段二、Python 实现数据离散化的常用方式本文基于Pandas库实现这是 Python 数据分析最主流的工具内置了cut()和qcut()两个专门用于离散化的函数同时也支持自定义分箱逻辑。环境准备python运行import pandas as pd import numpy as np我们先生成一组测试数据模拟用户年龄python运行# 生成100个18-70岁的随机年龄 np.random.seed(666) # 固定随机种子结果可复现 ages np.random.randint(18, 70, size100) df pd.DataFrame({age: ages})三、方式 1等宽分箱pd.cut等宽分箱按照固定的数值区间宽度划分数据每个区间的长度相同。核心函数pd.cut()用法 1指定分箱个数python运行# 将年龄分成4个等宽区间 df[age_cut] pd.cut(df[age], bins4) print(df[age_cut].value_counts().sort_index())用法 2自定义分箱边界最常用python运行# 自定义区间18-3030-4040-5050-70 bins [18, 30, 40, 50, 70] df[age_cut_custom] pd.cut(df[age], binsbins) # 给区间打标签更直观 labels [青年, 中青年, 中年, 中老年] df[age_cut_label] pd.cut(df[age], binsbins, labelslabels)等宽分箱特点区间宽度固定容易受异常值影响适合分布均匀的数据四、方式 2等频分箱pd.qcut等频分箱按照数据数量划分保证每个区间内的数据样本数量基本一致。核心函数pd.qcut()python运行# 等频分成4组每组数据量接近 df[age_qcut] pd.qcut(df[age], q4, labels[Q1, Q2, Q3, Q4]) print(df[age_qcut].value_counts())等频分箱特点每个分组样本数相近不受极端值影响适合数据分布不均匀的场景机器学习中最常用的离散化方式五、方式 3自定义函数离散化灵活业务规则当业务有明确规则时如18 岁以下未成年18-35 青年等可以用apply 自定义函数实现。python运行def age_discrete(age): if age 30: return 青年 elif age 45: return 中年 elif age 60: return 壮年 else: return 老年 # 应用函数 df[age_apply] df[age].apply(age_discrete)适用场景业务规则明确区间不固定、非对称需要高度定制化的离散逻辑六、方式 4基于阈值 / 独热编码One-Hot离散化在特征工程中我们常将离散化后的特征转为独热编码方便模型训练。python运行# 先分箱 bins [18, 30, 45, 60, 70] df[age_bin] pd.cut(df[age], binsbins) # 转为独热编码 age_dummies pd.get_dummies(df[age_bin], prefixage) df_new pd.concat([df, age_dummies], axis1)这是建模前最标准的离散化 编码流程。七、四种方式对比总结表格方式函数 / 方法特点适用场景等宽分箱pd.cut (固定 bins)区间宽度相同简单直观数据分布均匀、无明显异常值等频分箱pd.qcut (q 份数)每组样本数相近抗干扰数据倾斜、机器学习预处理自定义函数applydef高度灵活贴合业务规则业务定义明确的分段独热编码离散get_dummies离散→编码直接用于模型训练建模前特征工程八、完整可运行代码python运行import pandas as pd import numpy as np # 1. 生成测试数据 np.random.seed(666) ages np.random.randint(18, 70, size100) df pd.DataFrame({age: ages}) # 2. 等宽分箱 bins [18, 30, 40, 50, 70] df[age_cut] pd.cut(df[age], binsbins, labels[青年, 中青年, 中年, 中老年]) # 3. 等频分箱 df[age_qcut] pd.qcut(df[age], q4, labels[Q1, Q2, Q3, Q4]) # 4. 自定义函数离散 def age_func(age): if age 30: return 青年 elif age 45: return 中年 else: return 老年 df[age_apply] df[age].apply(age_func) # 5. 独热编码 df_dummies pd.get_dummies(df[age_cut], prefixage) # 展示结果 print(离散化结果预览) print(df.head(10))九、总结数据离散化是数据预处理的关键步骤能简化数据、提升模型效果、增强业务可解释性。Python 中首选 Pandas 实现cut等宽、qcut等频最常用。业务优先用自定义函数建模优先用qcut独热编码。没有绝对最优的离散方式根据数据分布和业务需求选择。本文适合人群数据分析初学者机器学习入门者正在做特征工程的开发人员
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2479701.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!