机器学习 - 数据预处理中的 特征离散化 方法

简介: 在数据分析中,我们认为在某个范围内取值过于密集的特征认为是取值”连续“的特征。出于某些需求经常需要将这些”连续特征进行离散化“。本文介绍三种比较实用的数据离散化方法。本文介绍可供参考的三种特征离散化方法的Python实现。

可供参考的三种特征离散化方法


在数据分析中,我们认为在某个范围内取值过于密集的特征认为是取值”连续“的特征。出于某些需求经常需要将这些”连续特征进行离散化“。本文介绍三种比较实用的数据离散化方法。


李俊才的个人博客



方法1:尺度缩小法

这种方法是对于数值元素的一种简单粗暴的方法。离散化的目的不就是减少取值数目吗。那么好,只要把数据除以某个值,大数就变小数,抹掉小数位,自然取值个数就少了很多。很显然,这种离散化方法的特点在于对越小的数整合归并能力越强。

经常我们将数据读取为一个二维DataFrame结构的表,而需要离散化的是该DataFrame对象中的一列。以下该方法离散化的源代码。

defscaling(DF, feature, scale, submit=True):
"""    数据尺度缩小法离散化    Parameters    -------     - DF:      DataFrame,假设我们需要离散化的是DF种索引为feature的那一列     - feature: str,特征名,将用作从DF中索引该列特征的有序所有取值     - scale:   该列特征数值的放缩尺度。     - submit:  bool,离散化后直接提交更改到DF中的该特征    """dis_feature=DF[feature].copy()
dis_feature=np.array(np.floor(np.array(DF[feature]/scale)))
ifsubmit:
DF[feature] =dis_featurereturndis_feature

方法2:按数值区间分割数据法(使用pandas.cut())

经常我们将数据读取为一个二维DataFrame结构的表,而需要离散化的是该DataFrame对象中的一列。以下该方法离散化的源代码。

defpd_cut(DF,feature,bins,submit=True):
"""    离散化备选方法2:    按数值区间分割数据离散化——先按照数据取值将数据分割成n组。    Parameters    ----------     - DF:      DataFrame,假设我们需要离散化的是DF种索引为feature的那一列     - feature: str,特征名,将用作从DF中索引该列特征的有序所有取值     - bins: 若为Series,则序列中数据元素各为分割点;             若为int,则特征值定义范围内的等宽bin数。x的范围在每一侧             都扩展了0.1%,以包括x的最小值和最大值。     - submit: bool,离散化后直接提交更改到self.DF中的该特征    """dis_feature=DF[feature].copy()
dis_feature=pd.cut(Feature,bins)
ifsubmit:
self.DF[feature] =dis_featurereturndis_feature

方法3:等元素个数分割法(使用pandas.qcut())

经常我们将数据读取为一个二维DataFrame结构的表,而需要离散化的是该DataFrame对象中的一列。以下该方法离散化的源代码。

defpd_qcut(self,feature,q,submit=True,**kw):
"""    离散化备选方法3:    等元素个数分割数据——分割后每个存储组有相同元素个数。    Parameters    -------     - feature: str,特征名,将用作从DF中索引该列特征的有序所有取值     - q: 频数,int,也就是分割后的组数     - q_label: serial,分割后,必须用新的标签代表旧的数据,标签数目必                须和分割的频数对应一致     - submit: bool,离散化后直接提交更改到self.DF中的该特征    """ifkw.get('q_label') !=None:
q_label=kw.get('q_label')
else:
q_label=list(range(q))
dis_feature=self.DF[feature].copy()
dis_feature=pd.qcut(dis_feature,q,q_label,duplicates="drop") # duplicates="drop"表示如果bin边缘(每组的分位点处)不是唯一则丢弃非唯一变量ifsubmit:
self.DF[feature] =dis_featurereturndis_feature

使用作图法以对比DF中所有feature列离散前后的效果

直接上代码:

defbarchart_ax(discrete_df, title='各个特征取值数量统计', xlabel='特征名称', ylabel='特征的不同取值量', background_color="#EAEAF2", Batch1_color="#25AFF3"):
feature_values= []
x_text= []
forcindiscrete_df.columns[1:]:
x_text.append(c)
ct=discrete_df[c].duplicated(keep='first')
feature_values.append(len(ct[ct==False]))
batch1=feature_valuespylab.rcParams['figure.figsize'] = (19.0, 10.0)
plt.rcParams['font.sans-serif'] = ['KaiTi']
matplotlib.rcParams['axes.unicode_minus'] =Falsex=np.arange(len(x_text))
width=0.66fig, ax=plt.subplots()
rects=ax.bar(x-width/2, batch1, width, color=Batch1_color)                               
ax.patch.set_facecolor(background_color)  
ax.set_title(title, fontsize=26)     
ax.set_xlabel(xlabel, fontsize=22)   
ax.set_ylabel(ylabel, fontsize=22)  
ax.set_xticks(x)    
ax.set_xticklabels(x_text, fontsize=22)   
forrectinrects:
height=rect.get_height()
ax.annotate('{}'.format(height),      
xy=(rect.get_x() +rect.get_width() /2, height),
xytext=(0,3),      
textcoords="offset points",
ha='center', va='bottom')
plt.grid(linestyle="dotted",color="g")
plt.xticks(rotation=89)
fig.tight_layout()
plt.show()

案例:等待编写。

小结

importpandasaspdimportnumpyasnpclassdiscretization(object):
"""    离散化类:提供几种可供选择的离散化方法。    离散化就是将特征中多个不同的特征值用相对少的取值表示。    每种离散化方法一次工作中对特定的列(特征)进行离散化操作,返回被离散的列的离散化结果    如果最终需要获取完成所有特征离散化的DataFrame,则使用该类实例的DF属性(discretization.DF)即可    """def__init__(self,DataF):
"""        初始化:拷贝一份传入的DataFrame。        仅当各备选的离散化方法中,submit = True 时,将改变 self.DF 中该列特征的数据。        """self.DF=DataF.copy()
defscaling(self,feature,scale,submit=True):
"""        离散化备选方法1:        数据尺度缩小法离散化——该方法法通过将数值除以特定的数来进行离散化。        Parameters        -------         - feature: str,特征名,将用作从DF中索引该列特征的有序所有取值         - scale: 该列特征数值的放缩尺度。         - submit: bool,离散化后直接提交更改到self.DF中的该特征        """dis_feature=self.DF[feature].copy()
dis_feature=np.array(np.floor(np.array(self.DF[feature]/scale)))
ifsubmit:
self.DF[feature] =dis_featurereturndis_featuredefpd_cut(self,feature,bins,submit=True):
"""        离散化备选方法2:        按数值区间分割数据离散化——先按照数据取值将数据分割成n组。        Parameters        -------         - feature: str,特征名,将用作从DF中索引该列特征的有序所有取值         - bins: 若为Series,则序列中数据元素各为分割点;                 若为int,则特征值定义范围内的等宽bin数。x的范围在每一侧                 都扩展了0.1%,以包括x的最小值和最大值。         - submit: bool,离散化后直接提交更改到self.DF中的该特征        """dis_feature=self.DF[feature].copy()
dis_feature=pd.cut(dis_feature ,bins)
ifsubmit:
self.DF[feature] =dis_featurereturndis_featuredefpd_qcut(self,feature,q,submit=True,**kw):
"""        离散化备选方法3:        等元素个数分割数据离散化——分割后每个存储组有相同元素个数。        Parameters        -------         - feature: str,特征名,将用作从DF中索引该列特征的有序所有取值         - q: 频数,int,也就是分割后的组数         - q_label: serial,分割后,必须用新的标签代表旧的数据,标签数目必                    须和分割的频数对应一致         - submit: bool,离散化后直接提交更改到self.DF中的该特征        """ifkw.get('q_label') !=None:
q_label=kw.get('q_label')
else:
q_label=list(range(q))
dis_feature=self.DF[feature].copy()
dis_feature=pd.qcut(dis_feature,q,q_label,duplicates="drop") # duplicates="drop"表示如果bin边缘(每组的分位点处)不是唯一则丢弃非唯一变量ifsubmit:
self.DF[feature] =dis_featurereturndis_feature
目录
相关文章
|
1月前
|
机器学习/深度学习 存储 设计模式
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
94 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
|
1月前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
265 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
1月前
|
存储 分布式计算 MaxCompute
使用PAI-FeatureStore管理风控应用中的特征
PAI-FeatureStore 是阿里云提供的特征管理平台,适用于风控应用中的离线和实时特征管理。通过MaxCompute定义和设计特征表,利用PAI-FeatureStore SDK进行数据摄取与预处理,并通过定时任务批量计算离线特征,同步至在线存储系统如FeatureDB或Hologres。对于实时特征,借助Flink等流处理引擎即时分析并写入在线存储,确保特征时效性。模型推理方面,支持EasyRec Processor和PAI-EAS推理服务,实现高效且灵活的风险控制特征管理,促进系统迭代优化。
61 6
|
2月前
|
机器学习/深度学习 传感器 运维
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
本文探讨了时间序列分析中数据缺失的问题,并通过实际案例展示了如何利用机器学习技术进行缺失值补充。文章构建了一个模拟的能源生产数据集,采用线性回归和决策树回归两种方法进行缺失值补充,并从统计特征、自相关性、趋势和季节性等多个维度进行了详细评估。结果显示,决策树方法在处理复杂非线性模式和保持数据局部特征方面表现更佳,而线性回归方法则适用于简单的线性趋势数据。文章最后总结了两种方法的优劣,并给出了实际应用建议。
126 7
使用机器学习技术进行时间序列缺失数据填充:基础方法与入门案例
|
3月前
|
机器学习/深度学习 算法 UED
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
67 6
|
3月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
193 6
|
1月前
|
机器学习/深度学习 算法 网络安全
CCS 2024:如何严格衡量机器学习算法的隐私泄露? ETH有了新发现
在2024年CCS会议上,苏黎世联邦理工学院的研究人员提出,当前对机器学习隐私保护措施的评估可能存在严重误导。研究通过LiRA攻击评估了五种经验性隐私保护措施(HAMP、RelaxLoss、SELENA、DFKD和SSL),发现现有方法忽视最脆弱数据点、使用较弱攻击且未与实际差分隐私基线比较。结果表明这些措施在更强攻击下表现不佳,而强大的差分隐私基线则提供了更好的隐私-效用权衡。
52 14
|
2月前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
90 2
|
3月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
77 1
|
3月前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络