数据离散化 - 等宽等频聚类离散 - Python代码

目录

等宽离散

等频离散

聚类离散

附录:

rolling_mean函数解释

cut函数解释

其他数据预处理方法


一些数据挖掘算法中,特别是某些分类算法(eg:ID3算法、Aprioroi算法等),要求数据是分类属性形式。因此常常需要将连续属性变换成分类属性,即离散化。

离散化就是在数据的取值范围内设定若干个离散的花粉店,将取值范围划分为一些离散化的区间,最后用不同的符号护着整数值代表落在每个区间中的数据值。所以离散化涉及两个过程:确定分类数&将连续属性值映射到n个分类值。

常用的离散化方法:等宽离散、等频离散和聚类离散(一维)。

 

等宽离散

将属性的值域从最小值到最大值分成具有相同宽度的n个区间,n由数据特点决定,往往是需要有业务经验的人进行评估。

代码实现:

#-*- coding:utf-8 -*-
#数据离散化-等宽离散
import pandas as pddatafile = u'E:\\pythondata\\hk04.xlsx'
data = pd.read_excel(datafile)
data = data[u'回款金额'].copy()
k = 5 #设置离散之后的数据段为5#等宽离散
d1 = pd.cut(data,k,labels = range(k))#将回款金额等宽分成k类,命名为0,1,2,3,4,5,data经过cut之后生成了第一列为索引,第二列为当前行的回款金额被划分为0-5的哪一类,属于3这一类的第二列就显示为3def cluster_plot(d,k):import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize = (12,4))for j in range(0,k):plt.plot(data[d==j], [j for i in d[d==j]],'o')plt.ylim(-0.5, k-0.5)return pltcluster_plot(d1, k).show()

离散结果:

由这个离散结果我们可以直观的看出等宽离散的缺点,其缺点在于对噪点过于敏感,倾向于不均匀的把属性值分布到各个区间,导致有些区间的数值极多,而有些区间极少,严重损坏离散化之后建立的数据模型。

 

等频离散

将相同数量的记录放在每个区间,保证每个区间的数量基本一致。

代码实现:

#-*- coding:utf-8 -*-
#数据离散化-等频离散
import pandas as pddatafile = u'E:\\pythondata\\hk04.xlsx'
data = pd.read_excel(datafile)
data = data[u'回款金额'].copy()
k = 5 #设置离散之后的数据段为5#等频率离散化
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1]
w[0] = w[0]*(1-1e-10)
d2 = pd.cut(data, w, labels = range(k))def cluster_plot(d,k):import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize = (12,4))for j in range(0,k):plt.plot(data[d==j], [j for i in d[d==j]],'o')plt.ylim(-0.5, k-0.5)return pltcluster_plot(d2, k).show()

离散结果:

由离散结果看出,等频离散不会像等宽离散一样,出现某些区间极多或者极少的情况。但是根据等频离散的原理,为了保证每个区间的数据一致,很有可能将原本是相同的两个数值却被分进了不同的区间,这对最终模型的损坏程度一点都不亚于等宽离散。

 

聚类离散

一维聚类离散包括两个过程:通过聚类算法(K-Means算法)将连续属性值进行聚类,处理聚类之后的到的k个簇,得到每个簇对应的分类值(类似这个簇的标记)。

代码实现:

#-*- coding:utf-8 -*-
#数据离散化-聚类离散
import pandas as pddatafile = u'E:\\pythondata\\hk04.xlsx'
data = pd.read_excel(datafile)
data = data[u'回款金额'].copy()
k = 5 #设置离散之后的数据段为5#聚类离散
from sklearn.cluster import KMeanskmodel = KMeans(n_clusters = k, n_jobs = 4)#n_jobs是并行数,一般等于CPU数
kmodel.fit(data.reshape((len(data), 1)))
c = pd.DataFrame(kmodel.cluster_centers_, columns=list('a')).sort_values(by='a')
#rolling_mean表示移动平均,即用当前值和前2个数值取平均数,
#由于通过移动平均,会使得第一个数变为空值,因此需要使用.iloc[1:]过滤掉空值。
w = pd.rolling_mean(c, 2).iloc[1:]#此处w=[2174.1003996693553, 8547.46386803177, 22710.538501243103, 48516.861774600904]
w = [0] + list(w[0]) + [data.max()]#把首末边界点加上,首边界为0,末边界为data的最大值120000,此处w=[0, 2174.1003996693553, 8547.46386803177, 22710.538501243103, 48516.861774600904, 120000.0]
d3 = pd.cut(data, w, labels = range(k))#cut函数实现将data中的数据按照w的边界分类。def cluster_plot(d,k):import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize = (12,4))for j in range(0,k):plt.plot(data[d==j], [j for i in d[d==j]],'o')plt.ylim(-0.5, k-0.5)return pltcluster_plot(d3, k).show()

离散结果:

三种离散化方法中,最得本宫心意的便是最后这个聚类离散,但是即便是这般如花似玉,也有她的弊端:无法自己学习得知离散后簇的个数,依然需要内阁大学士来决定。

 

附录:

rolling_mean函数解释

pandas.rolling_mean(arg, window, min_periods=None, freq=None, center=False, how=None, **kwargs)

rolling_mean函数表示通过移动窗口求平均值,即用当前值和前[window]个数值取平均数,得到新的数值。

import pandas as pddata = [3, 60, 83, 100, 52, 36]#源数据
data = pd.DataFrame(data).sort_values(0)  
w2 = pd.rolling_mean(data, 2)#设置移动窗口为2,即用当前值和前2个数值取平均数
w3 = pd.rolling_mean(data, 3)#用当前值和前3个数值取平均数
print("源数据:\n", data)
print("移动窗口数为2:\n", w2)
print("移动窗口数为3:\n", w3)

运行结果:

源数据:0
0    3
5   36
4   52
1   60
2   83
3  100
移动窗口数为2:0
0   NaN
5  19.5
4  44.0
1  56.0
2  71.5
3  91.5
移动窗口数为3:0
0        NaN
5        NaN
4  30.333333
1  49.333333
2  65.000000
3  81.000000

rolling的一系列函数中,除了rolling_mean(移动窗口的均值),还有rolling_median(移动窗口的中位数)、rolling_var (移动窗口的方差)、rolling_std (移动窗口的标准差)、rolling_cov (移动窗口的协方差)、rolling_sum (移动窗口的和)、rolling_min (移动窗口的最小值)、rolling_max (移动窗口的最大值)、rolling_corr (移动窗口的相关系数)、rolling_count (计算各个窗口中非NA观测值的数量)。最常用的还是rolling_mean了,作用类似时间序列中提到的移动平滑。

 

cut函数解释

cut()函数可以将一个数组中的数据切分成几个部分。两种用法:可以设置分类的边界,也可以仅规定分类后的个数。 cut([被分割的数据],[将数据分为几个部分])

import pandas as pddata = [3, 60, 83, 100, 52, 36]#源数据
w = [0, 25, 50, 75, 100]#规定了分类的边界
v = 4 #仅规定分类的个数,不规定边界值
data_cut1 = pd.cut(data, w)
data_cut2 = pd.cut(data, v)
print("规定了分类的边界:\n", data_cut1)
print("\n规定了分类的个数:\n", data_cut2)

运行结果:

规定了分类的边界:[(0, 25], (50, 75], (75, 100], (75, 100], (50, 75], (25, 50]]
Categories (4, interval[int64]): [(0, 25] < (25, 50] < (50, 75] < (75, 100]]规定了分类的个数:[(2.903, 27.25], (51.5, 75.75], (75.75, 100.0], (75.75, 100.0], (51.5, 75.75], (27.25, 51.5]]
Categories (4, interval[float64]): [(2.903, 27.25] < (27.25, 51.5] < (51.5, 75.75] < (75.75, 100.0]]

 

其他数据预处理方法

拉格朗日插值法补充缺失值

清洗重复数据

数据预处理 - 归一化与标准化

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1444. 切披萨的方案数(DP)

1. 题目 给你一个 rows x cols 大小的矩形披萨和一个整数 k &#xff0c;矩形包含两种字符&#xff1a; ‘A’ &#xff08;表示苹果&#xff09;和 ‘.’ &#xff08;表示空白格子&#xff09;。 你需要切披萨 k-1 次&#xff0c;得到 k 块披萨并送给别人。 切披萨的每一刀…

C#动态调用Web服务的3种方法

我们在开发C# WinForm时&#xff0c;有时会调用Web服务&#xff0c;服务是本地的当前好办&#xff0c;只要在Project中的Web References中引入就可以在代码中直接创建一个Web服务对象来引用&#xff0c;其实其原理是C#帮你自动创建客户端代理类的方式调用WebService&#xff0c…

合并数据 - 方法总结(concat、append、merge、join、combine_first)- Python代码

描述 分析一个业务的时候往往涉及到很多数据&#xff0c;比如企业融资信息、投资机构信息、行业标签、招聘数据、政策数据等&#xff0c;这些数据分别存储在不同的表中。通过堆叠合并和主键合并等多种合并方式&#xff0c;可以将这些表中需要的数据信息合并在一张表中供分析使…

LeetCode 592. 分数加减运算(字符串+最大公约数)

1. 题目 给定一个表示分数加减运算表达式的字符串&#xff0c;你需要返回一个字符串形式的计算结果。 这个结果应该是不可约分的分数&#xff0c;即最简分数。 如果最终结果是一个整数&#xff0c;例如 2&#xff0c;你需要将它转换成分数形式&#xff0c;其分母为 1。 所以在…

18、Linux下编程风格

在前面曾总结过微软环境下编程的规范【1】&#xff0c;但是在linux下&#xff0c;没有自动补起&#xff0c;以及没有像VS那样高级好用的可视化开发工具&#xff0c;如果变量&#xff0c;函数定义太复杂&#xff0c;敲的也累&#xff0c;下面总结linux下编程风格&#xff0c;资料…

获取数据 - 将Excel文件读入矩阵matrix中 - Python代码

机器学习中&#xff0c;很多算法的计算逻辑是基于数学的&#xff0c;免不了求特征值和特征向量这种事情&#xff0c;因此&#xff0c;在数据预处理的时候&#xff0c;将数据源中的数据转储成矩阵格式是很有必要的。 原数据&#xff1a; 代码&#xff1a; import numpy as np…

LeetCode 713. 乘积小于K的子数组(滑动窗口)

1. 题目 给定一个正整数数组 nums。 找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums [10,5,2,6], k 100 输出: 8 解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,5,2] 并不是乘积小于…

Visual Studio 2010 调试 C 语言程序

转&#xff1a;http://woyouxian.net/c/using_visual_studio_write_pure_ansi_c_program.html 本篇文章讲述如何用微软的 Visual Studio 编写纯C语言程序&#xff0c;这里的纯C语言&#xff0c;指的是 ANSI C 语言。 要在 Visual Studio 里创建一个 ANSI C语言程序&#xff0c;…

字符串处理 - DataFrame文本数据的量化 - Python代码

在数据建模的过程中&#xff0c;对于文本数据&#xff0c;比如婚姻情况、性别、居住地等。这给只接受数值型的模型造成了很大的干扰&#xff0c;因此在数据采集到数据建模的过程中&#xff0c;我们需要一个过程&#xff0c;叫量化。 比如这样一个源数据&#xff1a; 收入身高…

Silverlight 4之旅(三)数据绑定(中)

在上篇文章中我们已经看过了绑定的基础知识&#xff0c;以及绑定数据源的选择问题。在本篇文章中我们看下绑定时Target的现实的问题。 自定义显示 很多时候我们的DataSource存储的数据并不可以直接用来显示&#xff0c;比如说我们对于Bool类型&#xff0c;需要显示为“是”或则…

LeetCode 第 28 场双周赛(505/2144,前23.6%)

文章目录1. 比赛结果2. 题目1. LeetCode 5420. 商品折扣后的最终价格 easy2. LeetCode 5422. 子矩形查询 medium3. LeetCode 5423. 找两个和为目标值且不重叠的子数组 medium4. LeetCode 5421. 安排邮筒 hard1. 比赛结果 两题选手&#x1f602;&#xff0c;前两题很水&#xf…

决策树模型 - (ID3算法、C4.5算法) - Python代码实现

目录 算法简介 信息熵(Entropy) 信息增益(Information gain) - ID3算法 信息增益率(gain ratio) - C4.5算法 源数据 代码实现 - ID3算法 代码实现 - C4.5算法 画决策树代码-treePlotter 算法简介 决策数(Decision Tree)在机器学习中也是比较常见的一种算法&#xff0c…

SGA介绍

以前一直看的马马虎虎&#xff0c;这次重新整理了下sga设置&#xff0c;组件等。当然这些涉及到了很多的参考&#xff0c;主要的参考的网址&#xff1a;http://www.hellodba.com/reader.php?ID104&langCNhttp://8xmax.blog.163.com/blog/static/1633631020084781125726/ h…

重复值处理 - 清洗 DataFrame 中的各种重复类型 - Python代码

目录 所有列是否完全重复 指定某一列是否重复 根据多列判断是否重复&#xff0c;防止误删数据 其他数据预处理方法 通过八爪鱼或者火车头等采集器从全网抓取的数据中&#xff0c;总会存在各种各样的重复数据&#xff0c;为保证数据在使用过程中的准确性&#xff0c;总要先进…

LeetCode 1480. 一维数组的动态和(前缀和)

1. 题目 给你一个数组 nums 。数组「动态和」的计算公式为&#xff1a;runningSum[i] sum(nums[0]…nums[i]) 。 请返回 nums 的动态和。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a;[1,3,6,10] 解释&#xff1a;动态和计算过程为 [1, 12, 123, …

bitmap 转 drawable

BitmapDrawable drawable new BitmapDrawable(bitmap); layout.setBackgroundDrawable(drawable);转载于:https://www.cnblogs.com/sode/archive/2011/08/10/2133799.html

机器学习与建模 - 聚类、分类、回归的区别

一句话概括&#xff1a; 1. 聚类&#xff1a;无监督学习&#xff0c;学习结果将产生几个集合&#xff0c;集合中的元素彼此相似&#xff1b; 2. 分类&#xff1a;有监督学习&#xff0c;学习结果将产生几个函数&#xff0c;通过函数划分为几个集合&#xff0c;数据对象是离散…

LeetCode 1481. 不同整数的最少数目(计数+排序+贪心)

1. 题目 给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素&#xff0c;请找出移除后数组中不同整数的最少数目。 示例 1&#xff1a; 输入&#xff1a;arr [5,5,4], k 1 输出&#xff1a;1 解释&#xff1a;移除 1 个 4 &#xff0c;数组中只剩下 5 一…

Silverlight带关闭动画的内容控件,可移动的内容控件(一)

本例给大家介绍两个自定义控件&#xff0c;一个有显示和关闭两种状态&#xff0c;在状态切换时有动画效果。另外一个是可以拖动的内容控件&#xff0c;可以制作能拖动的面板。 A&#xff0e;带关闭动画的内容控件。 .xaml View Code <ResourceDictionary xmlns"htt…

模型评价 - 判断数据模型拟合效果的三种方法

数据建模的目的就是获得从自变量映射到因变量的函数&#xff0c;在建模的探索过程中&#xff0c;不同的方式总会得出不同的函数模型&#xff0c;而这些函数大多是由一些参数构成的&#xff0c;比如 y f&#xff08; x; w0, w1, w2, w3, ...&#xff09;。 平方损失函数 为了选…