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

简介: 在数据分析中,我们认为在某个范围内取值过于密集的特征认为是取值”连续“的特征。出于某些需求经常需要将这些”连续特征进行离散化“。本文介绍三种比较实用的数据离散化方法。本文介绍可供参考的三种特征离散化方法的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
目录
相关文章
|
2月前
|
机器学习/深度学习 算法 数据可视化
机器学习模型中特征贡献度分析:预测贡献与错误贡献
本文将探讨特征重要性与特征有效性之间的关系,并引入两个关键概念:预测贡献度和错误贡献度。
227 3
|
26天前
|
机器学习/深度学习 数据采集 数据挖掘
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
因果推断方法为特征工程提供了一个更深层次的框架,使我们能够区分真正的因果关系和简单的统计相关性。这种方法在需要理解干预效果的领域尤为重要,如经济学、医学和市场营销。
52 1
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
|
10天前
|
机器学习/深度学习 数据采集 Python
从零到一:手把手教你完成机器学习项目,从数据预处理到模型部署全攻略
【10月更文挑战第25天】本文通过一个预测房价的案例,详细介绍了从数据预处理到模型部署的完整机器学习项目流程。涵盖数据清洗、特征选择与工程、模型训练与调优、以及使用Flask进行模型部署的步骤,帮助读者掌握机器学习的最佳实践。
35 1
|
29天前
|
机器学习/深度学习
如何用贝叶斯方法来解决机器学习中的分类问题?
【10月更文挑战第5天】如何用贝叶斯方法来解决机器学习中的分类问题?
|
1月前
|
机器学习/深度学习 算法 API
机器学习入门(六):分类模型评估方法
机器学习入门(六):分类模型评估方法
|
1月前
|
机器学习/深度学习 算法 搜索推荐
机器学习入门(四):距离度量方法 归一化和标准化
机器学习入门(四):距离度量方法 归一化和标准化
|
2月前
|
机器学习/深度学习 Python
验证集的划分方法:确保机器学习模型泛化能力的关键
本文详细介绍了机器学习中验证集的作用及其划分方法。验证集主要用于评估模型性能和调整超参数,不同于仅用于最终评估的测试集。文中描述了几种常见的划分方法,包括简单划分、交叉验证、时间序列数据划分及分层抽样划分,并提供了Python示例代码。此外,还强调了在划分数据集时应注意随机性、数据分布和多次实验的重要性。合理划分验证集有助于更准确地评估模型性能并进行有效调优。
|
30天前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
17天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
25天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
50 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

热门文章

最新文章

  • 1
    机器学习实战:房价预测项目
    201
  • 2
    强化学习(Reinforcement Learning, RL)** 是一种机器学习技术,其中智能体(Agent)通过与环境(Environment)交互来学习如何执行决策以最大化累积奖励。
    74
  • 3
    集成学习(Ensemble Learning)是一种机器学习技术,它通过将多个学习器(或称为“基学习器”、“弱学习器”)的预测结果结合起来,以提高整体预测性能。
    218
  • 4
    `sklearn.metrics`是scikit-learn库中用于评估机器学习模型性能的模块。它提供了多种评估指标,如准确率、精确率、召回率、F1分数、混淆矩阵等。这些指标可以帮助我们了解模型的性能,以便进行模型选择和调优。
    453
  • 5
    在机器学习和数据科学中,数据预处理是一个至关重要的步骤。数据规范化(或称为特征缩放)是预处理的一种常见技术,它可以帮助我们改进模型的性能。`sklearn.preprocessing`模块提供了多种数据规范化的方法,其中`StandardScaler`和`MinMaxScaler`是最常用的两种。
    88
  • 6
    在人工智能和机器学习的领域中,语音识别(Speech Recognition,SR)是一个重要的研究方向。它旨在将人类的语音转换为计算机可读的文本。
    103
  • 7
    OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
    119
  • 8
    驾驭大数据洪流:Pandas与NumPy在高效数据处理与机器学习中的核心作用
    83
  • 9
    探索机器学习在图像识别中的应用
    52
  • 10
    智能化运维:机器学习在故障预测和自动化修复中的应用
    65